Java

java入门13

JAVA SEMEEE

java入门16

JDK=JVM+核心类库+开发工具(javacjavajdbjhat内存分析工具)

JRE=JVM+核心类库+运行工具(java

【运算符04

Byteshortchar在运算的时候,都会先提升为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:不能

 

image

image

编译期:编译器从本类开始向上查找方法,找到后检查访问权限;若在某个父类找到的是 private,则编译错误。

运行期:对于非 private 的实例方法,JVM 使用实际对象所属类的虚方法表来优化调用流程,使得不用每次调用就逐级查找。

【面向对象进阶07 - 继承中成员访问特点】

成员变量的访问特点:就近原则。先看本类,再看父类。this是本级。super是父级,且只能调用一次。

成员方法的访问特点:就近原则。

重写:父类的方法,不能满足子类现在的需求,就要重写。

函数名和参数都不变,要写上@Override。

本质上是对虚方法表中的重名方法进行覆盖。

重写时访问权限子类必须大于等于父类,返回值类型子类必须小于等于父类。

只有被添加到虚方法表中的方法才能被重写。

重载:函数名不变,参数变。

【面向对象进阶08 - 继承中构造方法】

父类的构造方法不会被子类继承。子类中所有的构造方法默认先调用父类中的无参构造,再执行自己。

子类构造方法第一行语句默认都是super(),不写也存在,且必须在第一行。想调用父类有参构造必须手写一个新super。

this是一个局部变量,并不存在对象当中。this可以调用本类其他构造方法,必须写在第一行。

【面向对象进阶09 - 认识多态】

三大特征:封装、继承、多态。

多态:同类型的对象,表现出的不同形态。 父类类型 对象名称 = 子类对象。

前提:1、有继承/实现关系 2、有父类引用指向子类对象 3、有方法重写

好处:使用父类型作为参数,可以接受所有子类对象。体现多态的扩展性与便利。

【面向对象进阶10 - 多态调用成员特点】

变量调用:编译看左边,运行也看左边。javac编译代码的时候,会看左边的父类中有没有这个变量,如果有,编译成功,如果没有编译失败。java运行代码的时候,实际获取的就是左边父类中成员变量的值

方法调用:编译看左边,运行看右边。javac编译代码的时候,会看左边的父类中有没有这个方法,如果有,编译成功,如果没有编译失败。java运行代码的时候,实际上运行的是子类中的方法。 

区分:变量调用去堆里找,方法调用去虚方法表里找。

image

image

 【面向对象进阶11 - 多态优缺点】

优点:

1. 多态形式下,右边对象可以实现解耦合,便于扩展和维护。(Person p = new Student() , 后续如果业务需要student可以换成teacher,别的地方不用修改)

2. 定义方法的时候,使用父类型作为参数,可以接受所有子类对象,体现多态的扩展性与便利。

缺点:

image

解决方法:a instance of 类名 b 。如果a是这个类,则强转后赋给b,结果为true。否则结果为false。

【面向对象进阶13 - 包和final】

包就是文件夹,用来管理不同功能的Java类。公司域名反写+包作用。

使用同一个包中的类,无需导包;使用java.lang中的类,无需导包;其他情况都需要导包;如果同时使用两个包的同类名,需要使用全类名。

final修饰:1.方法,该方法是最终方法,不能被重写。2.类。该类是最终类,不能被继承。3.变量,常量,只能被赋值一次。命名全部大写,单词间用下划线。

如果用final修饰引用数据类型,记录的地址值不能发生改变,内部属性值可以改变。

String类型不能被改变原因:底层使用final修饰,地址不可变。且使用private修饰,外界无法访问。

【面向对象进阶14 - 权限修饰符和代码块】

image

private私房钱只能自己用,默认是只能自己家(本包)用,protected是别家儿子也能用,public是都能用。

局部代码块:代码块执行完清理。

构造代码块:创建对象时,优先于构造方法执行,可以抽取构造方法重复内容。

静态代码块:static关键字修饰,随着类加载而加载,自动触发,只执行一次。

【面向对象进阶15 - 抽象类和抽象方法】

抽象方法:将共性的方法抽取到父类之后,由于每一个子类执行的内容是不一样,所以在父类中不能确定具体的方法题。该方法就可以定义为抽象方法。

抽象类:如果一个类中存在抽象方法,那么该类就必须声明为抽象类。

注意事项:1. 抽象类不能实例化; 2. 抽象类中不一定有抽象方法,有抽象方法的类一定是抽象类; 3. 可以有构造方法; 4. 抽象类的子类要么重写所有抽象方法,要么是抽象类;

【面向对象进阶16 - 接口】

抽象类抽取共性方法,接口制定规则。

image

 【面向对象进阶17 - 接口细节】

接口中成员特点:1. 成员变量:只能是常量; 默认修饰符public static final。 2. 构造方法:没有。3. 成员方法:只能是抽象方法;默认修饰符public abstract

多个接口有重名方法,只需要重写一次。

image

【面向对象进阶19 - 接口补充内容】

使用场景:当接口需要新增方法时,不需要继承该接口的随时修改。

默认方法:

image

 静态方法:

image

 私有方法:

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

image

1. 接口代表规则,是行为的抽象。想要让哪个类拥有一个行为,就让这个类实现对应的接口就可以了。

2. 当一个方法的参数是接口时,可以传递接口所有实现类的对象,这种方式称之为接口多态。

适配器设计模式:

image

【面向对象进阶20 - 内部类】

类的五大成员:属性、方法、 构造方法、代码块、内部类

内部类表示的事物是外部类的一部分,内部类单独出现没有任何意义的时候用。

内部类访问特点:可以直接访问外部类的成员,包括私有。外部类要访问内部类的成员,必须创建对象。

【面向对象进阶21 - 成员内部类】

分类:成员、静态、局部、匿名内部类。

获取成员内部类:1.内部类被private修饰时,在外部类编写方法,对外提供内部类对象。2.非私有修饰,直接创建对象.Outer.Inner oi = new Outer().new Inner();

内部类调用外部类的变量:Outer.this.a。内部类内存图如下:

image

【面向对象进阶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的示例。

image

【常用API 06 - 克隆】

浅拷贝(Object.clone)

image

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

image

【常用API 07 - BigInteger】

image

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

image

【常用API 08 - BigDecimal】

传递double类型创建对象,可能不精确,建议使用字符串或者静态方法valueOf。

如果要表示的数字不大,没有超出double,建议使用静态方法valueOf

如果要表示的数字较大,超出double,建议使用传递字符串。

如果传递的是[0,10]的整数,方法会返回已经创建好的对象,不会重新new。

底层存储是一个ASCII码数组。

除法的时候需要设置舍入模式。

【常用API 09 - 正则表达式】

  PS: 10~14跳过了

使用string.matches("xxxxxx")。

image

 必须要&&,而不是&。&只表示这个字符本身,无其他含义。

转义字符\,如打印双引号需要\",打印反斜线则\\。

预定义字符,使用时需要写成\\d,\\s等等。

【常用API 15 - Date】

image

 【常用API 16 - SimpleDateFormat】

image

image

 【常用API 20 - 包装类】

 以Integer为例,new出来的使用==判断都是false,地址不同。

如果使用valueof新建,-128~127会使用现成的,结果是true,其他是new出来的,所以是false。

JDK5之后可以直接用=号来赋值新建。

 【常见的算法API 06 - Arrays】

binarySearch,顺序数组中查找,如果存在返回索引,如果不存在返回应该插入的索引位置减一。

toString、copyOf、copyOfRange、fill、sort

【lambda表达式】

image 

image

image

【集合进阶 01 - 单列集合顶层接口collection】

如果自定义类,则使用contains需要重写equals方法。

【集合进阶 02 - 迭代器】

image

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

image

 【集合进阶 04 - List】

image

image

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

image

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

image

【集合进阶 08 - 泛型】

image

image

image

 【集合进阶 09 - 泛型的通配符】

泛型不具备继承性,但是数据具备继承性。

image

image

image

image

【集合进阶 13~15 - set】

tree和list都是多态的方式进行创建。

image

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

image

image

image

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

image

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

image

image

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

image

image

image

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

image

image

 【不可变集合】

 of方法获取不可变的set、map集合,必须保证元素的唯一性。

map使用of最多只能接受十对参数。因为两个可变参数不能共存。可以使用ofentries。也可以使用copyof,最简单。

image

【stream流】

获取stream

单列集合获取stream流list.stream().forEach(s -> sout(s))

双列集合hm.keySet().stream.forEach...或者hm.entrySet().stream.forEach...

数组Arrays.stream(arr1).forEach...

一堆零散数据Stream.of()。如果括号内类型不一样,会推理成共同父类object,不过一般不建议这么用。

image

stream流中间方法

image

image

 stream流终结方法

如果要收集到map集合中,键不能重复否则会报错。

image

image

image

【方法引用】

image

1.引用静态方法

image

2.引用成员方法

image

3.引用构造方法

image

4.使用类名引用成员方法、引用数组的构造方法

imageimage

【异常】

image

image

image

image

image

image

【File

image

image

image

image

image

image

【IO流

image

 -----------

image

--字节流--

输出流

image

image

image

输入流

image

image

字符集

image

image 

image

 --字符流--

和字节流类似,只不过读取单位是字符而不是字节。

--各种高级流--

image

image

image

image

image

image

【多线程&JUC

image

image

image

多线程的常用方法:

image

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

守护线程:

image

 礼让线程、插队线程。

image

同步代码块synchronized。必须使用唯一锁对象。可以使用MyThread.class。

同步方法,就是把同步代码块提取成方法。

lock锁,可以手动开锁关锁。

等待唤醒机制(阻塞队列实现,生产者消费者)

线程的六个状态(实际上是没有运行态的,因为运行后续交给操作系统了):

image

自定义线程池:

image

image

image

【网络编程】

image

image

image

image

image

image

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

image

image

image

image

image

【反射】

image

image

image

image

image

image

【动态代理】

image

image

 

posted @ 2025-04-02 23:48  Refun  阅读(3)  评论(0)    收藏  举报