JAVA SE---集合

一、Map

  1. 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
  2. HashTable
    • 基本和HashMap相同,初始容量,加载因子,底层结构
    • key值和value值不能为null
    • 线程安全,方法使用了synchronized。----建议使用ConcurrentHashMap替换
    • 遍历数据  使用Iterator迭代器,Enumeration迭代器,foreach方法
    • 父类Dictionary
  3. LinkedHashMap
    • 数据结构  HashMap+双向链表    迭代是可以按照指定顺序(默认是插入顺序)输出
    • 父类HashMap

二、Collection

  1. HashSet   继承AbstractSet,内部使用的数据结构是HashMap
  2. LinkedHashSet 继承HashSet  内部使用链表维持顺序
  3. ArrayList和Vector   继承自AbstractList,   内部数据结构为数组,   Vector为线程安全;ArrayList非线程安全
  4. LinkedList  继承自AbstractSequentialList,继承自AbstractList    内部数据结构为链表

三、排序

  1. 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)排序  
  2. HashSet   LinkedHashSet   TreeSet
    • HashSet顺序内部维持,无法排序;LinkedHashSet可以按插入顺序输出;TreeMap可以进行排序,同样可以根据Comparator设置排序规则,new TreeSet(Comparator<T> comparator);

四、复制

  1. 使用构造函数    List<String> list1=new ArrayList<String>();List<String> list2=new ArrayList<String>(list1);
  2. 使用addAll方法  List<String> list1=new ArrayList<String>();List<String> list2=new ArrayList<String>();list1.addAll(list2);
  3. 使用集合类        Collections.copy(dest,src);要求目标dest的元素个数必须等于或大于src元素个数。只是容量不行,必须添加足够数量的元素。
  4. 使用clone   实现Cloneable接口,重写clone方法,将修饰符改为public
  5. 使用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();
  6. 浅复制和深复制
    • 方法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对象不能修改。

五、线程安全

六、数组和集合转换

  1. Collection转换为数组
    • Object[]  os=new ArrayList<String>().toArray();返回的为Object元素的数组,同样为浅复制
    • String[]   ss=new ArrayList<String>().toArray(new String[]{});入参为数组,返回值也为数组。如果入参数组个数小于集合元素个数,则创建新数组并返回;如果入参数组元素个数等于或大于集合元素个数,则将数据复制到入参数组中,并将入参数组返回
  2. 数组转换为集合
    • String[] ss=new String[4];List<String> ls=Arrays.asList(ss);此处生成的类是Arrays的静态内部类,不是java.util.ArrayList;这个集合直接将引用赋值给List中数组变量。生成的List不能进行add,remove操作;这个不仅是浅复制,因为不仅元素是同一个对象,内部数组也是同一个对象。浅复制,元素为同一个对象,但是内部数组为不同对象;对数组的操作,直接反应到返回的List中

posted @ 2018-03-05 19:54  国际庄_码农  阅读(122)  评论(0)    收藏  举报