| 基本类型 | 大小(byte) | 默认值 | 封装类 |
|---|---|---|---|
| byte | 1 | (byte)0 | Byte |
| short | 2 | (short)0 | Short |
| int | 4 | 0 | Integer |
| long | 8 | 0L | Long |
| float | 4 | 0.0f | Float |
| double | 8 | 0.0d | Double |
| boolean | - | false | Boolean |
| char | 2 | \u0000(null) | Character |
说明:
- int是默认值是0, Integer默认值是null。Integer能区分出null和0的情况。任何引用对象使用前, 必须为其指定一个对象, 否则会抛出NullPointException。
- 基本类型在直接分配空间,可直接赋值; 引用类型开辟引用空间(8byte),指向对象实例化时候才可以赋值。
- 数组也是引用对象, a、b指向同一个数组, 修改数据互相可见。
- 关于boolean类型。boolean没有给出具体的占用字节数, 1字节/4字节都是可能的。
instnceof 关键字的作用
说明:
- 双目运算符;
- 用来测算一个对象是否是一个类型的实例;
- 如果类型确定, 不涉及到范型, 那么编译期编译器会执行该条目, 如果实例为null则返回false;
- 如果涉及到范型或者编译期类型不能确定, 那么会到运行时确定;
equals与==的区别
- 强调: ==比较的是引用地址是否相同, 即判断是否指向同一个对象;equals比较的是两个对象的内容是否相同; ==
- 比较操作符两边对象是否是同一个对象;
- 两边对象必须是同一类型(父子类型也可)才可以编译通过;
- 比较的是地址, 如果是基本类型, 则值相同则为true; equals
- 所有对象都继承于Object, 而Object的equals方法底层是==实现, 所以如果不重写equals方法, 只能是两个引用对象是同一个对象时才为true;
- 阿里代码规范推荐只使用equals;
- 使用时候将非空性对象放在前边, 避免出现NullPointException;
hashcode的作用
why hashcode 比如List, 可以是有序可重复, 那么判断一个元素是否存在也相对方便, 因为有序性且可以重复;但是像Set, 无序且不可重复, 怎么判断是否已经存在要插入的元素呢?每次o(N)的时间复杂度进行全局判断吗? 于是hashcode算法的实现, 可以提高查找元素的效率, 判断元素是否存在就更不用说了。 hashcode方法返回的是一个根据对象内存地址换算出的一个值。在集合需要添加新元素的时候, 就先调用这个新元素的hashcode方法, 根据返回值计算出应该放置的位置, 如果这个位置没有元素占用(没有hash冲突),就直接放置新元素, 不用进一步比较; 如果该位置已经有元素占用, 就调用占用元素的equals方法和新元素进行比较, 再根据结果做进一步处理。本质就是大大降低了equals方法的调用次数。
String、StringBuffer、StringBuilder区别
String
private final char value[];
如上, String底层是通过一个final修饰的char数组实现的。因此大致推断出三个特性:只读、非基本类型:
- 只读:一经定义不可修改, 每次对String的操作都会生成一个新的String对象;如每次+操作,都是隐式地在对上new了一个String对象, +后边的内容; StringBuffer、StringBuilder都继承了AbstractStringBuilder抽象类, 而AbstractStringBuilder中封装了具体数据--一个非final的char数组;
AbstractStringBuilder封装的数据结构:
char[] value;
非final就说明了是可变数组, 即StringBuidler、StringBuffer可变;因此在频繁的字符串操作建议使用StringBuffer、StringBuilder; 另外, StringBuffer对调用方法加了锁, 是线程安全的;
ArrayList LinkedList区别
- ArrayList获取数据的时间复杂度是o(1),但是删除数据的开销非常大, 因为需要重排数组中的所有数据;
- List是一个有序的集合, 可以包含重复元素, 提供了按索引访问的方式, 继承了Collection;List有两个重要的实现, ArrayList和LinkedList;
- ArrayList:可以自动增长容量大数组;
- ArrayList的toArray方法返回一个数组;asList返回一个列表;
- LinkedList是一个双向列表, 在添加和删除元素时候比ArrayList的性能更好, 但是在get、set方面弱于ArrayList;
四种引用 强软弱虚
强引用
在内存不足, 即使发生OOM异常的时候也不会被回收;
软引用
在内存不足时候, 软引用会被回收; 触发条件:内存不足, 充足时候即使发生gc也不会回收;
- 应用场景: 创建缓存的时候, 创建的对象放入缓存中, 当内存不足的时候, 会把软引用对象回收;
public static void main(String[] args) {
SoftReference<String> stringSoftReference = new SoftReference<String>("abc");
System.out.println(stringSoftReference.get());
System.gc();
System.out.println(stringSoftReference.get());
}
弱引用
垃圾回收器感知到了弱引用, 就会被回收, 不考虑内存情况。
Exception Error
Throwable细分为三种结构:检查异常(CheckedException)、运行时异常(RuntimeException)、错误(Error)。
运行时异常
定义: RuntimeException及其子类都是运行时异常。 特点: 编译器不会检查它。即程序中如果出现这类异常, 即使没有显示声明, 也会编译通过。不需要throws声明或者try-catch语句块捕获也可编译通过。 举例:
- ArithmeticException:a/0;
- IndexOutOfBoundsException: 数组超出边界异常;
- fail-fast机制产生的ConcurrentModificationException--java集合的一种错误检测机制, 当多个线程对同一个集合进行数据修改时候, 可能会发生ConcurrentModificationException。
- ClassCastException, 类转换异常;
- NullPointerException, 空指针异常;
- ArrayStoreException, 数据存储异常, 比如插入错误类型元素;
- BufferOverflowException;
被检查异常
定义: Exception本身, 以及Exception子类中除了运行时异常外的其他子类异常 都属于被检查异常。 特点: 编译器会检查它。因此该类异常要么需要通过throws声明, 要么需要通过try-catch块进行捕获, 否则不能通过编译。 举例:
- CloneNotSupportedException, 当调用对象的clone()方法进行克隆的时候, 如果该对象没有实现Cloneable接口, 在编译期就会报出CloneNotSupportedException;
- IOException;
- FileNotFoundException;
- SQLException; 场景: 被检查异常适用于那些不是因为程序引起的错误, 比如文件不存在, 不是代码的锅, 而应该被处理。
错误
定义: Error及其子类。 特点: 和运行时异常一样, 编译器不会对错误进行检查。 当资源不足、约束失败、或是其它程序无法继续运行的条件发生时,就产生错误。程序本身无法修复这些错误的。
- OutOfMemeoryError;
- VirtualMachineError;
反射
定义: 在运行时, 对于任意一个类, 都能够知道这个类的所有属性和方法;对于任意一个对象, 都能够调用它的任意一个方法。在java中只要给定类的名字, 就可以通过反射机制来获取类的所有信息。这种动态获取类信息以及动态调用对象方法的机制叫做反射。 场景:
- JDBC;
- Hibernate;
- Struts; 相关类型定义:
- Class, 表示正在运行的Java应用程序中的类和接口, 所有需要获取对象的信息的操作, 都需要Class来实现;
- Field, 提供类和接口的属性 的信息, 以及对它的动态访问权限;
- Constructor, 提供类的构造器的信息以及其访问权限;
- Method, 提供类或接口中某个方法的信息; 反射优缺点: 优点:
- 能够运行时动态获取类的实例, 提高灵活性;
- 与动态编译结合; 缺点:
- 使用反射性能较低, 需要解析字节码, 解析内存中的对象;
- 相对不安全, 破坏了封装性(因为通过反射可以获得私有变量和访问私有方法); 提高反射性能
- 通过setAccessible(true), 关闭JDK的安全检查来提升反射速度;
- 同一个实例多次创建, 可以使用缓存;
- asm工具, 通过字节码生成方式加快反射速度;
Object 方法汇总
clone
protected native Object clone() throws CloneNotSupportedException;
- 保护方法;
- 对象的浅拷贝;
- 只有实现了Cloneable接口才可以使用该方法, 否则强行使用抛出CloneNotSupportedException;
- 深拷贝也需要实现Clonealbe接口, 然后重写clone方法;