Object类包含的方法
1.clone()
浅拷贝一个对象
2. equals(Object obj)
比较目标对象是否相等,equals返回true,hashCode一定相等
3.hashCode()
返回当前对象的hashCode值,这个值是一个整数范围内的(-2^31 ~ 2^31 - 1)数字
4.getClass()
返回一个Class对象,一般用于反射
Object.getClass() 需要有对象
类名.class 需要导类名对应的包
Class.forName() 反射一般使用第三种方式获得Class对象
5.finalize()
一般用于可达性分析的垃圾回收机制,判断对象是否被回收。一般系统调用,不重写。
6. toString()
返回一串String类型的 类名@地址
7. notify()、notifyAll()、wait()、wait(long time) 线程间通信
wait()、wait(long time)用来阻塞线程
notify()、notifyAll() 用来唤醒被阻塞的线程
String,StringBuffer和StringBuilder的区别
-
String: 底层为不可变数组Char[],每次修改都会生成新的String对象,"abc"存储在常量池
-
StringBuilder: 可变对象,append的时候调用Arrays.copyOf改变数组,线程不安全,效率高
-
StringBuffer:可变对象,append的时候也是调用Arrays.copyOf改变数组,synchronized修饰方法线程安全,效率高
int、Integer
-
int基本数据类型
-
Integer: int的包装类,缓存-128 ~ 127的值
-
Integer num1 = 100; Integer num2 = 100; num1 == num2 true
-
Integer num3 = 128; Integer num4 = 128; num3 == num4 false
Java三大特性
-
封装:将类的信息隐藏在类的内部,不允许外部直接访问,而是通过该类提供的方法对隐藏信息操作和访问。
-
继承:将多个相同的属性和方法提取出来变为父类,子类通过继承实现代码复用。(单继承)
-
多态:对父类的方法进行重写,重载,已达到不同的实现。
Java类的加载顺序
静态属性、静态代码块->成员变量、代码块->构造方法(有继承关系的都从父类优先加载)
深拷贝、浅拷贝
-
浅拷贝:基本类型复制,引用类型只复制了引用,新对象引用类型对象和原来的一样,修改会同步赢旧对象
-
深拷贝:所有的属性全部复制,复制出来的新对象修改任何属性不会影响旧对象。
反射
通过获取一个类的Class对象,获取****Class中的方法,变量,构造函数等映射成相应的Method、Filed、Constructor等类,这些类提供了丰富的方法可以被我们所使用。
获取Class对象的方法:
Object.getClass() 需要有对象
类名.class 需要导类名对应的包
Class.forName() 反射一般使用第三种方式获得Class对象
注解
为元素打上某种标记,用于编译、运行时进行解析,使用。
泛型
泛型的本质是参数化类型,在不创建新的类型的情况下,通过泛型指定不同的类型来控制形参具体限制的类型。也就是说在泛型的使用中,操作的数据类型被指定为一个参数,这种参数可以被用在类,接口和方法中,分别被称为泛型类,泛型接口和泛型方法。
泛型是java中的一种语法糖,能够在代码编写的时候起到类型检测的作用,但是虚拟机是不支持这些语法的。
泛型的优点:
1.类型安全,避免类型的强转。
2.提高了代码的可读性,不必要等到运行的时候才去强制转换。
什么是类型擦除?
不管泛型的类型传入哪一种类型实参,对于java来说,都会被当成同一类处理,在内存中也只占用一块空间,通俗一点来说,就是泛型之作用于代码编译阶段,在编译过程中,对于正确检验泛型结果后,JVM是不会存储泛型信息的,会将泛型的信息擦除,也就是说,成功编译过后的class文件时不包含任何泛型信息的。