Java集合类
Java集合类
Java集合大致分为Set,List,Queue和Map四类。Set代表无顺、不可重复的结合;List代表有序、重复的集合;而Map 代表ket-value具有映射关系的集合,Queue代表一种队列集合的实现。
Java集合类:java.util.*包
Java的集合类主要是由两个接口派生出来:Collection和Map,Collection和Map是Java集合框架的根接口,这两个接口包含了一些子接口和实现类。
Collection和Iterator接口
Collection接口是List、Set和Queue接口的父接口,该接口里定义的方法既可以用于操作Set集合,也可以用于操作List和Queue结合。
Collection接口的操作元素的方法:
boolean add(Object o) 该方法用于向集合里添加一个元素。如果集合对象被添加操作改变了,则返回true。
boolean addAll(Collection c)该方法把集合c里的元素添加到指定集合里。
void clear()清除集合里的所有元素,将集合长度变为0。
boolean contains(Object o) 返回集合里是否包含c里的所有元素
boolean containsAll(Collection c)返回集合里是否包含集合c里的所有元素
boolean isEmpty()返回集合是否为空。当集合长度为0时返回true,否则返回false。
Iterator iterator()返回一个Iterator对象,用于遍历集合里的元素。
boolean remove(Object o) 删除集合中的指定元素o,当集合中包含一个或多个元素o时,该方法只删除第一个符合条件的元素,并返回true。
boolean removeAll(Collection c) 从集合里删除集合c里包含的元素。
boolean retainAll(Collection c) 从集合里删除集合c里不包含的元素(相当于把调用该方法的集合变成该集合和集合c的交集)。
Object[] toArray() 该方法把集合转换成一个数组,所有的集合元素变成对应的数组元素。
Iterator接口
Iterator接口是Java集合框架的成员,是Collection接口的父接口,隐藏了各种Collection实现类的底层细节。
Iterator定义的方法:
boolean hasNext()如果被迭代的集合元素还没有被遍历完,则返回true。
Object next()返回集合里的下一个元素。
void remove()删除集合里上一次next方法返回的元素。
void forEachRemaining(Consumer action)该方法可以使用Lambda表达式来遍历集合元素。
1 @Slf4j 2 public class ListTest { 3 public static void main(String[] args){ 4 List<String> list = Lists.newArrayList(); 5 list.add("Mark"); 6 list.add("Jack"); 7 list.add("Bob"); 8 Iterator<String> iterator = list.iterator(); 9 while (iterator.hasNext()){ 10 String name = iterator.next(); 11 log.info("name:{}", name); 12 } 13 } 14 }
使用Lambda表达式来遍历:iterator.forEachRemaining(o -> log.info("name:{}", o));
Iterator快速失败机制(fast-fail机制):
Iterator在迭代过程中,检测到该集合已经被修改(通常是程序中的其他线程的修改),程序将引发ConcurrentModifyException异常,而不是显示修改后的结果,这样可以避免共享资源引发的
潜在问题。HashSet和List一般都会发生异常。
Set集合
Set集合不允许包含相同的元素,都集成了Set接口,具有HashSet,TreeSet和EnumSet这三个实现类,三个实现类还各有特色。
HashSet按照hash算法存储集合中的元素,因此具有很好的存取和查找性能。
特点:1.不能保证元素排列的先后顺序;2.HashSet不是同步的;3.集合元素值可以是null。
4.hashSet中存储的对象需要重写equals()和HashCode()方法,尽量保证equals()返回true的对象,其hashCode()方法返回的值也相等。
LinkedHashSet是HashSet的一个子类,LinkedHashSet集合也是根据hashCode值来决定元素的存储位置,但是它同时需要使用链表来维护元素的次序,这样使得元素看起来是以插入的顺序来保存的。LinkedhashSet需要维护元素的插入顺序,因此性能略低于HashSet的性能,但是在遍历Set里的全部元素时,将具有很好的性能。因为它以链表来维护内部元素的顺序。
TreeSet类
TreeSet是SortedSet接口的实现类,TreeSet可以确保集合中的元素处于排序状态。
额外方法:Comparator comparator()如果采用了定制排序,该方法返回一个Comparator
Object first()返回结合中的第一个元素
Object last()返回集合中的最后一个元素
Object lower(Object C)返回集合中位于指定元素之前的元素
Object higher(Object c)返回集合位于指定元素之后的元素
SortedSet subSet(Object fromElement, Object toElement)返回从fromElement到toElement(不包含)之间的元素组成的子Set集合。
Sorted headSet(Object toElement)返回小于toElement元素组成的集合
Sorted tailSet(Object fromElement)返回大于FromElement元素所组成的集合
TreeSet采用红黑树的数据结构来存储集合元素。元素的排序方式分为:自然排序和定制排序。