Java集合大致可以分为Set、 List、 Queue 、Map 四种体系。
其中Set 代表无序,不可重复的集合;List 代表有序、重复的集合;Map 代表具有映射关系的集合,Queue代表一种队列集合实现。
使用Java 8 增强的Iterator 遍历集合元素
Iterator 接口也是Java集合框架的成员,Iterator 主要用于遍历(迭代访问)Collection集合中的元素,Iterator对象也被称为迭代器。
Iterator接口隐藏了各种Collection实现类的底层细节,向应用程序提供了遍历Collection集合元素的统一编程接口。Iterator接口定义了如下四个方法:
1、boolean hasNext();如果迭代器的元素还没有被遍历完,则返回true
2、Object next():返回集合里的下一个元素
3、void remove():删除集合里上一次next方法返回的元素。
4、void forEachRemaining(Consumer action):Java 8 新增
例如:
public static void main(String 【】 args){
//创建集合、添加元素
。。。。。。。。
//获取books集合对应的迭代器
Iterator it = books.iterator();
while(it.hasNext()){
//it.next() 方法返回的数据类型是Object类型,因此 需要强制类型转换
String book = (String)it.next();
System.out.println(book);
if(book.equals("疯狂Java讲义")){
//从集合中删除上一次next()方法返回的元素
it.remove();
}
//对book变量进行赋值,不会改变集合元素本身
book = “测试字符串”;
}
System.out.println(books);
}
Set 集合:
Set 集合不允许包含相同的元素,如果试图把两个相同的元素加入同一个set集合中,则添加操作失败,add()方法返回为false,且新元素不会被加入。
HashSet 具有以下特点:
不能保证元素的排列顺序,顺序可能与添加顺序不同,顺序也有可能发生变化
HashSet 不是同步的,如果多个线程同时访问一个HashSet,假设有两个或者两个以上的线程同时修改了HashSet 集合时,则必须通过代码来保证其同步。
集合元素可以为null
HashSet 集合判断两个元素是否相等的标准是 两个对象通过equals()方法比较相等,并且两个对象的hashCode()方法返回值也相等。
当从HashSet中访问元素的时候,HashSet先计算出该元素的hashCode值,然后直接到该hashCode值对应的位置去取出该元素---这就是HashSet速度很快的原因。
LinkedHashSet
当遍历LinkedHashSet集合里的元素的时候,LinkedHashSet将会按元素的添加顺序来访问集合里的元素。
LinkedHashSet需要使用链表维护元素的插入顺序,因此性能略低于HashSet的性能。
TreeSet :只有当需要一个保持排序的Set时,才应该使用TreeSet,否则都应该使用HashSet。
List 集合:
List集合代表一个元素有序、可重复的集合,集合中每个元素都有其对应的顺序索引。List集合允许使用重复的元素,可以通过索引来访问指定位置的元素。
ArrayList 和 vector 后续 vector 被list替代。
Queue 队列
Map集合:
Map用于保存具有映射关系的数据,因此Map集合里保存着两组值,一组值用于保存Map里的Key,另外一组则用于保存Map里的value,key 和value 都可以是任何引用类型的数据。Map的key不允许重复。
HashMap 和HashTable
HashTable 是一个线程安全的Map实现,但HashMap是线程不安全的实现,所以HashMap比HashTable的性能高一点,但是如果多线程访问同一个Map的时候,使用HashTable实现类会更好。
HashTable不允许使用null作为key 和Value,如果试图把null值放进HashTable中会引发空指针异常,但HashMap可以使用null作为key或者value
各Map实现类的性能分析:
对于Map的常用实现类而言,虽然HashMap和HashTable的实现机制几乎一样,但由于HashTable是一个古老的、线程安全的集合,因此HashMap通常比HashTable要快。
TreeMap 通常比HashMap HashTable要慢,但使用TreeMap有一个好处,TreeMap 中的key-value对 总是处于有序的状态,无需专门进行排序操作。
对于一般的应用场景,程序应该多考虑使用HashMap,因为HashMap正是为了快速查询设计的(HashMap底层其实也是一个采用数组来存储key-value对)。但如果程序需要一个总是排好序的Map时,则考虑使用TreeMap。
LinkedHashMap比HashMap要慢,因为它需要维护链表来保持Map中的key-value时的添加顺序。
操作集合的工具类:Collections
该工具类提供了大量的方法对集合元素进行排序、查询和修改等操作,还提供了将集合对象设置为不可变、对集合对象实现同步控制等方法。