Java基础

Java基础
Java基础
1.集合类
1.1.Collection
1.1.1.List
ArrayList
• 扩容1.5倍
• 线程不安全
• 例:A线程向list中添加1-10,B线程向list中添加11-20,最后list中元素是混乱的
LinkList
• 双向链表节点对应的类Node的实例,Node中包含成员变量
• prev
• 该节点的上一个节点
• next
• 该节点的下一个节点
• item
• 该节点所包含的值
• 分两半查找,先判断index是在链表的哪一半,然后再去对应区域查找
1.1.2.Set
HashSet
• 元素是无序的
TreeSet
• 树形结构实现,元素是有序的
1.2.Map
1.2.1.HashMap
允许键和值是null
线程不安全
• 在put的时候,插入的元素超过了容量(由负载因子决定)的范围就会触发扩容操作,就是rehash,这个会重新将原数组的内容重新hash到新的扩容数组中
• A线程和B线程同时对同一个数组位置调用addEntry,两个线程会同时得到现在的头结点,然后A写入新的头结点之后,B也写入新的头结点,那B的写入操作就会覆盖A的写入操作造成A的写入操作丢失
• 当多个线程同时调用resize操作,各自生成新的数组并rehash后赋给该map底层的数组table,结果最终只有最后一个线程生成的新数组被赋给table变量,其他线程的均会丢失。而且当某些线程已经完成赋值而其他线程刚开始的时候,就会用已经被赋值的table作为原始数组,这样也会有问题
底层采用一个Node[]数组来保存所有的key-value对
存储一个Node对象时,会根据key的hash算法来决定其在数组中的存储位置,再根据key值决定其在该数组位置上的链表中的存储位置
初始长度为16,扩容必须是2的幂
• index = HashCode(Key) & (Length - 1)
• 16-1=15 的二进制就是1111,把1111看成四个通道,表示跟1111 做&运算后分布是均匀的,假如1010,这样就相当于有两个通道是关闭的,所以计算出来的索引重复的几率比较大
hash冲突
• 键值的hashcode相同,它们的存储位置就相同。如果key不同,那么就会产生hash冲突
• HashMap的单个bucket里存储的不是一个 Entry,而是一个 Entry 链
1.2.2.Hashtable
不允许键或者值是null
remove,put,get方法都有synchronized修饰
底层使用数组实现,数组中每一项是个单链表,即数组和链表的结合体
底层采用一个Entry[]数组来保存所有的key-value对
存储一个Entry对象时,会根据key的hash算法来决定其在数组中的存储位置,在根据equals方法决定其在该数组位置上的链表中的存储位置
取出一个Entry时,也会根据key的hash算法找到其在数组中的存储位置,再根据equals方法从该位置上的链表中取出该Entry
1.2.3.ConcurrentHashMap
将Map分段,每个段进行加锁
2.cookie、session
2.1.cookie
2.1.1.客户端可以禁用cookie
2.1.2.cookie只能存储String类型的对象
2.2.session
2.2.1.客户端无法禁用服务端的session
2.2.2.session能够存储任意的Java对象
3.final、finally、finalize
3.1.final
3.1.1.修饰属性
属性不可变
3.1.2.修饰方法
方法不可覆盖
3.1.3.修饰类
类不可继承
3.2.finally
3.2.1.异常处理语句结构的一部分,表示总是执行
3.3.finalize
3.3.1.Object类的方法,在垃圾收集器执行的时候会调用被回收对象的此方法
4.基本数据类型
4.1.byte
4.1.1.Byte
4.2.int
4.2.1.Integer
4.3.char
4.3.1.Character
4.4.long
4.4.1.Long
4.5.float
4.5.1.Float
4.6.double
4.6.1.Double
4.7.boolean
4.7.1.Boolean
4.8.short
4.8.1.Short
5.equals、==
5.1.==
5.1.1.用于基本数据类型,比较的是值
5.1.2.引用数据类型:比较的是在堆内存地址是否相等
5.1.3.凡是与new的对象比较,必须是同一对象,特殊情况是基本数据类型和String的常量池,String常量池里面的值唯一,因此值相同,地址相同,成立
5.1.4.基本数据类型和其包装类比较,会自动拆装箱,值相同
就成立
5.2.equals
5.2.1.没有覆写equals()方法时,比较的是值,与==一致
5.2.2.覆盖 equals() 方法来比较两个对象的内容是否相等
5.3.hashCode
5.3.1.equals()相等,hashCode一定相等
5.3.2.equals()不相等,hashCode不一定不相等,可能存在地址冲突
5.3.3.hashCode相等,对象不一定equals,因为可能存在地址冲突
5.4.String s=“abc”
5.4.1.先在常量池中查找有没有一个值为"abcd"的对象
有,把它赋给当前引用。即原来那个引用和现在这个引用指点向了同一对象
没有,则在常量池中新创建一个
只要值相等,任何多个引用都指向常量池中同一对象
5.5.String str=new String (“hello”)
5.5.1.不管堆空间是否已经有"hello"这个对象,都新建一个对象保存"hello"
5.5.2.如果常量池中已经存在"hello",那么就不会额外在常量池中生成引用
5.6.intern()
5.6.1.jdk1.6
检查字符串池里是否存在"hello"这么一个字符串,如果存在,就返回池里的字符串;如果不存在,该方法会把"hello"添加到字符串池中,然后再返回它的引用
5.6.2.jdk1.7
https://blog.****.net/seu_calvin/article/details/52291082
6.Object下方法
6.1.hashCode()
6.2.equals()
6.3.toString()
6.4.notify()
6.5.notifyAll()
6.6.wait()
6.7.finalize()