==比较基本类型的值,equals比较引用类型的地址
equals是Object的方法,底层还是==实现的,但是有的类重写了equals方法,例如string,重写之后比较的值,如果重写了equals一定要重写hashcode,如果只重写equals不重写hashCode,会在某些场景下导致程序异常执行,也会降低hash类型的集合的效率
HashMap在JDK1.7采用数组+链表实现 HashMap在JDK1.8采用数组+链表+红黑树实现,key不可重复可以为null,线程不安全
扩容机制 默认容量为16,负载因子为0.75,当HashMap中元素个数超过容量*负载因子的时候,数组长度变为两倍,数组长度达到64,链表长度达到8的时候扩容为红黑树
put过程
get过程
线程安全的hashmap JDK1.7 使用分段锁,一个map分为16段,每一段是单独的hashmap,每次使用对其中一段加锁 JDK1.8 采用CAS+Synchronized保证线程安全,插入采用cas版本标记,在其他线程没有操作的时候扩容,删除的时候使用Synchronized去保证并发删除
arraylist是动态数组,满了之后new一个1.5倍的大小,将原来的copy过来,数组查找快,删除慢 linkedlist是链表实现,查找慢,添加数据快
String 由 char[] 数组构成,使用了 final 修饰,对 String 进行改变时每次都会新生成一个 String 对象,然后把指针指向新的引用对象。
StringBuffer可变并且线程安全
StringBuiler可变但线程不安全。
操作少量字符数据用 String;单线程操作大量数据用 StringBuilder;多线程操作大量数据用 StringBuffer。
判断一个对象是否是一个类的实例
boolean res = obj instanceof Class
其中obj为一个对象,如果obj是class的对象或者直接间接继承这个类或者实现了这个接口,就会返回true 否则返回false
new 反射 clone方法 反序列化
按照流向分:输入流和输出流 按照操作单元分:字节流和字符流 按照角色分:节点流和处理流