机制定义部分
General contract
principle:
- 在编程语言中运用“数据结构”就是在使用被一层一层封装起来的某种数据类
- Java 中只有3类数据类型:原生类型(primitive8个)、数组、Object;
- 无论官方的集合框架也好,你自己创建的类也好,都只能是源自于Object并依赖于原有的这3类数据类型{基本所有的框架操作数组}
[java只是对底层调用部分封装了一个外壳: native等方法不可见]——操作数据最频繁:System.arraycopy(S[],index,T[],index,length);
- equals的对象必须有相同的哈希码。
reference:https://blog.csdn.net/qq_32635069/article/details/79798741
basic
8中基本数据类型 && 包装类型
运算符
地址引用
符号引用。即一个字符串,但是这个字符串给出了一些能够唯一性识别一个方法,一个变量,一个类的相关信息。
直接引用。可以理解为一个内存地址,或者一个偏移量。比如类方法,类变量的直接引用是指向方法区的指针;而实例方法,实例变量的直接引用则是从实例的头指针开始算起到这个实例变量位置的偏移量
对象
三大特征:封装、继承、多态(抽象)
典型:基本数据类型与包装数据类型(后面每个自成专题详解)
-包装数据类型的功能丰富:封装 HashCode—地址、getClass-反射、max\min等
-泛型类型参数
-序列化:实现了Serializable接口
-类型转换:parseInt\Double
-高频区域数据缓存:JVM部分
JVM优化部分:常量池问题。
比如Integer类型对象:==
1.都为new对象,堆地址不一致。(false)
2.都是已经new出来对象的引用的话,JVM会编译: Integer i=12;---> Integer i= Integer.valueOf(12);valueOf()函数会堆-128~127之间的数据进行缓存。(true)
3.int 与 Integer 进行比较,包装类会自动拆包为int,进行比较。(true)
访问权限问题:
Java类初始化顺序——JVM虚拟机部分(类的加载机制)
【静态变量--静态代码块--普通变量--普通代码块--构造函数】
【存在父子关系的,先父亲后而后儿子】
---初始化顺序也说明:
1.(同一个类)构造代码块可以调用普通代码块,但是普通代码块不能调用构造代码块。
2.(父子继承类)【遵循整体原则】+【父类构造代码块优先于子类普通代码块。】
【接口、抽象类、实现类】,同理,
---接口注意点:
1.声明的变量都是静态变量并且是final的,所以子类无法修改,并且是固定值不会因为实例而变化
2.接口中能有静态方法,不能有普通方法,普通方法需要用defalut添加默认实现
3.接口中的变量必须实例化
4.接口中没有静态代码块、普通变量、普通代码块、构造函数
{类只加载一次 && 静态代码块、静态变量只执行一次}
Java类加载机制(JVM虚拟机部分)
1.编译
2.运行(类加载)
2.1 加载:.class文件被类加载器装载入内存。
类加载器:启动类加载器,扩展类加载器,应用类加载器,以及用户的自定义类加载器。
.class文件:来源包含,本地路径编译生成,从jar包,从远程网络,动态代理实时编译。
自定义类加载器的作用?
(1)java代码很容易被反编译,如果需要对自己的代码加密的话,可以对编译后的代码进行加密,然后再通过实现自己的自定义类加载器进行解密,最后再加载。
(2)从非标准的来源加载代码,比如从网络来源,那就需要自己实现一个类加载器,从指定源进行加载。
2.2 链接
(1)验证:保证加载进来的字节流符合虚拟机规范,不会造成安全错误。
1.文件格式的验证:比如常量中是否有不被支持的常量?文件中是否有不规范的或者附加的其他信息?
2.元数据的验证:比如该类是否继承了被final修饰的类?类中的字段,方法是否与父类冲突?是否出现了不合理的重载?
3.符号引用的验证:比如校验符号引用中通过全限定名是否能够找到对应的类?校验符号引用中的访问性(private,public等)是否可被当前类访问?
4.字节码的验证:保证程序语义的合理性,比如要保证类型转换的合理性。
(2)准备:主要是为类变量(注意,不是实例变量)分配内存,并且赋予初值。
**{
初值,不是代码中具体写的初始化的值,而是Java虚拟机根据不同变量类型的默认初始值。
比如8种基本类型的初值,默认为0;引用类型的初值则为null;常量的初值即为代码中设置的值,final static tmp = 456, 那么该阶段tmp的初值就是456
}
(3)解析:将常量池内的符号引用替换为直接引用的过程。
2.3 执行
枚举类型
每调用一次,构造一次!【工程中,不建议使用】
数组
数组是java的内置类型,其并不是由java语言实现的!
---[任何实现了 Iterable 接⼝的对象都可⽤于 for each 循环]
---[I@77459877: “[”代表的是数组。“i”代表数组内数据类型。“@”后面的值是由哈希算法得到16进制的数,代表该数组的位置。
典型应用:分专题详细剖析与应用
包装类
String
集合
set集不保存重复的元素,最常用的是测试归属。——查找是set最重要的操作。
List接口既定义了下标访问方法又定义了迭代器方法。所以其实例既可使用下标随机访问也可以使用迭代器进行遍历。但这两种方式的性能差异很明显。
ArrayList是典型的随机访问型,
LinkedList则是顺序访问型。
队列和双端队列都不支持在队列中间添加元素???
---优先级队列如何找最小元素:构建时指定 Comparator,或者存放元素实现 Comparable接口
TreeMap中Comparable 和comparator区别?
TreeMap在构建TreeMap时,指定Comparator。未指定Comparator时,key值对象必须实现Comparable接口
Comparable 比较自身和另一个对象,compareTo
Comparator 比较的是传入的两个对象,compare
【RandomAccess接口是一个标记接口,它并未定义方法。其目的是用于指示实现类具有随机访问特性,在遍历时使用下标访问较迭代器更快】
流的操作本质也是数组!
资源消耗问题
数组>对象>基本数据类型创建>赋值
地址
null:只是一个地址,并不是对象。无法调用任何属性。
值引用
基本引用
方法
⽅法签名是指⽅法名和参数列表。(⼀个类中的⽅法签名必须唯⼀)【⽅法返回值类型不是⽅法签名的⼀部分】
重载(overloading)只是⼀个类中可以多个名字相同的⽅法,但这些⽅法的参数个数或类型不同。
重写(Overriable)继承关系的对象中重写父类中的方法。方法签名一致,内部实现逻辑不同。
泛型
1.泛型不能使用基本数据类型。JVM类型擦除问题。??--类型擦除后变成Object对象,Object对象不能存放基本数据类型。编译器阶段会报错。
线程机制
其他
断言:方便调试程序,并不是发布程序的组成部分。
断言:
false,java.lang.AssertionError: a>b
true:往下执行
int a = 1; int b = 3;
assert a>b:"a>b";
System.out.println("a>b");
assert a>b:"a<=b";
System.out.println("a<=b");
注解:Java 定义了一套注解,共有 7 个,3 个在 java.lang 中,剩下 4 个在 java.lang.annotation 中。
XML
MAVEN