本文内容为学习笔记,用于个人知识点总结、复习。
原教学视频出自:中国大学MOOC网 |《Java核心技术(进阶)》 ——陈良育
第一章 Maven
第一节 构建工具
- 构建工具功能:
1.自动帮程序员甄别和下载第三方库(jar)
2.完成整个项目编译(调用javac.exe)
3.完成整个项目单元测试流程(调用Junit工具)
4.完成项目打包(jar/war等格式,调用jar.exe)
... - 当前主要的Java构建工具:Maven,Gradle,Ivy,Buildr,Ant等
第二节 Maven概念和实战
- POM
1.XML格式
2.包含项目信息、以来信息、构建信息
3.构建信息:groupId、artifactId、version - Maven repository(仓库)
1.本地仓库(.m2文件夹)
2.远程仓库:中央仓库/阿里云仓库/谷歌仓库 - 基本目录结构
1.src
- main (-java/存放Java文件;-resources/存放程序资源文件)
- test(-java/存放测试程序;-resources/存放测试程序资源文件)
2.pom.xml - 创建Maven项目
1.直接创建Maven项目
2.设置信息:groupId:组织名,artifactId:作品(项目)名
1.创建普通Java Project,Convert to Maven Project
2.修改pom.xml,添加jar依赖 - Maven编译
1.Run As->Maven build
2.Goals:clean package(仅第一次配置)
3.BUILD SUCCESS - Maven构建生命周期
清理、编译、测试、打包、安装、部署
第二章 单元测试和JUnit
第一节 单元测试
- 软件测试分类
1.单元vs集成
2.白盒vs黑盒
3.自动vs手动
4.回归测试
5.压力测试
... - 单元测试
1.对最小可测试单元
2.对已知代码结构的测试,属于白盒测试 - 集成测试:最小单元->推进到单元间接口->集成为完整的软件系统
- 回归测试:确认修改没有引入新的错误或导致其他代码产生错误
第二节 JUnit
-
JUnit:一个Java语言的单元测试框架
JUnit代码.png - 也可用run as->maven test(可以批量执行所有test case)
第三章 高级文件处理
第一节 Java字符编码
- ASCII码
1.用1Byte(8 bits)存储一些常用符号,最多256个字符—>扩展编码(加字节)
2.常用:回车键(13,00001101),0(48,00110000),A(65,01000001),a(97,01100001) - Unicode编码(字符集)
1.目标:不断扩充,存储全世界所有字符
2.编码方案:UTF-8 java源文件编码,和外界的输入输出,兼容ASCII,边长(1-4字节);UTF-16 java程序内部,变长(2-4字节);UTF-32,变长(4个字节)要保证读写编码方案一致
查询编码方案代码.png
第二节 Java国际化编程
- i18n:一套软件,多个语言包
-
java.util.ResourceBundle:用于加载一个语言+国家语音包;
java.util.Locale 定义一个语言+国家
国际化编程代码.png
- Locale类
1.包括:语言(zh),国家/地区(CN)
2.方法
- getAvailableLocales():返回所有的可用Locale
- getDefault()返回默认的Locale - 语言文件.properties(K-V):ASCII+Unicode(\uxxxx):可以用native
2ascii.exe进行转码:native2ascii a.properties message_zh_CN.properties -
ResourceBundle
1.根据Locale要求,加载语言文件(properties文件)
2.存储语言集合中所有的K-V对
3.getString(String key)返回所对应的value
ResourceBundle语言文件查找顺序.png
第三节 Java高级字符串处理
-
正则表达式(规则表达式)
1.用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,用来认定一个字符串满足一定的规律。例如:^[A-Za-z]+$,代表一个字符串只能由26英文字母组成
2.作用
- 测试字符串内的模式
- 识别/替换文本
- 提取文本
3.java.util.regex包
正则表达式处理包方法.png
- 其他字符串操作
1.集合和字符串互转(Apache Commons Lang包):String.join/StringUtils.join(支持更多数据类型);
Arrays.asList
2.字符串转义(Apache Commons Lang包)
3.变量名字格式化(Google Guava第三方包)
4.从字符串到输入流(Apache Commons IO):将一个字符串转为一个输入流;输入流可以定义为Scanner,这是Online Judge(OJ平台)的实现原理
字符串转输入流代码.png
第四章 高级文件处理
第一节 XML简介
- XML作用:数据+含义,是用于传输数据,而不是显示数据(HTML)
- XML
1.可扩展标记语言:意义+数据
2.标签可自定义,具有自我描述性
3.纯文本,跨系统/平台/语言
4.W3W标准 -
常规语法
XML常规语法.png - XML扩展
1.DTD:定义XML文档结构
2.XSD:定义XML文档结构,采用XML编写
3.XSL:扩展样式表语言(XSL对XML等同于CSS对HTML)
第二节(1) XML解析(DOM方法)
- XML解析方法
1.树方法
- DOM:文档对象模型,擅长(小规模)读/写
2.流结构
- SAX:流机制解释器(推模式),擅长读
- Stax:流机制解释器(拉模式),擅长读 -
DOM
DOM解析XML结构树.png -
DOM解析方法
1.recursiveTraverse():自上而下进行访问
2.traverseBySearch():根据名称进行搜索
XML解析_XML文件示例.png
- DOM写XML文件
第二节(2) XML解析(SAX方法)
- SAX
1.采用事件/流模型来解析XML文档
2.不想DOM加载整个文档,内存要求较低
3.为一次性读取,不创建/不存储文档对象,很难同时访问文档中的多处数据
4.推模型。每发现一个节点就引发一个事件,由我们编写处理程序。关键类:DefaultHandler
第二节(3) XML解析(Stax方法)
- Stax
1.流模型中的拉模型
2.遍历文档,把感兴趣的部分从读取器中拉出,不引发事件,可以选择性地处理节点
3.两套处理API
- 基于指针:XMLStreamReader
- 基于迭代器:XMLEventReader
=====示例代码待补充(Stax基于迭代器解析XML后续)=====
- DOM/SAX/Stax是JDK自带的解析功能
- 第三方库:JDOM、DOM4J
第三节 JSON简介和解析
- JSON
1.JS对象表示法
2.轻量级数据交换格式
3.类似XML,更小更易解析
4.使用JS语法,但独立于编程语言 - 组成
1.JSONObject:{K-V,K-V,K-V,...}
2.JSONArray:[JSONObject,JSONObject,JSONObject,...]
3.[{K-V,K-V,...},{K-V,K-V,...},{K-V,K-V,...}] - JSON的JSON处理
1.org.json:JSON官方推荐解析类
2.GSON:Google出品
3.Jackson:号称最快的JSON处理器 - JSON主要用途
1.JSON生成
2.JSON解析
3.JSON校验
4.和Java Bean对象进行互解析
=====示例代码待补充(三种第三方包生成、解析、校验、Java Bean对象进行互解析)=====
- JSON和XML比较
1.都是数据交换格式,可读性强,可扩展性高
2.JSON:编码简单,转换方便,传输效率更高
3.XML更加注重标签和顺序
4.JSON会丢失信息XML->JSON会丢失顺序
第四章 高级文件处理(续)
第四节 图形图像简介及解析
=====内容待补充=====
第五节 条形码和二维码简介和解析
=====内容待补充=====
第六节 Docx简介和解析
=====内容待补充=====
第七节 表格文件简介和解析
=====内容待补充=====
第八节 PDF简介和解析
=====内容待补充=====
第五章 Java多线程和并发编程
第一节 多进程和多线程简介
第二节 Java多线程实现
- Java多线程创建
1.java.lang.Thread:线程继承Thread类,实现run方法
2.java.lang.Runnable接口:线程实现Runnabe接口,实现run方法 - Java多线程启动
1.start方法,会自动以新进程调用run方法
2.直接调用run方法,将变成串行执行
3.同一个线程,多次start会报错,只执行第一次start方法
4.多个线程启动,其启动的先后顺序是随机的
5.县城无需关闭,只要其run方法执行结束后,自动关闭
6.main函数(线程)可能早于新线程结束,整个程序并不终止
7.整个程序终止是等所有的线程都终止(包括main函数线程)
线程创建_继承Thread代码.png
线程创建_实现Runnable接口代码.png
实现Runnable的对象必须包装在Thread类里面,才可以启动 - Java多线程实现对比
1.Thread占据了父类的名额,不如Runnable方便
2.Thread类实现Runnable
3.Runnable启动时需要Thread类的支持
4.Runnable更容易实现多线程中资源共享 - 建议实现Runnable接口完成多线程
第三节 Java多线程信息共享
- 粗粒度:子线程与子线程、和main线程之间缺乏交流
- 细粒度:线程之间有信息交流通讯:通过共享变量达到信息共享
-
共享变量
1.static变量(内存中只有一份存储)
2.同一个Runnable类的成员变量
多线程信息共享问题.png - 多线程信息共享问题解决办法
1.采用volatile关键字修饰变量,保证不同线程对共享变量操作时的可见性
2.关键步骤加锁限制
- 互斥:某一个线程运行一个代码段(关键区),其他线程不能同时运行这个代码段
- 同步:多个线程的运行,必须按照某一种规定的先后顺序来运行
- 互斥是同步的一种特例
volatile共享变量代码(上).png
volatile共享变量代码(下).png - 互斥的关键字是synchronized
第五章 Java多线程和并发编程(续)
第五节 Java并发框架 Executor
=====内容待补充=====
第六节 Java并发框架Fork-Join
=====内容待补充=====
第七节 Java并发数据结构
=====内容待补充=====
第八节 Java并发协作控制(1)
=====内容待补充=====
第八节 Java并发协作控制(2)
=====内容待补充=====
第九节 Java定时任务执行
=====内容待补充=====
第六章 Java网络编程
第一节 网络基础知识
- 每个计算机设备上有多个网卡,每个网卡对应唯一一个MAC地址
- IP地址:每个网卡/机器都由一个或多个IP地址:ipconfig/ifconfig
- 端口prot:0-1023:OS占用;1024-65535:一般程序使用
- 两台机器通讯就是在IP+Port上进行的:netstat -an:查看网络通讯
- 公网(万维网/互联网)和内网(局域网)
1.网络是分层的
2.最外层是公网/互联网
3.底下的每层都是内网
4.ip地址可以在每个层次的网重用
5.tracert看当前机器和目标机器的访问中继 - 通讯协议:TCP(连接)和UDP(无连接)
第二节 Java UDP编程
- UDP
1发送方发送消息,如接受方在目的地,则接收成功。如果不在,则消息丢失
2.发送方无法得知是或否发送成功
3.简单,节省,经济 -
UDP相关类
1.DatagramSocket:通讯的数据管道
- send和receive方法
- 绑定一个IP和Port
3.DatagramPacket
- 集装箱:封装数据
- 地址标签:目的地IP+Port
UDP发送接收代码(上).png
第三节 Java TCP编程
- 服务端每接收一个客户端,就启动一个独立的线程与之对应。客户端或者服务端都可以选择关闭这对Socket通道
- TCP类
1.ServerSocket:服务器码头
- 需要绑定port
- 如多块网卡,需要绑定一个IP地址
2.Socket:运输通道
- 客户端需要绑定服务器的地址和Port
- 客户端王Socket输入流写入数据,送到服务端
- 客户端从Socket输出流去服务端过来的数据
- 服务端反之亦然
第四节 Java HTTP编程
- 网页访问
1.在浏览器输入URL地址
2.浏览器将连接到远程服务器上(IP+80Port)
3.请求下载HTML文件,放到本地临时文件夹中
4.在浏览器里显示 - HTTP:资源文件采用HTML编写,以URL形式对外提供
- HTTP访问方式
1.GET:从服务器获取资源到客户端
2.POST:从客户端向服务器发送数据 - Java HTTP编程(java.net包)
- URL类
- URLConnection类
1.获取资源的连接器
2.根据URL的openConnection()方法获得URLConnection
3.connect方法,建立和资源的联系通道
4.getInputStream方法,获取资源的内容
=====示例代码待补充(HTTP发送POST请求并接收respose代码)=====
第五节 Java HTTP编程(HttpClient)
-
JDK HttpClient
1.HttpClient
2.HttpRequest
3.HttpResponse
JDK版HttpClient发送GET请求代码.png
- HttpComponents
1.实现所有的HTTP方法:get/post/put/delete
2.支持自动转向
3.支持https协议
4.支持代理服务器等
- 进一步延伸
1.爬虫
2.自动刷票机器人
3.各类Web监控
4.Web测试
5....
第六章 Java网络编程(续)
第六节 Java NIO编程
=====内容待补充=====
第七节 Java AIO编程
=====内容待补充=====
第八节 Netty编程
=====内容待补充=====
第九节 邮件基础知识
=====内容待补充=====
第十节 Java Mail编程
=====内容待补充=====
第七章 Java数据库编程
第一节 数据库和SQL
DB(文件集合,类似.doc,.docx文件);DBMS(类似Offive/WPS)
-
DB分类
1.文本文件/二进制文件
2.Xls文件
3.Access
DB种类(续).png 表
1.表:table,实体
- 列:属性
- 行:数据(元组)
2.数据值域:数据取值范围
3.字段类型:int/double/datetime/varchar/...-
SQL
SQL语句示例.png
第二节 JDBC基本操作
-
Java SQL操作类库
Java SQL操作类库.png -
Java连接数据库操作步骤
1.构建连接(搭桥)
- 注册驱动,寻找材质,class.forName(“...”)
- 确认对岸目标,建桥Connection
2.执行操作(派个人过桥,提着篮子,去拿数据)
- Statement(执行者)
- ResultSet(结果集)
3.释放连接(拆桥)connection.close()
Java连接数据库示意图.png - Statement执行者类
1.使用executeQuery()执行select语句,返回结果放在ResultSet
2.使用executeUpdate()执行insert/update/delete,返回修改的行数
3.一个Statement对象一次只能执行一个命令 -
ResultSet结果对象
1.next()判断是否还有下一条记录
2.getInt/getString/getDouble/...
JDBC查询代码(上).png
- 注意事项
1.ResultSet不能多个做笛卡尔积连接(嵌套)
2.ResultSet不要超过百条
3.ResultSet不是一次加载所有结果数据
4.Connection需要及时close
5.Connection所用的jar包和数据库要匹配
第三节 JDBC高级操作
- 事务管理:把一系列操作作为单个逻辑工作单元执行,要么安全执行,要么完全不执行
1.关闭自动提交,实现多语句同一事物
2.connection.setAutoCommit(false)
3.connection.commit();提交事务
4.connection.rollback();回滚事务
5.保存点机制
- connection.setSavepoint()
- connection.rollback(Savepoint)
-
PreparedStatement
1.防止注入攻击
2.防止繁琐的字符串拼接和错误
3.直接设置对象而不需要转换为字符串
4.PreparedStatement是用于编译速度相对Statement快很多
JDBC_PreparedStatement代码(上).png
-
ResultSetMetaData
JDBC_ResultSetMetaData.png
第四节 数据库连接池
- C3P0
- Druid
=====示例代码待补充(利用数据库连接池创建connection)=====
第八章 Java混合编程
第一节 Java调用Java程序(RMI)
=====内容待补充=====
第二节 Java调用C程序(JNI)
=====内容待补充=====
第三节 Java调用Javascript程序(nashorn)
=====内容待补充=====
第四节 Java调用Python程序(Jython)
=====内容待补充=====
第五节 Java调用Web Service
=====内容待补充=====
第六节 Java调用命令行
=====内容待补充=====