【4】JAVA中集合框架基础解析

0、接口Map和Collection在层次结构没有任何亲缘关系,它们是截然不同的。Collection 下有list,queue,set。

1、ArrayList    底层是数组结构,特点:查询快,增删慢。数组初始10,按照(旧容量*3)/2+1。线程不同步
      LinkedList   底层使用的链表数据结构,特点相反。线程不安全
      注意:List list = new ArrayList(); 10-16-25-38         List list = new ArrayList(4); 4-7-11-17-26

       ArrayList内部机制实际上使用的Object数组,当容量不够的时候就创建更大的数组将老数组拷贝过去,JVM会自动进行垃圾收集。LinkedList不安全处理方案:LinkedList全部换成ConcurrentLinkedQueue或者List<String> linkedList = Collections.synchronizedList(new LinkedList<String>()),对于不同的情况区分对待,即便在处理线程问题时,也会因为底层数据结构,设计实现的不同,导致性能有较大差异。在保证线程安全时,对于性能测试分析,可参看源码。

2、  HashSet 底层的数据结构是哈希表。无序,不重复。线程是非同步的。
       HashSet是如何保证元素唯一性?是通过元素的两个方法:hashCode和equals来完成。 
       如果元素的hashcode值相同,才会判断equals是否为true, 如果元素的hashcode值不同,不会调用equals,对于判断元素是否存在,以及删除等操作,依赖的方法是元素的hashcode和equals方法

3、TreeSet。可以对Set集合中的元素进行排序(自然顺序即ascii),如果集合中元素,是复杂对象,需要对元素实现比较器,否则会报错。因为TreeSet默认会为对象进行自然排序(对象没有继承Comparable),如果直接往TreeSet里面添加多个自定义对象,那么TreeSet不知道如何排序,就会报错。
       底层数据结构是二叉树。
       保证元素唯一性的依据:compareTo方法return 0。与hashcode无关,它走的是二叉树,通过比较得出元素是否相等,相等的话就不能存了。

4、HashTable:  底层是哈希表结构,不可以存入Null键和Null值。线程同步
     HashMap:    底层是哈希表数据结构,允许使用Null键和Null值,不同步。替代前者
     TreeMap:    底层是二叉树数据结构。不同步。可以用于给map中的key排序
   注意:HashMap存元素时,key一样,后者覆盖前者
              TreeMap存放元素时,原理跟TreeSet一样,会按着key的自然排序进行。
             Collection <String> coll = map.values();

5、Collections:集合工具类。
   Collections.sort(List);  -- 自然排序
   Collections.sort(List, new MyComparator()); -- 自定义比较器排序
   Collections.binarySearch() -- 存入的元素必须要有比较性
   Collections.reverseOrder(Comparator<T> cmp) 返回一个比较器,它强行逆转指定比较器的顺序。 

6、Arrays:用于操作数组的工具类。里面都是静态方法。
   Arrays.asList  数组变集合    Collection.toArray 集合变数组。这些方法参考API

7、可变参数。public void show(int... arr) ——> public void show(int[] arr)  show(1,2,3)
   其实就是一种数组参数的简写形式。不用每一次都手动的建立数组对象。只要将要操作的元素作为参数传递即可。
   隐式将这些参数封装成了数组。
   使用时注意:可变参数一定要定义在参数列表的最后面

8、迭代器:

[8-1]Iterator可以应用于所有的集合,Set、List和Map和这些集合的子类型。而ListIterator只能用于List及其子类型。
[8-2]ListIterator有add方法,可以向List中添加对象,而Iterator不能。
[8-3]ListIterator和Iterator都有hasNext()和next()方法,可以实现顺序向后遍历,但是ListIterator有hasPrevious()和previous()方法,可以实现逆向(顺序向前)遍历。Iterator不可以。
[8-4]ListIterator可以定位当前索引的位置,nextIndex()和previousIndex()可以实现。Iterator没有此功能。
[8-5]都可实现删除操作,但是ListIterator可以实现对象的修改,set()方法可以实现。Iterator仅能遍历,不能修改。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值