JAVA SE---集合
一、Map
- HashMap
- 初始容量 期望值为n 一般设置为2^x>n/0.75 x的最小值
- 加载因子 默认0.75
- 底层的数据结构为数组+链表。JDK8修改了底层数据,链表长度大于8,则保存为红黑树
- 红黑树 查询时间复杂度O(log n)
- 插入时间复杂度O(log n)+旋转最多2次
- 删除时间复杂度O(log n)+旋转最多3次
- hash冲突 不同对象hash函数计算结果结果相同。四种解决方法。
- 开放地址法 具体未知????
- 再hash法
- 链地址法 ----hashMap使用此方法
- 建立一个公共溢出区 ????
- 遍历数据 使用Iterator迭代器或foreach输出
- 父类AbstractMap
- HashTable
- 基本和HashMap相同,初始容量,加载因子,底层结构
- key值和value值不能为null
- 线程安全,方法使用了synchronized。----建议使用ConcurrentHashMap替换
- 遍历数据 使用Iterator迭代器,Enumeration迭代器,foreach方法
- 父类Dictionary
- LinkedHashMap
- 数据结构 HashMap+双向链表 迭代是可以按照指定顺序(默认是插入顺序)输出
- 父类HashMap
二、Collection
- HashSet 继承AbstractSet,内部使用的数据结构是HashMap
- LinkedHashSet 继承HashSet 内部使用链表维持顺序
- ArrayList和Vector 继承自AbstractList, 内部数据结构为数组, Vector为线程安全;ArrayList非线程安全
- LinkedList 继承自AbstractSequentialList,继承自AbstractList 内部数据结构为链表
三、排序
- ArrayList Vector LinkedList
- 使用list接口sort方法 list.sort(new Comparator<T>(){public int compare(T t1,T t2){return 0;}}); 重写compare方法
- 使用Collections.srot(List<T> list,Comparator<T> c)排序
- HashSet LinkedHashSet TreeSet
- HashSet顺序内部维持,无法排序;LinkedHashSet可以按插入顺序输出;TreeMap可以进行排序,同样可以根据Comparator设置排序规则,new TreeSet(Comparator<T> comparator);
四、复制
- 使用构造函数 List<String> list1=new ArrayList<String>();List<String> list2=new ArrayList<String>(list1);
- 使用addAll方法 List<String> list1=new ArrayList<String>();List<String> list2=new ArrayList<String>();list1.addAll(list2);
- 使用集合类 Collections.copy(dest,src);要求目标dest的元素个数必须等于或大于src元素个数。只是容量不行,必须添加足够数量的元素。
- 使用clone 实现Cloneable接口,重写clone方法,将修饰符改为public
- 使用Object输入流 ,类和类中的属性必须实现Serializable接口
- ByteArrayOutputStream bos=new ByteArrayOutputStream();
- ObjectOutputStream oos=new ObjectOutputStream(bos);
- oos.writeObject(b);
- ObjectInputStream ois=new ObjectInputStream(new ByteArrayInputStream(bos.toByteArray()));
- B b2=(B) ois.readObject();
- 浅复制和深复制
- 方法1和方法2属于浅复制,复制后生成的对象不相等,list1!=list2;但是元素仍然相等,比如list1.get(0)==list2.get(0),为true
- 方法3可以浅复制也可以深复制。比如class B中包含属性Class A,如果在重写B的clone方法时,直接写super.clone,则是浅复制,只能复制当前对象,对象属性则复制引用;要达到深复制,既包含的属性也复制,则需要在重写B的clone方法时,B b=(B)super.clone;b.a=this.a.clone;reutrn b。需要调用成员变量的clone方法,给新对象重写赋值
- 方法4为深复制,条件为类和类的成员变量实现Serializable方法
- 浅复制为直接复制当前对象,副本和本体不相等(==),但是其成员变量只是复制了引用还是指向同一个对象;
- 成员变量为基本类型,String,包装类型时,即使浅复制也能达到深复制的效果。比如,List中为String对象,则直接使用addAll即可,不会影响,因为String对象不能修改。
五、线程安全
六、数组和集合转换
- Collection转换为数组
- Object[] os=new ArrayList<String>().toArray();返回的为Object元素的数组,同样为浅复制
- String[] ss=new ArrayList<String>().toArray(new String[]{});入参为数组,返回值也为数组。如果入参数组个数小于集合元素个数,则创建新数组并返回;如果入参数组元素个数等于或大于集合元素个数,则将数据复制到入参数组中,并将入参数组返回
- 数组转换为集合
- String[] ss=new String[4];List<String> ls=Arrays.asList(ss);此处生成的类是Arrays的静态内部类,不是java.util.ArrayList;这个集合直接将引用赋值给List中数组变量。生成的List不能进行add,remove操作;这个不仅是浅复制,因为不仅元素是同一个对象,内部数组也是同一个对象。浅复制,元素为同一个对象,但是内部数组为不同对象;对数组的操作,直接反应到返回的List中


浙公网安备 33010602011771号