Java基础

119 阅读7分钟
基本类型大小(byte)默认值封装类
byte1(byte)0Byte
short2(short)0Short
int40Integer
long80LLong
float40.0fFloat
double80.0dDouble
boolean-falseBoolean
char2\u0000(null)Character

说明:

  • int是默认值是0, Integer默认值是null。Integer能区分出null和0的情况。任何引用对象使用前, 必须为其指定一个对象, 否则会抛出NullPointException。
  • 基本类型在直接分配空间,可直接赋值; 引用类型开辟引用空间(8byte),指向对象实例化时候才可以赋值。
  • 数组也是引用对象, a、b指向同一个数组, 修改数据互相可见。
  • 关于boolean类型。boolean没有给出具体的占用字节数, 1字节/4字节都是可能的。

instnceof 关键字的作用

说明:

  • 双目运算符;
  • 用来测算一个对象是否是一个类型的实例;
  • 如果类型确定, 不涉及到范型, 那么编译期编译器会执行该条目, 如果实例为null则返回false;
  • 如果涉及到范型或者编译期类型不能确定, 那么会到运行时确定;

equals与==的区别

  • 强调: ==比较的是引用地址是否相同, 即判断是否指向同一个对象;equals比较的是两个对象的内容是否相同; ==
  1. 比较操作符两边对象是否是同一个对象;
  2. 两边对象必须是同一类型(父子类型也可)才可以编译通过;
  3. 比较的是地址, 如果是基本类型, 则值相同则为true; equals
  4. 所有对象都继承于Object, 而Object的equals方法底层是==实现, 所以如果不重写equals方法, 只能是两个引用对象是同一个对象时才为true;
  5. 阿里代码规范推荐只使用equals;
  6. 使用时候将非空性对象放在前边, 避免出现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数组;

image.png 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方法;