List和Set区别
list有序,按对象进入的顺序保存对象,可重复,允许多个为null的对象,可用iterator(迭代器)取出,用get(index)取出执行下标元素的值
set无序,不可重复,最多允许一个null 取元素只能Iterator取得所有元素
ArrayList和LinkedList
ArrayList连续存储,适合随机访问 改查操作
扩容机制:因数组长度固定,超出时需要新建数组,将老数据拷贝到新数组,若不是尾插涉及元素的移动(往后移动一份,插入新数组)
LinkedList链表,可存在分散的内容中,适合数据的插入及删除,不适合查询。只能用迭代器遍历。
Hashmap 和 HashTable 区别
1HashMap没有sychronized修饰,线程不安全,HashTable线程安全。
2HashMap允许key value 为null,而HashTable不允许。
底层: 数组+链表
jdk8开始链表的高度到8,数组长度超64,链表转红黑树,元素以内部类Node节点计算key的hash值,二次hash然后对数组长度取模,对应到数组下标。如果没有hash冲突,(下标位置没有元素)则会创建node存如数组。
如果有hash冲突,先进行equals比较,相同则取代,不同则判断,高度达到8 并且长度达到64转红黑树,低于8则转回链表。
CompareAndSet (乐观锁)
jdk8数据结构:sychronized+CAS+node+红黑树 node的value 和next 都用volatile修改,查找替换复制操作都用CAS
volatile 修改的变量对所有线程可见。
构造方法、成员变量初始化以及静态成员变量三者的初始化顺序。
先后顺序:静态成员变量、成员变量、构造方法
详细顺序:父类静态变量,父类静态代码块,子类静态变量,子类静态代码块,父类非静态变量,父类非静态代码块,父类构造函数,子类非静态变量,子类非静态代码块,子类构造函数
接口和抽象类的区别
1接口只有方法的定义,没有方法的实现,而抽象类可以有方法的定义和实现。
2一个类可以实现多个接口,只能继承一个抽象类。
3当子类和父类之间存在逻辑上的层次结构,推荐使用抽象类,利于功能累积
希望支持差别较大的两个或更多对象间特定交互行为,推荐使用接口。降低耦合度
Java中finally代码块是否一定执行?
1进入try之前发生异常
2system.exit()
3try/catch中有return finally语句块中的代码会在return之前执行。
若try catch finally都有return,finally中的return会覆盖try catch中return
Static关键字的作用
1为某种特定数据类型或对象分配与创建对象个数无关的单一的存储空间
2使方法属性不创建对象的情况下依然可以直接使用。
为什么要把String设计为不可变量
1节省空间
2提高效率
3安全
序列化是一种将对象成字节序列的过程
可将对象写在流里进行网络传输,或保存文件数据库等数据,并在需要的时候吧该流取出来重新构造一个相同的对象。
throw 与throws 的区别
throw 一般用在方法体内部,主动抛出异常
throws 手动抛出 定义在方法体上
获取class镀锡那个
Class.forName(“类的全限定名”)
实例对象.getClass()
类名.class
反射机制
反射机制使java具动态获取程序信息和动态调用对象方法
class类:可获得类属性方法 method 获取类的方法信息
Field:获得类成员变量 Construct类:获取类的构造信息。
自动装箱 自动拆箱
装箱就是自动将基本数据类型装换为包装类 int --> Integer
拆箱就是自动将包装类装换为基本数据类型 Integer --> int
多态
多态分为编译时多态和运行时多态
运行时多态,父类指向子类的方法
编译时多态,主要指方法的重载
匿名内部类:只能使用一次
Collection和Collections的区别
Collection是一个集合接口,提供了对集合对象进行基本操作的通用接口方法,所有集合的父类
Collections 是一个包装类,无法实例化,包含很多静态方法,不能实例化,作为工具类
Collections.sort(list)排序,Collections.reverse(list)反转
Arraylist Vector LinkedList三者区别
1三者都是可伸缩数据,动态改变长度的数组。
2ArrayList和Vectory 基于Object[] array来实现存储,会在内存中开辟一块连续的空间来存储,支持下标索引访问,插入效率低,当存储超过容器的初始化大小,均会进行扩容。
3Vectory线程安全,ArrayList LinkedList 线程不安全
HashTable 和HashMap的区别
1HashMap是HashTable轻量级实现,HashMap允许key和value为null但是最多允许一条key为null,而HashTable不允许。
2HashTable 中的方法是线程安全的,而HashMap不是,多线程访问HashMap需提供额外的同步机制。
3HashTable使用Enumeration遍历,HashMap使用迭代器
如何选HashMap Treemap
如果对map进行插入删除或者定位一个元素操作多,用HashMap
对Map进行有序遍历,用TreeMap
HashSet中equals hashCode之间关系
equals和hashCode这两个方法都是从object中继承过来的,equals主要用于判断对象的内存地址引用是否是同一个地址。
hashCode根据定义的hash规则将对象的内存地址转换为hash码
HashSet中的存储元素不能重复,主要通过hashCode与equalst判断存储的两个对象是否相同。
1如果两个对象的hash值不同,对象不相同
2如果hashCode相同,随后比较equals,如果返回true 相同。
拆箱装箱原理
1装箱过程是通过调用包装器valueof方法实现,将原值赋值给对应类
2拆箱过程是通过调用包装器intValue/doubleValue 等方法返回,返回基本数据类型
动态代理方式
1利用JDK反射机制,实现代理接口
2利用CGLIB 对指定类生成与类,
简述OOM
Out of memory
当JVM分配内存不够会抛出out of memory 异常
新建大对象时,容易产生oom异常