Java
【java入门13】
JAVA SE、ME、EE
【java入门16】
JDK=JVM+核心类库+开发工具(javac,java,jdb,jhat内存分析工具)
JRE=JVM+核心类库+运行工具(java)
【运算符04】
Byte、short、char在运算的时候,都会先提升为int,再进行运算。
【运算符10】
&&和||是短路与/或,效率更高。左边能确定结果右边就不运行了。
【运算符12】
原码:二进制,最高位符号位。
反码:正数反码是本身,负数反码是符号位不变,其余位取反。(为了解决原码不能计算负数的问题出现的)
补码:正数补码是本身,负数补码是反码+1。
类似数轴,正原码+1是往右,负原码+1是往左。反码的话相当于统一了+1的前进方向。
反码的缺点是0有两种表示(全0和全1,表示±0),比如-4+7这种运算结果会差一。所以需要补码。补码还能多表示一个-128。
————————————————————
>>>无符号右移,向右移动,高位补0。
【循环判断06】
Case穿透:从第一个满足条件的位置开始,顺着执行内部语句,直到遇到break或者switch结束为止。可以用于省略重复的内部语句。
JDK12新特性可以使用case 1 -> {......},不用写break。一行代码可以省略大括号。1后面可以跟,2,3,4...多个值。
【数组01】
int[] a = new int[] {1,2,3,4,5}。简写可以省略new int[]。
求数组大小用a.length,没有括号。
【数组02】
直接打印一个double数组,地址为[D@776ec8df
[表示当前是一个数组。D表示double。@是间隔符。剩下的是真实地址值。
【数组04】
只明确元素个数,使用动态初始化。明确了具体数据,用静态初始化。
【数组09】
Java内存分配:堆、栈、方法区、本地方法栈、寄存器
栈:方法运行时使用的内存,比如main方法运行,进入方法栈中执行。
堆:存储对象或者数组,new来创建的,都存储在堆内存。
方法区:存储可以运行的class文件。
本地方法栈:JVM在使用操作系统功能的时候使用,和我们开发无关。
寄存器:给CPU使用,和我们开发无关。
【方法01】
方法是程序中最小的执行单元。
【方法03】
形式参数:方法定义中的参数。实际参数:方法调用中的参数。
【面向对象02】
类是共同特征描述,对象是真实存在的。必须先设计类才能获得对象。
————————————————————
Javabean类:描述一类事物的类,不写main方法。
测试类:编写main方法的类,可以在测试类中创建Javabean类对象并进行赋值调用。
————————————————————
一个Java文件中只能一个类是public修饰,开发中建议一个文件定义一个class类。
【面向对象03】
封装:对象代表什么,就得封装对应的数据,并提供数据对应的行为。
【面向对象04】
this用来区分成员变量和局部变量。
【面向对象05】
如果没定义构造方法,系统会给一个默认;如果定义了,系统就不提供了。
【面向对象06】
标准JavaBean①见名知意②成员变量private③至少无参和全参两个构造方法④成员方法所有get/set。
【面向对象07】
创建对象步骤:1.加载class2.申明局部变量3.在堆中开辟空间4.默认初始化5.显示初始化6.构造方法初始化7.将堆的地址赋给左边的局部变量。
【面向对象08】
基本数据类型:值存储在自己的空间里。赋值给其他是真实值。
引用数据类型:数据值存储在其他空间,自己空间存储的是地址值。赋值给其他是地址值。
【面向对象09】
this的本质:所在方法调用者的地址值。
【面向对象10】
成员变量和局部变量:类中位置、初始化值、内存位置、生命周期、作用域不同。
【字符串01】
字符串的内容不会发生改变,它的对象在创建后不能被更改。
【字符串03】
串池:在堆内存,用来存常量字符串。双引号直接赋值时,系统会检查串池中是否存在。若存在则复用。
【字符串04】
==比较规则:基本数据类型比较数据值,引用数据类型比较地址值。
字符串比较用equals或equalsIgnoreCase。
键盘录入的字符串,是通过new出来的。
【字符串09】
substring的用法(左闭右开)和replace的用法(旧值、新值),charAt。
【字符串10】
StringBuilder可以看成一个容器,创建后里面内容可变。字符串拼接、反转常用。
append(任意类型)、reverse、length、toString方法。
StringBuilder打印对象不是地址值,而是属性值。
【字符串11】
StringJoiner(间隔符号,开始符号,结束符号)。加元素使用add。
【字符串12】
字符串拼接时如果没有变量,编译时就已经是最终结果了。此时结果地址值在串池中。
如果有变量,在JDK8及以后,会先预估结果的长度来建立一个新数组。每一行都会新建一个字符串。
StringBuilder创建时,默认容量16,初始长度0。
扩容:如果没超出*2+2的容量,则以实际容量为准。否则以前者为准。
【字符串13】
修改字符串内容:subString或者String.toCharArray()
【集合01】
区别:集合自动伸缩。集合不能直接存基本数据类型,只能存引用数据类型。
增add删remove改set查get
【集合02】
ArrayList操作数字:使用包装类。
ArrayList<String> list = new ArrayList<>();
list这个变量存储在栈上,new出来的内容存储在堆上。
基本数据对应包装类:char->Character,int->Integer。其他首字母大写。
【面向对象进阶01 - static】
static表示静态,是一个修饰符,可以修饰成员方法或成员变量。
静态存储位置(静态区)在堆内存中。静态变量随着类加载而加载,优先于对象出现。
静态变量:被该类所有对象共享。类名调用(推荐)、对象名调用。
静态方法:多用在测试类和工具类中。JavaBean类中很少会用。调用同上。
【面向对象进阶02 - 工具类】
Javabean类:用来描述一类事物的类。如Student等。
测试类:检查其他类是否书写正确。带有main方法的类。是程序的入口。
工具类:帮助做一些事情,但是不描述任何事物的类。
1.类名见名知意。2.私有化构造方法(外部无法new新建对象)。3.方法定义为静态方便调用(无需先创建类的实例对象)。
【面向对象进阶03 - static注意事项】
静态方法只能访问静态变量和静态方法。非静态方法都可以访问。
静态方法中没有this关键字。
【面向对象进阶04 - 继承】
封装:对象代表什么,就得封装对应的数据,并提供数据对应的行为。
继承:类与类之间,存在相同的内容,并且满足子类是父类中的一种,就可以考虑使用继承。
【面向对象进阶05 - 继承特点与设计】
Java只支持单继承(一个子类只能继承一个父类),不支持多继承(子类不能同上继承多个父类),但支持多层继承(直接、间接父类)。
每个类都直接或者间接的继承于Ojbect。
【面向对象进阶06 - 子类继承父类内容】
继承规则:
构造方法 非私有:不能 private:不能 -> 构造方法名字不一样
成员变量 非私有:能 private:能
成员方法 非私有:能 private:不能


编译期:编译器从本类开始向上查找方法,找到后检查访问权限;若在某个父类找到的是 private,则编译错误。
运行期:对于非 private 的实例方法,JVM 使用实际对象所属类的虚方法表来优化调用流程,使得不用每次调用就逐级查找。
【面向对象进阶07 - 继承中成员访问特点】
成员变量的访问特点:就近原则。先看本类,再看父类。this是本级。super是父级,且只能调用一次。
成员方法的访问特点:就近原则。
重写:父类的方法,不能满足子类现在的需求,就要重写。
函数名和参数都不变,要写上@Override。
本质上是对虚方法表中的重名方法进行覆盖。
重写时访问权限子类必须大于等于父类,返回值类型子类必须小于等于父类。
只有被添加到虚方法表中的方法才能被重写。
重载:函数名不变,参数变。
【面向对象进阶08 - 继承中构造方法】
父类的构造方法不会被子类继承。子类中所有的构造方法默认先调用父类中的无参构造,再执行自己。
子类构造方法第一行语句默认都是super(),不写也存在,且必须在第一行。想调用父类有参构造必须手写一个新super。
this是一个局部变量,并不存在对象当中。this可以调用本类其他构造方法,必须写在第一行。
【面向对象进阶09 - 认识多态】
三大特征:封装、继承、多态。
多态:同类型的对象,表现出的不同形态。 父类类型 对象名称 = 子类对象。
前提:1、有继承/实现关系 2、有父类引用指向子类对象 3、有方法重写
好处:使用父类型作为参数,可以接受所有子类对象。体现多态的扩展性与便利。
【面向对象进阶10 - 多态调用成员特点】
变量调用:编译看左边,运行也看左边。javac编译代码的时候,会看左边的父类中有没有这个变量,如果有,编译成功,如果没有编译失败。java运行代码的时候,实际获取的就是左边父类中成员变量的值
方法调用:编译看左边,运行看右边。javac编译代码的时候,会看左边的父类中有没有这个方法,如果有,编译成功,如果没有编译失败。java运行代码的时候,实际上运行的是子类中的方法。
区分:变量调用去堆里找,方法调用去虚方法表里找。


【面向对象进阶11 - 多态优缺点】
优点:
1. 多态形式下,右边对象可以实现解耦合,便于扩展和维护。(Person p = new Student() , 后续如果业务需要student可以换成teacher,别的地方不用修改)
2. 定义方法的时候,使用父类型作为参数,可以接受所有子类对象,体现多态的扩展性与便利。
缺点:

解决方法:a instance of 类名 b 。如果a是这个类,则强转后赋给b,结果为true。否则结果为false。
【面向对象进阶13 - 包和final】
包就是文件夹,用来管理不同功能的Java类。公司域名反写+包作用。
使用同一个包中的类,无需导包;使用java.lang中的类,无需导包;其他情况都需要导包;如果同时使用两个包的同类名,需要使用全类名。
final修饰:1.方法,该方法是最终方法,不能被重写。2.类。该类是最终类,不能被继承。3.变量,常量,只能被赋值一次。命名全部大写,单词间用下划线。
如果用final修饰引用数据类型,记录的地址值不能发生改变,内部属性值可以改变。
String类型不能被改变原因:底层使用final修饰,地址不可变。且使用private修饰,外界无法访问。
【面向对象进阶14 - 权限修饰符和代码块】

private私房钱只能自己用,默认是只能自己家(本包)用,protected是别家儿子也能用,public是都能用。
局部代码块:代码块执行完清理。
构造代码块:创建对象时,优先于构造方法执行,可以抽取构造方法重复内容。
静态代码块:static关键字修饰,随着类加载而加载,自动触发,只执行一次。
【面向对象进阶15 - 抽象类和抽象方法】
抽象方法:将共性的方法抽取到父类之后,由于每一个子类执行的内容是不一样,所以在父类中不能确定具体的方法题。该方法就可以定义为抽象方法。
抽象类:如果一个类中存在抽象方法,那么该类就必须声明为抽象类。
注意事项:1. 抽象类不能实例化; 2. 抽象类中不一定有抽象方法,有抽象方法的类一定是抽象类; 3. 可以有构造方法; 4. 抽象类的子类要么重写所有抽象方法,要么是抽象类;
【面向对象进阶16 - 接口】
抽象类抽取共性方法,接口制定规则。

【面向对象进阶17 - 接口细节】
接口中成员特点:1. 成员变量:只能是常量; 默认修饰符public static final。 2. 构造方法:没有。3. 成员方法:只能是抽象方法;默认修饰符public abstract
多个接口有重名方法,只需要重写一次。

【面向对象进阶19 - 接口补充内容】
使用场景:当接口需要新增方法时,不需要继承该接口的随时修改。
默认方法:

静态方法:

私有方法:
前者服务默认方法,后者服务静态方法。

1. 接口代表规则,是行为的抽象。想要让哪个类拥有一个行为,就让这个类实现对应的接口就可以了。
2. 当一个方法的参数是接口时,可以传递接口所有实现类的对象,这种方式称之为接口多态。
适配器设计模式:

【面向对象进阶20 - 内部类】
类的五大成员:属性、方法、 构造方法、代码块、内部类。
内部类表示的事物是外部类的一部分,内部类单独出现没有任何意义的时候用。
内部类访问特点:可以直接访问外部类的成员,包括私有。外部类要访问内部类的成员,必须创建对象。
【面向对象进阶21 - 成员内部类】
分类:成员、静态、局部、匿名内部类。
获取成员内部类:1.内部类被private修饰时,在外部类编写方法,对外提供内部类对象。2.非私有修饰,直接创建对象.Outer.Inner oi = new Outer().new Inner();
内部类调用外部类的变量:Outer.this.a。内部类内存图如下:

【面向对象进阶22 - 静态内部类和局部内部类】
静态内部类只能访问外部类中的静态变量和静态方法。如果想要访问非静态的需要创建对象。
调用静态内部类方法:非静态方法需要创建对象,静态方法可以直接使用类名调用Outer.Inner.method()
局部内部类:内部类定义在方法中就叫局部内部类。需要在方法中创建才能用。
【面向对象进阶23 - 匿名内部类】
匿名内部类本质上就是隐藏了名字的内部类。可以写在成员位置,也可以写在局部位置。
new 类名或者接口名() {
重写方法
}
格式细节:包含了继承或者实现,方法重写,创建对象。整体就是一个类的子类对象或者接口的实现类对象。
应用场景:当方法的参数是接口或者类时。以接口为例,可以传递这个接口的实现类对象,如果实现类只要使用一次,就可以用匿名内部类简化代码。method (new Animal....); 只用一次的类可以不用新建文件;Animal是抽象类,所以是多态;
【常用API 01 - Math】
ceil是往数轴正方向进一。floor是往负方向进一。round是四舍五入。
【常用API 03 - System】
exit,currentTimeMillis,arraycopy(源数组,起始索引,目标数组,起始索引,拷贝个数)
如果源数组和目标数组都是引用数据类型,那么子类类型可以赋值给父类类型。
【常用API 05 - Object】
默认比较地址值,可以使用快捷重写equals。下面是String和StringBuilder的示例。

【常用API 06 - 克隆】
浅拷贝(Object.clone)

深拷贝(对于引用数据类型,不是拷贝地址,而是new一个新的。但是如果是串池的内容的话,就直接拷贝。需要自己实现或者使用第三方工具。 )

【常用API 07 - BigInteger】

BigInteger bi = BigInteger.valueof(long) 对于-16~16有优化,会提前创建好。

【常用API 08 - BigDecimal】
传递double类型创建对象,可能不精确,建议使用字符串或者静态方法valueOf。
如果要表示的数字不大,没有超出double,建议使用静态方法valueOf
如果要表示的数字较大,超出double,建议使用传递字符串。
如果传递的是[0,10]的整数,方法会返回已经创建好的对象,不会重新new。
底层存储是一个ASCII码数组。
除法的时候需要设置舍入模式。
【常用API 09 - 正则表达式】
PS: 10~14跳过了
使用string.matches("xxxxxx")。

必须要&&,而不是&。&只表示这个字符本身,无其他含义。
转义字符\,如打印双引号需要\",打印反斜线则\\。
预定义字符,使用时需要写成\\d,\\s等等。
【常用API 15 - Date】

【常用API 16 - SimpleDateFormat】


【常用API 20 - 包装类】
以Integer为例,new出来的使用==判断都是false,地址不同。
如果使用valueof新建,-128~127会使用现成的,结果是true,其他是new出来的,所以是false。
JDK5之后可以直接用=号来赋值新建。
【常见的算法API 06 - Arrays】
binarySearch,顺序数组中查找,如果存在返回索引,如果不存在返回应该插入的索引位置减一。
toString、copyOf、copyOfRange、fill、sort
【lambda表达式】


【集合进阶 01 - 单列集合顶层接口collection】
如果自定义类,则使用contains需要重写equals方法。
【集合进阶 02 - 迭代器】

【集合进阶 03 - 增强for和lambda表达式】

【集合进阶 04 - List】


【集合进阶 06 - ArrayList源码分析】

【集合进阶 07 - LinkedList和迭代器源码分析】

【集合进阶 08 - 泛型】



【集合进阶 09 - 泛型的通配符】
泛型不具备继承性,但是数据具备继承性。




【集合进阶 13~15 - set】
tree和list都是多态的方式进行创建。

如果对于自定义类没有重写hashcode和equals方法,则使用地址值进行计算,元素属性值相同也会被看作不同。



【集合进阶 01 - 双列集合的特点】

【集合进阶 02 - Map集合中常见的API】


【集合进阶 3~5 - Map集合三种遍历方式】



【集合进阶 6~19 - HashMap、LinkedHashMap、TreeMap、可变参数】


【不可变集合】
of方法获取不可变的set、map集合,必须保证元素的唯一性。
map使用of最多只能接受十对参数。因为两个可变参数不能共存。可以使用ofentries。也可以使用copyof,最简单。

【stream流】
获取stream
单列集合获取stream流list.stream().forEach(s -> sout(s))
双列集合hm.keySet().stream.forEach...或者hm.entrySet().stream.forEach...
数组Arrays.stream(arr1).forEach...
一堆零散数据Stream.of()。如果括号内类型不一样,会推理成共同父类object,不过一般不建议这么用。

stream流中间方法


stream流终结方法
如果要收集到map集合中,键不能重复否则会报错。



【方法引用】

1.引用静态方法

2.引用成员方法

3.引用构造方法
![]()
4.使用类名引用成员方法、引用数组的构造方法
![]()
![]()
【异常】


![]()



【File】



![]()


【IO流】

-----------

--字节流--
输出流



输入流


字符集


--字符流--
和字节流类似,只不过读取单位是字符而不是字节。
--各种高级流--






【多线程&JUC】



多线程的常用方法:

设置优先级,最小1最大10,默认5(main线程也是)。
守护线程:

礼让线程、插队线程。

同步代码块synchronized。必须使用唯一锁对象。可以使用MyThread.class。
同步方法,就是把同步代码块提取成方法。
lock锁,可以手动开锁关锁。
等待唤醒机制(阻塞队列实现,生产者消费者)
线程的六个状态(实际上是没有运行态的,因为运行后续交给操作系统了):

自定义线程池:



【网络编程】






UDP连接,receive方法是阻塞的。





【反射】






【动态代理】



浙公网安备 33010602011771号