Java集合类——2017.08.05
Posted 成长源于渐悟与顿悟1
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java集合类——2017.08.05相关的知识,希望对你有一定的参考价值。
一 Java集合类
是什么?干什么用?是一种工具类,可用于储存数量不等的对象,可以实现常见的数据结构。
有什么东西?主要是四大类Set、List、Queue、Map四种体系
集合类与数组类的区别?集合类只能保存对象,数组元素即可以保存基本数据类型,又可以保存对象。
Set:无序、不可重复的集合
List:有序,可重复的集合
Queue:队列
Map:具有映射关系的集合
这四个都是集合类的接口,其中Set、List、Queue是Collection的子接口,Map是一个接口
Iterator和Iterable的区别?
Iterable是接口,从JDK1.1就开始存在,Iterator是也是接口从JDK1.2开始。Iterable是超级接口,Collection和Map都继承它,而Iterator主要是迭代接口,有三个主要方法分别是hasNext():如果仍有元素可以迭代,返回true。next():返回迭代的下一个元素。remove():从迭代器指向collection中移除迭代器返回的最后一个元素。JDK1.8之前,Iterable接口里面只有一个方法:生成iterator()。可以理解为Iterable是Iterator的父类。
二 Set集合
Set集合是什么:类似一个罐子,无序、不可重复。不能保证装入的顺序是否一致,接口都这样定义了,所以实现类HashSet、TreeSet、LinkedSet、EnumSet等都遵循这个规律。
HashSet是Set的典型实现类具有以下特点:1 不能保证元素的排列顺序 2HashSet是不同步的 3集合元素的值可以是null。储存原理:向HashSet集合中存入一个元素,HaseSet会调用该对象的hascode()方法,根据hasCode值来存储该对象的位置。注意两个或两个以上的元素通过equals()方法比较返回true,但他们的hascCode()如果不同的化,HashSet集合也是可以储存的。
概括为:HashSet()判断两个对象的标准有两个:1 equals()方法 2hashCode值
LinkedHashSet
根据集合元素的hashCode值来决定元素的存储位置,并提供链表来维护元素的次序。元素是以插入的顺序保存,但是性能降低了.
package CollectionTest; import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.LinkedHashSet; import java.util.Set; public class CollectionTest { public static void main(String[] args) { // TODO Auto-generated method stub Collection c=new ArrayList(); //添加元素 c.add(6); c.add("孙悟空"); c.add("田建科"); c.add("高婕"); c.add("林景佳"); c.remove(6); //如何遍历集合元素 //1 使用增强for for(Object c1:c) { System.out.println(c1); } System.out.println("----------------"); //使用迭代器Iterator //使用的是Iterator<T>:iterator() Iterator it=c.iterator(); //判断迭代器里面是否有元素 while(it.hasNext()) { //将容器里面的元素打印出来 System.out.println(it.next()); } System.out.println("----------------"); //HashSet的常见方法 Set s1=new HashSet(); //add()方法 s1.add("tian"); s1.add("jian"); s1.add("ke"); //size()方法,此处的size()方法只显示3个大小 System.out.println(s1.size()); //remove()方法 s1.remove("tian"); System.out.println(s1.size()); //迭代器遍历与增强for循环 Iterator it1=s1.iterator(); while(it1.hasNext()) { System.out.println(it1.next()); } for(Object ob1:s1) { System.out.println(ob1); } //LinkedHashSet类 LinkedHashSet L1=new LinkedHashSet(); L1.add("fengkuang"); L1.add("fengk2"); System.out.println(L1); } }
TreeSet
是SortedSet接口的实现类,能够让元素处于排序状态。为什么能够实现排序状态呢?因为实现了Comparable接口,Comparable接口里面只有一个方法就是compareTo()方法来比较元素之间的关系。
排序的几种方式?1自然排序:按照自然升序方式
2定制排序:想要实现自己的想法进行排序,此时就是定制排序,通过Comparator接口帮助,这个接口里面有一个compare()方法
package CollectionTest; import java.util.TreeSet; public class TreeSetTest { public static void main(String[] args) { // TODO Auto-generated method stub TreeSet ts1=new TreeSet(); ts1.add("kobe"); ts1.add("durant"); ts1.add("james"); ts1.add("westbooks"); ts1.add("duran"); System.out.println(ts1); //[duran, durant, james, kobe, westbooks] for(Object oj:ts1) { System.out.println(oj); } } }
EnumSet类
是枚举类设计的集合类,EnumSet中的所有的元素必须是指定枚举类型的枚举值,也是有顺序的,只不过这个顺序是以枚举值在Enum类内的定义顺序来决定集合元素的顺序。
package CollectionTest; import java.util.EnumSet; enum Season { Spring,Summer,Fall,Winner } public class EnumTest { public static void main(String[] args) { EnumSet es1=EnumSet.allOf(Season.class); EnumSet es2=EnumSet.noneOf(Season.class); System.out.println(es1); System.out.println(es2); } }
Set实现类型的性能分析
HashSet的性能是最好的,TreeSet需要红黑树算法来维护集合元素的次序,只要需要保持排序的Set才需要用到。LinkedHashSet是通过链表和哈希表来维护的,通过链表来维护插入的顺序。EnumSet是Set性能中最好的,但它只能同时保存同一个枚举类的枚举值作为集合元素。Set的三个实现类HashSet、TreeSet和EnumSet都是线程不安全的,如果要保证线程安全需要通过Collections工具类的synchronizedSortedSet方法来"包装"该Set集合。
三 List集合
是什么?干什么用?代表有序、可重复的集合。可以按照添加顺序记录索引元素。
如何判断两个对象的方法是equals()方法。
package CollectionTest; import java.util.ArrayList; import java.util.List; import java.util.ListIterator; public class ListIteratorTest { public static void main(String[] args) { String[ ] books={"tian","jian","ke","feng"}; //上面是一个数组,如何加入List中呢 List l1=new ArrayList(); for( String s :books) { l1.add(s); } ListIterator list1=l1.listIterator(); while(list1.hasNext()) { System.out.println(list1.next()); list1.add("------"); } System.out.println("-----分隔符------"); while(list1.hasPrevious()) { System.out.println(list1.previous()); } /* * tian jian ke feng -----分隔符------ ------ feng ------ ke ------ jian ------ tian */ } }
ArrayList和Vector的异同?
相同:二者都是List的实现类,二者都用了initalCapacity来指定容器的初始大小,二者都可以通过ensureCapacity(int minCapacity)来容纳最小参数所指定的元素数。
不同:Vector是一个古老的集合从JDK1开始,而ArrayList从JDK2开始 ,线程安全上来说,Vector是线程安全的,所以性能略低,ArrayList是线程不安全,性能高。Stack是Vector的一个子类,用于模拟"栈"这种数据结构,栈是一种"后进先出"(LIFO)的容器,可以这样形象打个比喻,后面进栈的把前面推出来,但是进栈出栈的都是Object对象。栈也是线程安全,因此性能比较低。
package CollectionTest; import java.sql.Array; import java.util.Arrays; import java.util.List; import java.util.Stack; import java.util.Vector; public class ArrayList { public static void main(String[] args) { List v1=new Vector(); v1.add("tianjianke"); v1.add(0,1); System.out.println(v1.size()); //2 //使用Arrays的asList(Object...aaa)方法 List fixedlist=Arrays.asList("tianjian","ke","wudi","tianxia"); for(int i=0;i<fixedlist.size();i++) { System.out.println(fixedlist.get(i)); } Stack S1=new Stack(); S1.add("asdfa"); S1.add("sxdaf"); System.out.println(S1); S1.pop(); System.out.println(S1); // 2 // tianjian // ke // wudi // tianxia // [asdfa, sxdaf] // [asdfa] } }
LinkeList:
四 Queue集合
是什么?干什么用?是一种先进先出的集合,实现Queue(队列)这种数据结构,队列是怎么样的数据结构呢?一种特殊的线性表,只允许在表的front端进行删除操作,在表的rear端进行插入操作。
Queue接口定义了几个方法:1 add()与offer()添加元素 2 element()与peek()获取队列头部元素 3 poll()与remove()获取队列头部元素并删除
PriorityQueue:
package CollectionTest; import java.util.PriorityQueue; public class Queue { public static void main(String[] args) { //PriorityQueue(优先队列):保存的并不是队列的插入顺序,而是安装插入元素的大小顺序进行排序 PriorityQueue q1=new PriorityQueue(); q1.add("tianjianke"); q1.add("fengkuang"); q1.add("mengnong"); q1.add("okc"); System.out.println(q1); System.out.println(q1.peek()); System.out.println(q1); q1.remove(); q1.poll(); System.out.println(q1); // [fengkuang, okc, mengnong, tianjianke] // fengkuang // [fengkuang, okc, mengnong, tianjianke] // [okc, tianjianke] } }
ArrayDeque类:既可以当做双端队列也可以当做栈来实现,是一种实现类。
package CollectionTest; import java.util.ArrayDeque; public class ArrayDequeStack { public static void main(String[] args) { ArrayDeque stack=new ArrayDeque(); //讲元素推进去 stack.push("tian"); stack.add("jianke"); stack.add("meidi"); System.out.println(stack); System.out.println(stack.peek()); System.out.println(stack.poll()); System.out.println(stack); } }
各种Queue性能分析:ArrayDeque是双端队列也是栈,PriorityQueue是比较典型的Queue实现类,只不过按照元素大小属性进行排序,LinkeList即实现了List接口又实现了Deque接口,即是双端队列又是列表。
五 Map集合
是什么?干什么用?Map是一种接口,用于保存具有映射关系的数据。一组值用于保存key,一组值保存value,key和value是一一对映的关系,其中Map中的key不允许重复,即同一个Map对象的任何两个key通过equals方法总是返回false。如果单独来看的,key基本组成了set集合。将Map中的value放在一起来看,那么就相当于List。
比较一下Map和Set的区别?其实在Java底层代码,Java是先实现了Map,然后讲Map中的value通过全部赋为null,那么此时Map就变成了Set。
package CollectionTest; import java.util.HashMap; import java.util.Map; public class MapTest { public static void main(String[] args) { Map map=new HashMap<>(); map.put("疯狂",2); map.put("疯狂1",2); map.put("疯狂2",2); map.put("疯狂3",4); System.out.println(map); System.out.println(map.get("疯狂")); System.out.println(map.hashCode()); map.remove("疯狂3"); System.out.println(map); } }
HashMap与Hashtable的区别?
Hashtable是从JDK1就开始出现,HashMap从JDK2开始,Hashtable是线程安全的,HashMap是线程不安全的。
Hashtable不允许使用null作为key和value值,否则会引发NullPointerException异常;但HashMap可以使用null作为key或value(注意此处的有个陷阱,HashMap能否用两个null作为key值,答案是否定的,因为HashMap里面的key值不能重复)。
Map的性能分析
虽然HashMap和Hashtable来说,Hashtable是线程安全的,HashMap是线程不安全的,HashMap性能高于Hashtable,TreeMap采用了红黑树,能够对内部排好序,如果对Map的排序顺序有要求,可以使用TreeMap。LinkedHashMap的性能呢比HashMap要低,因为采用了链表来维护Map中key-value的添加属性。EnumMap性能最好。
以上是关于Java集合类——2017.08.05的主要内容,如果未能解决你的问题,请参考以下文章