Java基础之集合

首先说一下Java都有哪些集合:
 

Java API中所用的集合类,都是实现了Collection接口,他的一个类继承结构如下:


Collection<--List<--Vector

Collection<--List<--ArrayList

Collection<--List<--LinkedList

Collection<--Set<--HashSet

Collection<--Set<--HashSet<--LinkedHashSet

Collection<--Set<--SortedSet<--TreeSet

Vector :
基于Array的List,其实就是封装了Array所不具备的一些功能方便我们使用,它不可能走入Array的限制。性能也就不可能

超越Array。所以,在可能的情况下,我们要多运用Array。另外很重要的一点就是Vector“sychronized”的,这个也是Vector和

ArrayList的唯一的区别。

ArrayList:
同Vector一样是一个基于Array上的链表,但是不同的是ArrayList不是同步的。所以在性能上要比Vector优越一些,但

是当运行到多线程环境中时,可需要自己在管理线程的同步问题。

LinkedList:
LinkedList不同于前面两种List,它不是基于Array的,所以不受Array性能的限制。它每一个节点(Node)都包含两方

面的内容:1.节点本身的数据(data);2.下一个节点的信息(nextNode)。所以当对LinkedList做添加,删除动作的时候就不用像

基于Array的List一样,必须进行大量的数据移动。只要更改nextNode的相关信息就可以实现了。这就是LinkedList的优势。



ArrayList与Vector的区别

  1. 两者都是基于索引,内部结构是数组
  2. 元素存取有序并都允许为null
  3. 都支持fail-fast机制
  4. Vector是同步的,不会过载,而ArrayList不是,但ArrayList效率比Vector高,如果在迭代中对集合做修改可以使用CopyOnWriteArrayList 
  5. 初始容量都为10,但ArrayList默认增长为原来的50%,而Vector默认增长为原来的一倍,并且可以设置
  6. ArrayList更通用,可以使用Collections工具类获取同步列表和只读列表

ArrayList与LinkedList的区别

  1. 两者都是List接口的实现类
  2. ArrayList是基于动态数组的数据结构,而LinkedList是基于链表的数据结构
  3. 对于随机访问get和set(查询操作),ArrayList要优于LinkedList,因为LinkedList要移动指针
  4. 对于增删操作(add和remove),LinkedList优于ArrayList
  5. 当需要对数据进行对此访问的情况下选用ArrayList,当需要对数据进行多次增加删除修改时采用LinkedList       
  6.  

List总结:1. 所有的List中只能容纳单个不同类型的对象组成的表,而不是Key-Value键值对。例如:[ tom,1,c ]; 2. 所有的List中可以有相同的元素,例如Vector中可以有 [ tom,koo,too,koo ]; 3. 所有的List中可以有null元素,例如[ tom,null,1 ]; 4. 基于Array的List(Vector,ArrayList)适合查询,而LinkedList(链表)适合添加,删除操作

 

HashSet:

  是基于哈希算法的set接口实现,有如下一些特点:

        当遍历HashSet集合时,其中的元素是没有顺序的。

        其中不允许重复元素的出现,要重写equals方法来判断是否重复。这里的重复是指相同的哈希码,并且调用equals方法比较         时返回为true的两个元素对象。

        允许包含null元素。

TreeSet:

  TreeSet不仅实现Set集合,还实现了SortedSet接口的,从而保证了集合中的对象是按照一定的顺序来排序的。当向TreeSet集合中添加一个对象时,会把它插入到有序的对象序列中。但是这种排序并不是按照对象添加的顺序排序的,而是按照一定的算法来排序的。其中TreeSet集合中也有一些独有的方法比如:

  • first();返回TreeSet中第一个元素。
  • last();返回TreeSet集合中最后一个元素。
  • pollFirst();获取并删除第一个元素。
  • pollLast();获取并删除最后一个元素。
  • higher(Object o);返回此集合中严格大于给定元素的最小元素。集合最小的元素都要比给定的大才能满足。
  • lower(Object o);返回此集合中严格小于给定元素的最大元素。集合中最大的元素都要比给定元素小才能满足。
  • headSet(Object o);返回集合的部分视图,其元素严格小于指定元素o。
  • tailSet(Object o);返回集合的部分视图,其元素严格大于制定元素o。

Map集合:

  Map映射集合是java集合框架中,不同于Collection接口的另一个重要接口。它对应的是一种从键(Key)到值(value)的对应关系的集合。也就是说,map类型的集合对象容器中保存着两组对象,一组对象用于保存Map里的key,另外一组用于保存value。key和value可以是任何引用类型的数据。其中key不能重复,但是value可以重复。这两者存在着单向的一对一的关系,即通过key可以找到与之对应的唯一的value值。Map接口定义了Map集合所共有的方法,这些方法分为三类:基本操作、批量操作、Collection视角操作。Collection视角操作提供了将map转化为Collection的手段。

  • 基本操作:
  1. get(Object key);返回与指定键相关的值
  2. put(Object key,Object value);向该映射中添加键值对
  3. remove(Object o);从映射中删除包含指定的键的键值对
  4. containsKey(Object key);如果该映射包含key值,则返回true
  5. containsValue(Object value);如果该映射包含value值,则返回true
  6. size();返回该映射对象中包含的键值对映射关系数
  7. isEmpty();如果该映射为空,则返回为true
  • 批量操作:
  1. clear();删除映射内所有元素。
  2. putAll(Map m);将指定映射中所有映射关系复制到此映射中。
  • Colletion视角操作:
  1. keySet();返回一个包含映射中所有的Key的Set对象。
  2. values();返回一个包含映射中所有的value的Collection对象。
  3. entrySet();返回一个包含该Map中所有条目的Set对象,条目由内部接口Entry定义。

HashMap和HashTable的区别 
1. 都是基于hash表实现的,每个元素都是key-value对,内部都是通过单向链表解决冲突,容量都会自动增长 
HashMap默认容量为16,每次扩容变为原来的2倍,HashTable初始容量为11,每次扩容变为原来的2倍加1 
2. HashMap继承自AbstractMap类,HashTable继承自Dictionary类, 
3. HashTable是同步的,适合多线程环境,而HashMap不是,但效率相对较高 
4. HashMap允许key和value为null,而HashTable不允许 
5. Hash值的使用不同,HashTable直接使用对象的hashcode值,而HashMap重新计算hash值 
6. 在Java1.4中引入了HashMap的子类LinkedHashMap,若需要遍历顺序,可以从HashMap转向LinkedHashMap, 而HashTable的顺序是不可预知的 
7. HashMap提供对key的Set进行遍历,因此它支持fail-fast机制,而HashTable提供对key的Enumeration进行遍历,不支持fail-fast 
8. HashTable被认为是个遗留的类,如果在迭代的时候修改Map,可以使用ConcurrentHashMap(Java5出现) 
9. HashTable产生于JDK1.1,而HashMap产生于JDK1.2

 

HashSet与TreeSet

  1. HashSet不能保证元素的排列顺序,TreeSet是SortedSet接口的唯一实现类,可以确保集合元素处于排序状态
  2. HashSet底层用的是哈希表,TreeSet采用的数据结构是红黑树
  3. HashSet中元素可以是null,但只能有一个,TreeSet不允许放入null

适用场景分析: 
HashSet是基于Hash算法实现的,其性能通常都优于TreeSet。我们通常都应该使用HashSet,在我们需要排序的功能时,我们才使用TreeSet。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值