Java基础知识梳理——第九章 集合

Java集合类可以用于存储数量不等的多个对象,并可以实现常用的数据结构,如栈、队列等。集合还可以用于保存具有映射关系的关联数组。Java集合分为set、map、list三种体系,set代表无序、不可重复的集合;list代表有序、可重复的集合;map代表具有映射关系的集合。

容器是可以容纳其他对象的对象。

java的集合类主要由两个接口派生而来,collection和map,是Java集合框架的根接口。

Java基础知识梳理——第九章 集合_第1张图片

Java基础知识梳理——第九章 集合_第2张图片

1.Collection和iterator

Collection是set、map、queue接口的父接口,该接口定义的方法可用于操作set集合、map集合、queue集合。

  • boolean add(Object obj):该方法用于向集合里添加一个元素。如果集合对象被添加操作改变了,则返回true。
  • boolean addAll(Collection c):该方法把集合C里的所有元素添加到指定集合里。如果集合对象被添加操作改变了,则返回true。
  • void clear():清除集合里的所有元素,将集合长度变为0。                                
  • boolean contains(Object o):返回集合里是否包含指定元素。
  • boolean containsAll(Collection c):返回集合里是否包含集合c里的所有元素。
  • boolean isEmpty():返回集合是否为空。当长度为0时返回true,否则返回false。
  • Iterator iterator():返回一个Iterator对象,用于遍历集合里的元素。
  • boolean remove(Object o):从此列表中移除第一次出现的指定元素。 
  • boolean removeAll(Collection c):从集合中删除集合c里包含的所有元素,如果删除一个或一个以上 的元素,则该方法返回true。
  • boolean retainAll(Collection c):从集合中删除集合c里不包含的元素,如果该操作改变了调用该方法的集合,则该方法返回true。也就是取两个集合的交集。
  • int size():返回集合里元素的个数。
  • Object[] toArray():该方法把集合转换成一个数组。

iterator接口主要用来遍历collection集合中的元素,iterate对象也被称为迭代器。

  • boolean hasNext():如果被迭代的集合元素还没有被遍历,则返回true。
  • Object next():返回集合里的下一个元素。
  • Void remove():删除集合里上一次next方法返回的元素。

iterator遍历集合中的元素:

public static void main(String[] args)  throws Exception{
		Set set = new HashSet();
		set.add("张三");
		set.add("李四");
		set.add("王五");
		Iterator iterator = set.iterator();
		while(iterator.hasNext()){
				String str = (String)iterator.next();
			    system.out.println(str);
		}
		
	}

2.set

set集合不允许存在相同的元素,如果将两个相同的元素加入到同一个集合set集合中,则添加失败add方法返回false。set判断两个对象是否相同采用equals方法。set的实现类有hashset、TreeSet、EnumSet。

HashSet:按hash算法来储存集合中的元素,因此具有良好的存取和查找功能。

HashSet的特点:(1)不能保证元素的排列顺序,排列顺序可能和添加顺序不同。(2)HashSet不是同步的,如果有多个线程同时访问HashSet,如果一个或多个线程对其进行了修改,则必须通过代码来同步。(3)集合元素可以是null。

当向HashSet集合中存入一个值,HashSet会调用该对象的HashCode()方法来得到该对象的值,然后根据HashCode值来决定在HashSet中的存放位置。如果两个元素通过equals()方法比较返回true,而他们的hashCode()方法返回值不同,HashSet会将他们存储在不同的位置,依然添加成功。

LinkedHashSet:用链表来维护元素存放顺序。

LinkedHashSet是HashSet的子类,在存储对象的同时用链表维护了元素的次序。

TreeSet:TreeSet是SortSet接口的实现类,可以确保聚合元素处于排序状态。

  • Comparator comparator():如果TreeSet采用了定制排序(需要排序器),则该方法返回定制排序所使用的Comparator,如果TreeSet采用了自然排序,则返回null。
  • Object first():返回集合中的第一个元素。
  • Object last():返回集合中的最后一个元素。
  • Object lower(Object obj):返回集合中位于指定元素之前的元素。
  • Object higher(Object obj):返回集合中位于指定元素之后的元素。
  • SortedSet subSet(fromElement,toElement):返回此Set的子集合,范围从fromElement(包含)到toElement(不包含)。
  • SortedSet headSet(toElement):返回Set的子集,由小于toElement的元素组成。
  • SortedSet tailSet(fromElement):返回Set的子集,由大于或等于fromElement的元素组成。

TreeSet:采用红黑树的数据结构存储数据单元。TreeSet支持两种排序:自然排序和定制排序。

自然排序:在向TreeSet集合中存放数据时,会调用集合元素的compare to(Object obj)方法来比较元素之间的大小关系,然后将集合元素按升序排列。

定制排序:通过comparator接口来实现。在创建TreeSet实例的时候,不在使用TreeSet默认的比较,通过Comparator接口实现自己的比较器实例,将比较器的实例作为参数通过TreeSet的构造器传递给集合,那么在往集合元素中存放数据的时候就会按照我们的指定顺序进行排序。

EnumSet类:枚举集合类,集合中存放的元素必须是指定枚举类型的枚举值。

EnumSet类没有提供公有属性的构造器来创建该类的实例,程序应该通过EnumSet提供是static方法来创建EnumSet对象。常用的方法如下:

  • Static EnumSet allOf(Class elementType):创建一个包含了枚举类中所有枚举值的EnumSet集合。
  • Static EnumSet complementOf(EnumSet s):创建一个其元素类型与指定的EnumSet里元素类型相同的EnumSet集合,新的EnumSet集合中包含了原EnumSet集合中所不包含的,剩下的所有枚举值。
  • Static EnumSet copyOf(Collection c):使用一个普通集合来创建一个EnumSet集合。普通集合Collection参数不能为空,里面必须含有元素对象。否则抛出java.lang.IllegalArgumentException(参数不合理异常)。
  • Static EnumSet copyOf(EnumSet s):创建一个与指定的EnumSet具有相同元素类型、相同集合元素的EnumSet集合。完整的copy一份。
  • Static EnumSet noneOf(Class elementType):创建一个元素类型为指定枚举类型的空EnumSet。
  • Static EnumSet range(E from,E to):创建一个包含了从from开始到to结束的范围内所有的枚举值集合。

3.List集合

List集合代表一个元素有序、可重复的集合,集合中每个元素都有其对应的索引

List作为Collection接口的子接口,可以使用Collection接口中的全部方法。

  • Void add(int index,Object element):将元素element插入到List集合的index处。如果当前索引位置有元素对象,则将此元素对象及后面所有元素对象都向后移动一个索引位置。
  • Boolean addAll(int index,Collection c):将集合c所包含的所有元素都插入到List集合中的index索引位置。
  • Object get(int index):返回集合index索引位置的元素。
  • Int indexOf(Object o):返回对象o在List集合中第一次出现的位置索引。
  • Int lastIndexOf(Object o):返回对象o在List集合中最后一次出现的位置索引。
  • Object remove(int index):删除index索引位置的元素,并将此对象返回。同时此元素后面的所有元素索引向前前进一位。
  • Object set(int index,Object element):将index索引处的元素替换成element对象,并将被替换的元素返回。
  • List subList(int fromIndex,int toIndex):返回从元素索引fromIndex到索引toIndex处所有集合元素组成的子集合。

ListIterator接口:List提供了一个listIterator()方法,该方法返回一个ListIterator对象,ListIterator接口继承了Iterator接口,还提供了专门操作List的方法。方法如下:

  • Boolean hasPrevious():返回该迭代器关联的集合是否含有上一个元素。
  • Object previous():返回迭代器的上一个元素。
  • void add():在指定位置插入一个元素。

ArrayList和Vector:是List接口的典型实现,都是基于数组的List类。封装了一个动态的允许再分配的Object[ ] 数组。

Vector与ArrayList相比较而言是属于古董级别,在JDK1.0时就已经存在,不推荐使用。arrayList与Vector的显著区别是:ArrayList是线程不安全的,Vector是线程安全,所以Vector的性能要比ArrayList要低一些。

Collection、set、list的联系与区别?

(1)Collection是Java集合顶级接口,存储一组不唯一、无序的对象。(2)list接口和set接口是collection接口的两个子接口。(3)list接口存储一组不唯一、有序的对象。set接口存储一组唯一、无序的对象。

4.Queue

Queue用于模拟队列数据结构,队列是遵循“先进先出,后进后出”的存储规范。

Queue接口定义的方法:

void add(Object obj):将此元素加入该队列的尾部。

Object element():获取该队列头部的元素,但不删除该元素。

Boolean off(Object obj):将此元素加入该队列的尾部。当使用有容量限制的队列时,此方法比add()方法更好。

Object peek():获取该队列头部的元素,但不删除该队列。如果此队列为空,返回null。

Object poll():获取该队列头部的元素,并删除该队列。如果此队列为空,返回null。

Object remove():获取队列头部的元素,并删除该队列。

PriorityQueue实现类:

PriorityQueue是一个比较标准的Queue实现类,而不是绝对标准的队列实现。PriorityQueue保存队列元素的顺序并不是按照加入队列的顺序进行保存,而是按照队列元素的大小进行重新一次排序。所以使用peek()或poll()方法获取元素位置时,不一定是首先加入队列的元素,而是最小的元素。

不允许插入null值,它需要对元素进行排序。排序方法包括自然排序和定制排序。

Deque接口和ArrayDeque接口

Deque是Queue接口的子接口,代表一个双端队列。Deque接口中定义了一些方法,可以从两端操作元素。

  • void addFirst(Object obj):将指定元素插入到该队列的首部。
  • void addlast(Object obj):将指定元素插入到该队列的尾部。
  • Iterator desceningIterator():返回该双端队列对应的迭代器,该迭代器将以逆向顺序来迭代队列中的元素。
  • Object getFirst():获取双端队列的第一个元素。
  • Object getLast():获取双端队列的最后一个元素。
  • Boolean offerFirst(Object obj):将指定元素插入到双端队列的开头。
  • Boolean offLast(Object obj):将指定元素插入到双端队列的末尾。
  • Object peekFrist():获取但不删除双端队列的第一个元素。
  • Object peekLast():获取但不删除双端队列的最后一个元素。
  • Object pollFrist():获取并删除双端队列的第一个元素。
  • Object pollLast():获取并删除双端队列的最后一个元素。
  • Object pop():获取并删除该双端队列的第一个元素。
  • Void push(Object obj):将一个元素插入到该双端队列的队首位置,相当于addFrist()
  • Object removeFirst():获取并删除该双端队列的第一个元素。
  • Object removeLast():获取并删除该双端队列的最后一个元素。

LinkedList实现类:

LinkedList是List接口的实现类,可根据索引随机访问集合中元素。LinkedList还实现了Deque接口,因此可被当做双端队列来使用。

5.Map

Map用于保存具有映射关系的数据,key和value,可以是任意类型的值。key和value一一对应,key不允许重复。Map里的key放在一起可以组成一个set集合,Map中包含一个KeySet方法,用于返回Map里所有key组成的set集合。Map中的所有value放在一起可以看做一个List。

  • void clear():删除Map对象中所有的key-value对。
  • Boolean containsKey(Object key):查询Map中是否包含指定的key,如果有则返回true。
  • Boolean containsValue(Object value):查询Map中是否包含一个或多个Value,如果有返回true。
  • Set entrySet():返回Map中包含的key-value对所组成的set集合(相当于set集合),每个集合元素都是Map.Entry(Entry是Map的内部类)对象。
  • Object get(Object key):返回指定key所对应的value,如果此Map中不包含该key,返回null。
  • Boolean isEmpty():查询Map是否为空,如果为空返回true。
  • Set keySet():返回该Map中所有的key组成的Set集合。
  • Object put(Object key,Object value):添加一个key-value对,如果当前Map中已有一个与该key相当的key-value对,则新的key-value对会覆盖原来的key-value对。
  • void putAll(Map m):将Map的实例对象m中的key-value对复制到本Map中。
  • Object remove(Object key):删除指定key-value对,返回被删除key所关联的value,如果该key不存在,返回null。
  • Int size():返回该Map里key-value对的个数。
  • Collections values():返回该Map中所有value组成的Collection。

Map中包含一个内部类Entry,该类封装了一个key-value对。Entry包含了如下三个方法:

  • Object getKey():返回Entry里包含的key值。
  • Object getValue():返回Entry里包含的value值。
  • Object setValue(V value):设置该Entry里包含的value值,并返回新的value值。

HashMap和HashTable实现类:

HashMap和HashTable是Map典型的实现类,区别:

HashTable是线程安全的,HashMap是线程不安全的,所以HashMap比HashTable性能高一点。Hashtable不允许null作为key和value,而HashMap都可以。

LinkedHashMap实现类:

LinkedHashMap是HashMap的子类,使用链表来维护key、value的存放顺序。

Properties类:

Properties类是Hashtable的子类,Properties类可以将map和属性文件关联起来。从而可以把map对象中的key-value对写入到属性文件里,也可以将属性文件中的“属性名-值”加载到map对象中。

  • String getProperty(String key):获取Properties中指定属性名对应的属性值。
  • String getProperty(String key,String defaultValue):方法重载,获取Properties中指定属性名对应的属性值,如果此属性名不存在时,返回默认的defaultValue值。
  • Object setProperty(String key,String value):设置属性值,类似于Map的put()方法。
  • void load(InputStream inStream):从属性文件中加载key-value对。(加载进来)
  • void store(OutputStream out,String comments):将Properties中的key-value对输入到指定的属性文件中。(存储出去)

SortMap接口与TreeMap实现类:

map接口派生出SortedMap接口,SortedMap接口有一个实现类TreeMap。

TreeMap就是一个红黑树数据结构,每个key-value对作为一个红黑树的节点,TreeMap存储key-value对时根据key对节点进行排序。TreeMap的排序方式分为自然排序和定制排序。

TreeMap提供的常用方法如下:

  • Map.Entry firstEntry():返回该Map中最小key所对应的key-value对,如果Map为空,则返回null。
  • Object firstKey():返回该Map中最小key值,如果该Map为空,则返回null。
  • Map.Entry lastEntry():返回Map中最大key所对应的key-value对,如果Map为空,则返回null。
  • Object lastKey():返回该Map中最大key值,如果该Map为空,则返回null。
  • Map.Entry higherEntry(Object key):返回该Map中位于key后一位的key-value对。如果后面不存在则返回为null。
  • Object higherKey(Object key):返回该Map中位于key后一位的key值,如果后面不存在则返回为null。
  • Map.Entry lowerEntry(Object key):返回该Map中位于key前一位的key-value对。如果前面不存在则返回为null。
  • Object lowerKey(Object key):返回该Map中位于key前一位的key值。如果前面不存在则返回为null。
  • SortedMap subMap(Object fromKey,Object toKey):返回该Map的子Map,其key的范围是从fromKey(包括)到toKey(不包括)。
  • SortedMap tailMap(Object fromKey):返回该Map的子Map,其key的范围是大于fromkey(包括)的所有key。
  • SortedMap headMap(Object toKey):返回该Map的子Map,其key的范围是小于toKey(不包括)的所有key。

WeakHashMap实现类(弱)

WeakHashMap的key只保留了对实际对象的弱引用,即:WeakHashMap的对象的key所引用的对象没有被其他强引用变量所引用,则这些key所引用的对象可能被垃圾回收,WeakHashMap也可能自动删除这些key所对应的key-value对。

EnumMap实现类

EnumMap是一个与枚举类一起使用的Map实现,EnumMap中所有的key都必须是单个枚举类的枚举值。创建EnumMap时必须显示或隐式指定它对应的枚举类。

EnumMap根据key的自然顺序,即在枚举类中的定义顺序来维护key-value对的顺序。调用Map的方法keySet()、entrySet()、values()遍历EnumMap时可以看到这种顺序。

EnumMap不允许使用null作为key,但允许使用null作为value。

创建EnumMap时必须指定一个枚举类,从而与使EnumMap和指定枚举类关联起来。

6.操作集合的工具类Collection

Collection是集合框架的接口,包括set、list、queue。提供了大量方法对集合元素进行排序、查询、和修改等操作。

排序:

  • static void reverse(List list):反转指定List集合中元素的顺序。
  • static void shuffle(List list):对List集合元素进行随机排序
  • static void sort(List list):根据元素的自然顺序对指定list集合的元素按升序进行排序。
  • static void sort(List list,Comparator comp):根据指定Comperator产生的顺序对List集合元素进行排序。
  • static void swap(List list,int i,int j):将指定List集合中的i处元素和j处元素进行交换。
  • static void rotate(List list,int distance):当distance为正数时,将list集合的后distance个元素“整体”移动到前面,当distance为负数时,将list集合的前distance个元素“整体”移动到后面。

查找、替换操作:

  • Static int binarySearch(List list,Object key):使用二分法搜索指定的List集合,用来获得指定对象key在List集合中的索引。如果要使该方法可以正常工作,则必须保证List中的元素已经处于有序的状态。
  • Static Object max(Collection coll):根据元素的自然顺序返回给定集合中的最大元素
  • Static Object max(Collection coll,Comparator comp):根据Comparator指定的顺序,返回给集合中的最大的元素。
  • Static Object min(Collection coll):根据元素的自然顺序,返回给集合中的最小元素。
  • Static Object min(Collection coll,Comparator comp):根据Comparator(排序器)指定的顺序,返回给集合中的最小的元素。
  • Static void fill(List list,Object obj):使用指定元素obj替换指定List集合中的所有元素。
  • Static int frequency(Collection c,Object o):返回指定集合中指定元素的出现次数。
  • Static int indexOfSubList(List source,List target):返回子List对象在父List对象中第一次出现的位置索引;如果父List中没有出现这样的子List,则返回-1。
  • Static int lastIndexOfSubList(List source,List target):返回子List对象在父List对象中最后一次出现的位置索引,如果父List中没有出现这样的子List,则返回-1。
  • Static boolean replaceAll(List list,Object oldVal,Object newVal):使用一个新值newVal替换List对象的所有旧值oldVal。

同步控制(解决安全性)

collection类中提供多个synchronizedXxx()方法,将指定的集合包装成线程同步的集合,从而解决多线程并发访问集合时的多线程安全问题。

Java中常用的集合框架中的实现类,HashSet、TreeSet、ArrayList、ArrayDeque、LinkedList、HashMap、和TreeMap都是线程不安全的。Collections提供了多个静态方法可以把它们包装成线程同步的集合。

设置不可变集合

Collections提供如下三个类方法来返回一个不可变的集合。

  • emptyXxx():返回一个空的,不可变的集合对象,此处的集合即可以是List,也可以是Set,还可以是Map。
  • singletonXxx(T o):返回一个包含指定对象的,不可变的集合对象,此处的集合即可以是List,也可以是Set,还可以是Map。
  • unmodifiableXxx():返回指定集合对象的不可变视图,此处的集合既可以是List,也可以是Set,还可以是Map。

7题目:

定义一个数组,该数组既可以放Dog对象,也可以放Cat对象,还可以放Integer对象。

Object objArr = new Object[5];
objArr[0] = 56;
objArr[1] = 23;
objArr[2] = "Hello world";
objArr[3] = new Dog();
objArr[4] = new Cat();

ArrayList、LinkedList、Vector的区别:

ArrayList和LinkedList都实现了List接口,都具有List接口中有序、不唯一的特点。ArrayList实现了长度可变的数组,在内存中分配连续空间,遍历元素和随机访问元素的效率比较高。linkedList实现的是链表存储方式,存储、删除元素时效率比较高。Vector与ArrayList相比较而言是属于古董级别,在JDK1.0时就已经存在,不推荐使用。arrayList与Vector的显著区别是:ArrayList是线程不安全的,Vector是线程安全,所以Vector的性能要比ArrayList要低一些。

HashSet和TreeSet的区别:

HashSet采用哈希表存储结构,优点添加、查询、删除的速度都快,缺点是无序。

TreeSet采用二叉树的存储结构,优点有序,查询速度比list快,缺点:查询速度没有HashSet快。

使用HashSet存储自定义对象,为什么要重写HashCode()和equals():

HashSet存储使用Hash表结构,Hash表需要用到hashCode()和equals()方法,HashCode产生哈希值以计算内存位置,当hash值相同时需要调用equals方法进行比较。如果不重写,调用的是Object的HashCode,而Object的HashCode实际上是地址,系统已经覆盖了HashCode方法。所以重写的目的是告诉程序去除重复元素的策略。

使用泛型的好处:

泛型是JavaSE1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数,Java语言引入泛型的好处是安全简单。

遍历时删除元素,哪种遍历方法最好:

Iterator,Iterator的remove方法可以删除元素。

collection和collections的区别:

collection是Java提供的集合接口,用来存储一组不唯一、无序的对象,有两个子接口List和Set。

collections类,专门用来操作集合类,它提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。

资源文件的作用:

资源文件是用来配置信息的,如数据库信息、键值对信息等。程序里需要有个方法读取资源文件的配置信息。如果没有资源文件,配置信息就得写在代码里,需要修改信息就不得不修改代码;有了资源文件,一旦信息需要改变,修改资源文件就可以,不用修改代码,保证了代码的封装性。

Hashtable和hashmap的区别和联系:

实现原理相同,功能相同,底层都是哈希表结构,查询速度快,在很多情况下可以互用

两者的主要区别如下:

Hashtable是早期JDK提供的接口,HashMap是新版JDK提供的接口

Hashtable继承Dictionary类,HashMap实现Map接口

Hashtable线程安全,HashMap线程非安全

Hashtable不允许null值,HashMap允许null值

Java主要容器的选择依据和应用场合:

(1) HashTable,Vector类是同步的,而HashMap,ArrayList不是同步的。 因此当在多线程的情况下,应使用 HashTable和 Vector,相反则应使用HashMap,ArrayList.

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

(3) ArrayList 由数组构建, LinkList由双向链表构建,因此在程序要经常添加,删除元素时速度要快些,最好使用LinkList,而其他情况下最好使用ArrayList.因 为他提供了更快的随机访问元素的方法。

 

 

 

 

你可能感兴趣的:(Java语言概述)