java集合的主要分为三种类型:


  • Set(集)
  • List(列表)
  • Map(映射)

list与Set、Map 区别及适用场景

1、List,Set都是继承自Collection接口

     List特点:元素有放入顺序,元素可重复 ,list支持for循环

               for循环,通过下标来遍历,也可以用迭代器;

插入删除元素效率低,因为会引起其他元素位置改变, 

     Set特点:元素无放入顺序,元素不可重复,重复元素会覆盖掉;

             set只能用迭代,因为他无序,无法用下标来取得想要的值。

            (注意:元素虽然无放入顺序,但是元素在set中的位置是有该元素的HashCode决定的,其位置其实是固定的,加入Set 的Object必须定义equals()方法)

//1: for循环和get()方法: 

for(int i=0; i<list.size();i++){  
 
System.out.println(list.get(i));  
 
}  
//2: 使用 迭代器(Iterator): 

Iterator it=list.iterator();  
 
while(it.hashNext()){  
 
System.out.println(it.next());  
 
}



2、 Map:适合储存键值对的数据 ;Map 是一种把键对象和值对象映射的集合,它的每一个元素都包含一对键对象和值对象。 Map没有继承于Collection接口 从Map集合中检索元素时,只要给出键对象,就会返回对应的值对象。

HashMap与TreeMap、HashTable的理解

HashMap 非线程安全  

HashMap:基于哈希表实现。

         使用HashMap要求添加的键类明确定义了hashCode()和equals()[可以重写hashCode()和equals()],为了优化HashMap空间的使用,您可以           调优初始容量和负载因子。 

TreeMap:非线程安全基于红黑树实现。TreeMap没有调优选项,因为该树总处于平衡状态。 


适用场景分析:

HashMap和HashTable:HashMap去掉了HashTable的contains方法,但是加上了containsValue()和containsKey()方法。HashTable同步的,而HashMap                    是非同步的,效率上比HashTable要高。HashMap允许空键值,而HashTable不允许。

HashMap:适用于Map中插入、删除和定位元素。 

Treemap:适用于按自然顺序或自定义顺序遍历键(key)。 

总结

1. 如果涉及到堆栈,队列等操作,应该考虑用List,对于需要快速插入,删除元素,应该使用LinkedList,如果需要快速随机访问元素,应该使用ArrayList。

2. 如果程序在单线程环境中,或者访问仅仅在一个线程中进行,考虑非同步的类,其效率较高,如果多个线程可能同时操作一个类,应该使用同步的类。

3. 在除需要排序时使用TreeSet,TreeMap外,都应使用HashSet,HashMap,因为他们 的效率更高。

4. 要特别注意对哈希表的操作,作为key的对象要正确复写equals和hashCode方法。

5. 容器类仅能持有对象引用(指向对象的指针),而不是将对象信息copy一份至数列某位置。一旦将对象置入容器内,便损失了该对象的型别信息。

6. 尽量返回接口而非实际的类型,如返回List而非ArrayList,这样如果以后需要将ArrayList换成LinkedList时,客户端代码不用改变。这就是针对抽象编程。

注意


1、Collection没有get()方法来取得某个元素。只能通过iterator()遍历元素。

2、Set和Collection拥有一模一样的接口。

3、List,可以通过get()方法来一次取出一个元素。使用数字来选择一堆对象中的一个,get(0)...。(add/get)

4、一般使用ArrayList。用LinkedList构造堆栈stack、队列queue。

5、Map用 put(k,v) / get(k),还可以使用containsKey()/containsValue()来检查其中是否含有某个key/value。

      HashMap会利用对象的hashCode来快速找到key。

6、Map中元素,可以将key序列、value序列单独抽取出来。

使用keySet()抽取key序列,将map中的所有keys生成一个Set。

使用values()抽取value序列,将map中的所有values生成一个Collection。


为什么一个生成Set,一个生成Collection?那是因为,key总是独一无二的,value允许重复。