《Java核心技术(进阶)》

本文内容为学习笔记,用于个人知识点总结、复习。
原教学视频出自:中国大学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
语言环境资源.png
语言文件:message_zh_CN.properties.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
正则表达式处理代码.png
正则表达式替换处理代码.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
自上而下遍历XML代码(上).png
自上而下遍历XML代码(中).png
自上而下遍历XML代码(下).png
按名称解析XML代码.png
  • DOM写XML文件
DOM写XML文件代码(上).png
DOM写XML文件代码(中).png
DOM写XML文件代码(下).png
写XML文件结果示例.png

第二节(2) XML解析(SAX方法)

  • SAX
    1.采用事件/流模型来解析XML文档
    2.不想DOM加载整个文档,内存要求较低
    3.为一次性读取,不创建/不存储文档对象,很难同时访问文档中的多处数据
    4.推模型。每发现一个节点就引发一个事件,由我们编写处理程序。关键类:DefaultHandler
SAX的五个回调方法.png
SAX解析XML_XML文件示例.png
SAX解析XML代码(上).png
SAX解析XML代码(中上).png
SAX解析XML代码(中下).png
SAX解析XML代码(下).png

第二节(3) XML解析(Stax方法)

  • Stax
    1.流模型中的拉模型
    2.遍历文档,把感兴趣的部分从读取器中拉出,不引发事件,可以选择性地处理节点
    3.两套处理API
    - 基于指针:XMLStreamReader
    - 基于迭代器:XMLEventReader
Stax解析XML_XML文件示例.png
Stax基于指针解析XML代码(上).png
Stax基于指针解析XML代码(下).png
Stax基于迭代器解析XML代码(上).png

=====示例代码待补充(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
多线程互斥代码(上).png
多线程互斥代码(中).png
多线程互斥代码(下).png

第五章 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
UDP发送接收代码(下).png
UDP接收发送代码.png

第三节 Java TCP编程

TCP协议原理.png
TCP协议原理图.png
  • 服务端每接收一个客户端,就启动一个独立的线程与之对应。客户端或者服务端都可以选择关闭这对Socket通道
  • TCP类
    1.ServerSocket:服务器码头
    - 需要绑定port
    - 如多块网卡,需要绑定一个IP地址
    2.Socket:运输通道
    - 客户端需要绑定服务器的地址和Port
    - 客户端王Socket输入流写入数据,送到服务端
    - 客户端从Socket输出流去服务端过来的数据
    - 服务端反之亦然
TCP通讯服务端代码.png
TCP通讯客户端代码(上).png
TCP通讯客户端代码(下).png
TCP通讯多客户端服务端代码.png
TCP通讯多客户端服务端代码(worker类).png

第四节 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发送GET请求代码(上).png
HTTP发送GET请求代码(中).png
HTTP发送GET请求代码(下).png
HTTP发送POST请求代码(上).png

=====示例代码待补充(HTTP发送POST请求并接收respose代码)=====

第五节 Java HTTP编程(HttpClient)

  • JDK HttpClient
    1.HttpClient
    2.HttpRequest
    3.HttpResponse


    JDK版HttpClient发送GET请求代码.png
JDK版HttpClient发送POST请求代码.png
  • HttpComponents
    1.实现所有的HTTP方法:get/post/put/delete
    2.支持自动转向
    3.支持https协议
    4.支持代理服务器等
HttpComponents发送GET请求代码(上).png
HttpComponents发送GET请求代码(下).png
HttpComponents发送POST请求代码(上).png
HttpComponents发送POST请求代码(下).png
  • 进一步延伸
    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
JDBC查询代码(中).png
JDBC查询代码(下).png
JDBC更新代码(上).png
JDBC更新代码(中).png
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)
JDBC事务管理代码(上).png
JDBC事务管理代码(中).png
JDBC事务管理代码(下).png
  • PreparedStatement
    1.防止注入攻击
    2.防止繁琐的字符串拼接和错误
    3.直接设置对象而不需要转换为字符串
    4.PreparedStatement是用于编译速度相对Statement快很多


    JDBC_PreparedStatement代码(上).png
JDBC_PreparedStatement代码(下).png
  • ResultSetMetaData


    JDBC_ResultSetMetaData.png
JDBC_ResultSetMetaData代码(上).png
JDBC_ResultSetMetaData代码(下).png

第四节 数据库连接池

  • C3P0
  • Druid
    =====示例代码待补充(利用数据库连接池创建connection)=====

第八章 Java混合编程

第一节 Java调用Java程序(RMI)

=====内容待补充=====

第二节 Java调用C程序(JNI)

=====内容待补充=====

第三节 Java调用Javascript程序(nashorn)

=====内容待补充=====

第四节 Java调用Python程序(Jython)

=====内容待补充=====

第五节 Java调用Web Service

=====内容待补充=====

第六节 Java调用命令行

=====内容待补充=====

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。