集合
- 1.你工作中常用的集合
- 1.1Collection和Map两大类
- Collection下面的子类
- List,ArrayList,Vector,Stack,Set,HashSet,TreeSet
- 图解
- 几种集合的优缺点
- Collection集合框架的根接口
- 子接口List:有序,可重复
- 三个实现类:Arraylist,LinkedList,Vector
- ArrayList:
- 特点:
- 底层数据结构是数组,查询快,增删慢,线程不安全,效率高,有序,可重复
- 构造方法:
- 无参,初始容量为10
- 特点:
- Vector:
- 特点:
- 底层数据结构是数组,查询快,增删慢,线程安全,效率低
- 构造方法:
- 无参,初始容量为10
- 特有的方法
- 添加(addElement(Object obj):添加元素到集合中获取Enumeration对象,elements():获取Enumeration对象,用于遍历集合中元素)
- Enumeration方法:
- hasMoreElment():判断集合中是否还有元素
- nextElment():获取遍历到的元素
- Enumeration方法:
- 添加(addElement(Object obj):添加元素到集合中获取Enumeration对象,elements():获取Enumeration对象,用于遍历集合中元素)
- 特点:
- LinkedList:
- 特点
- 底层数据结构是链表,查询慢,增删快,线程不安全,效率高
- 构造方法:
- 无参
- 特有方法
- 特点
- ArrayList:
- Arrlist和linklist
- 相同点
- 1.Arrlist和linklist都实现了以下接口
- java.util.List, Cloneable, java.io.Serializable由于支持这些接口,所以都支持泛型,都能够支持克隆,能够实现序列化.
- 2.ArrayList和LinList都不是线程安全的:
- 如果要在多线程的情况下调用他们,可以使用Collertions类中的静态方法SynchronizedList()
- 如果要在多线程的情况下调用他们,可以使用Collertions类中的静态方法SynchronizedList()
- 1.Arrlist和linklist都实现了以下接口
- 不同点
- 数据结构实现:ArrayList是动态数组的数据结构实现,而LinkedList是双向链表的数据结构实现
- 随时访问效率:ArrayList比LinkList在随机访问的时候效率要高,因为LinkedList是线性的数据存储方式,所以需要移动指针从前往后依次查找
- 增加和删除的效率:在非首尾的增加和删除的操作,Linkelist要比Ar'ra'yList效率要高,因为ArrayList增加的操作要影响数据内的其他数据的下标
- 总结:
- 在需要频繁读取集合重的元素时,使用Arrlist,而在插入和删除数据的操作比较多的时候,更推荐LinkedList.
- 相同点
- 三个实现类:Arraylist,LinkedList,Vector
- 子接口Set:无序,不可重复
- 三个实现类:HashSet,LinkedHashSet,TreeSet
- HashSet
- 底层数据结构是哈希表(如何保证数据的唯一性)
- 1.先比较hashCode()方法的返回值是否存在
- 2.如果返回结果是存在的,再去比较equals(),如果返回值为true,代表数据唯一,添加不到集合中
- 底层数据结构是哈希表(如何保证数据的唯一性)
- TreeSet:
- 可以保证元素进行排序以及去重(如何实现排序,如何实现去重呢)
- 1.自然排序:
- 让自定义的类实现Comparable接口,重写compareTo方法实现比较规则,这种方式就是自然排序
- 2.比较器排序
- 不需要让自定义恶类实现Comparable接口,但是需要创建TreeSet集合的时候使用一个参数的构造方法传入一个Comparator接口的对象.
- 3.实现去重
- 无论是哪种排序规则,只要比较后结果为0就是代表元素重复,添加不到集合重去.
- 1.自然排序:
- 可以保证元素进行排序以及去重(如何实现排序,如何实现去重呢)
- LinkedHashSet
- 有序不可重复
- 有序:
- 底层数据结构是链表来保证元素有序
- 不可重复:底层数据结构是哈希表保证数据唯一.
- HashSet
- 三个实现类:HashSet,LinkedHashSet,TreeSet
- 子接口List:有序,可重复
- Collection集合框架的根接口
- Map下面的子类
- HashMap,LinkedHashMap,TreeMap,ConcurrentHashMap,Hashtable
- 图解
- 几种集合的优缺点
- hashMap
- 面试问题
- 线程是否安全
- HashMap是线程不安全的
- 多线程并发情况下
- JDK1.8以前的版本
- 1.Hashmap在插入元素过多的时候需要进行Reesize,Resize的条件是:HashMap.Size>=Capacity*LoadFactor
- 2.Hashmap的Resize包含扩容和ResHash两个步骤,ReHash在并发的情况下可能形成链表化.
- JDK1.8中
- JDK1.8以前的版本
- 实现线程安全的方式有几种,优缺点
- hashmap的特性(存储,遍历)
- Map的存储的结构图
- HashMap:他根据健的hashCode(哈希)值存储数据,大多数情况下直接定位到他的值,因而具有很快的访问速度,但遍历顺序却是不确定的,HashMap最多只允许一条记录的健为null,允许多条记录的值为null,HashMap非线程安全,即任一时刻可以线程同时写HashMap,可能会导致数据的不一致,如果需要满足线程安全,可以用Collections的synchronizedMap方法使HahMap具有线程安全的能力,或者使用ConcurrentHashMap
- Hashtable:Hashtable是遗留类,很多映射的常用的功能与HashMap类似,不同的是他承自Dictionary类,并且线程安全的,任一时间只有一个线程能写Hashtable,并发性不如ConcurrentHashMap,因为ConcurrentHashMap引入了分段锁,Hashtable不建议在新代码使用,不需要线程安全的场合可以用HashMap替换,需要线程安全的场合可以用ConcurrentHashMap的替换
- TreeMap:TreeMap实现SoryedMap接口,能够把他保存的记录排序的映射,建议使用TreeMap,在使用TreeMap时,key必须实现Comparable接口或者在构造TreeMap传入自定义的Comparator,否则会在运行时抛出java.lang.ClassCastException类型的异常,对于上述四种Map类型的类,要求映射中的key是不可变对象,是对象是该对象在创建后它的哈希值不会被改变,如果对象的哈希值发送变化,Map对象很可能定位不到映射的位置了.
- LinkedHashMap:LinkedHashMap是HashMap的一个子类,保存了记录的插入顺序,在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的,也可以在构造时带参数,按照访问次序排序。
- Map的存储的结构图
- 底层
- 面试问题
- hashMap
- Collection下面的子类
- 1.2数据结构类型
- 栈:先进后出
- 队列:先进先出
- 数组:具有索引,查询快,长度不可以改变,增删慢
- 链表:链表保证有序,能在指定的位置进行删除和插入但每次查询都要从头开始:总结:增删快,查询慢.
- 1.3泛型和增强for循环
- 泛型的好处
- 把运行时期的问题提前到了编译期间
- 避免了强制类型的转换
- 优化了程序的设计,解决了黄色警告线的问题,让程序更加安全
- 增强for循环
- 简化了数组和集合的遍历(本质是迭代器,可以替代迭代器)
- 好处:简单,简于书写
- 泛型的好处
- 1.4集合(使用场景与原理1.8版本与1.8版本之前)
- 1.1Collection和Map两大类