java 基础知识点整理(一)
(1)JDK & JRE & JVM 的关系
- JDK
JDK包含jre、java开发工具、java核心类库 - JRE
jre是运行java程序的环境,包含java核心类库,和jvn的标准实现 - JVM
是java虚拟机,实现java跨平台最核心的部分(2)跨平台
因为jvm运行的是java编译后的字节码文件,因为jvm可以在多个平台安装,所以字节码文件就可以在多个平台的jvm上面运行.从而实现一次编译到处运行
(3)基础数据类型
整型: byte、short、int、long
浮点型:double、float
逻辑型:boolean
字符型:char
长度
byte(1) 2的-7次方 到2的7次方-1
short(2) 2的-15次方 到 2的 15 次方-1
int(4)
long(8)
double(8)
float(4)
boolean(1/8)
char(2)
(4)自动装箱,自动拆箱
自动装箱:
1 | Integer i= 100; // 基本类型自动装箱为包装类,编译器会优化为 Integer i = new Integer(100); |
自动拆箱
1 | int i =new Integer(100); //编译集会优化为 int i =new Integer(100).intValue(); |
(5) Integer.intValue()
integer 定义的对象,范围在-128带127会被缓存起来,所以在这个范围内的integer进行判断相等会等于true,因为是同一对象
(6) == 和 equals 的区别
1.== 是判断对象地址是否相等,equals没在重写的情况下也是判读对象地址等同于==
2.不通对象的地址是不一样的,如果相比较两个对象的内容是否一样则需重写equals方法
(7)hashcode()和 equals()的区别
equals()必须满足一下几点:
1.自反性 a.equals(a) =true
2.对称性 a.equals(b) =true b.equals(a) =true
3.一致性 a.equals(a) 多次调用永远等于true
4.对于null判断始终等于false
hashcode()的实现方式和操作系统有关,姑且认为是获取对象的地址。
重写equals()方法必须重写hashcode(),因为在hash数据结构添加数据的时候,需要先通过hashcode()方法查找存储的位置(链地址发),如果该位置不存在则插入,如果该位置已经拥有对象则,需要通过equals()方法判断对象是否相同,如果相同则替换,如果不通则在改对象后面进行存储。
1.两个相同的对象hashcode 必须相同,hashcode相同的对象,对象之间可能不通
2. hashcode()不同,则对象也不相同
- 如果之重写了equals()方法会出现什么效果?
答案:两个相同的对象hashcode不同,hashmap的key会放入相同的对象
(8) String & StringBuffer & StringBuilder
- 都是final的不可以被继承
- String 不可变 StringBuffer,StringBuilder 长度可变
- String 重写了equals()方法和hashcode()方法
- StringBuffer 是线程安全的 StringBuilder是线程不安全的
- 在单线程下 StringBuffer和StringBuilder效率一样,再多线程下StringBuilder效率更高,因为StringBuffer在一些方法上加了同步synchronized 方式
- 字面直接声明的String 在编译期间都会优化为final声明的
(9) ‘+’ 和substring()
- ‘+’ 和 substring() 都会生成一个新的对象
- ‘+’ 和 substring() 都是在在堆中生成的对象 (没有在常量池所以不共享)
- ‘+’ 在编译期间会被优化为 append()方法
(10) 可以手动创建java.long.String 类么?可以使用么?为什么?
- 可以创建,但是不能被使用,因为类加载机制(双亲委派机制)
- 因为自定义的类的加载器为AppClassLoader.AppClassLoader加载器加载的时候需要先加载其父加载器,ExtClassLoader加载器,ExtClassLoader会在 jre/lib/ext 下去寻找 java.long.String 类, 此时找不到该类,则会调用ExtClassLoader的父加载器BootStrap加载器,在jre/lib下寻找,
最终找到String类并且加载 - 这也就是类加载的委托机制