Java类集

1.类集基础

(1)所谓的类集就是一个动态的对象数组,是对一些实现好的数据结构进行了包装,最重要的是类集框架本身不受数组长度的限制。
(2)在整个Java类集中最常用类集接口是:
这里写图片描述
注:所有的类集操作都放在java.util包中。
接口之间其实是存在继承关系的,如下所示:
Collection接口:
这里写图片描述
Map接口:
这里写图片描述
注:SortedXx定义的接口都属于排序接口,如SortedSet、SortedMap。

2.Collection接口

(1)Collection接口的定义
定义:

public interface Collection<E> extends Iterable <E>

注:JDK1.5之前的类集框架中可以存放任意的对象到集合中,这样一来在操作时就可能出现因为类型不统一而造成的ClassCastException异常。故在JDK1.5之后为了保证类集中所有元素的类型一致,将类集框架进行了升级,加入了泛型,这样就可以保证一个集合中的全部元素的类型都是统一的。
Collection接口是单值存放的最大父接口,可以向其中保存多个单值(单个的对象)数据。

Collection接口的方法定义如下:
这里写图片描述

在一般的开发中,往往很少直接使用Collecion接口进行开发,基本上都是使用其子接口。子接口主要有List、Set、Queue和SortSet。这是为了让程序的开发及使用更加明确。

(2)Collection子接口的定义
主要子接口如下:
List:可以存放重复的内容。
Set:不能存放重复的内容,所有的重复内容靠hashCode()和equals()两个方法区分。
Queue:队列接口。
SortedSet:可以对集合中的数据进行排序。

3.List接口

(1)List接口的定义
List接口是Collection的子接口,其中可以保存各个重复的内容。
定义:

public interface List<E> extends Collection<E>

List接口大量扩充了Collection接口,拥有比Collecion接口中更多的方法定义。
List中对Collecion接口的扩展方法如下:
这里写图片描述
要想使用此接口,则需要通过其子类进行实例化。

(2)List接口的常用子类
List接口的常用子类是ArrayList、Vector、LinkedList。
1)ArrayList子类
定义:

public class ArrayList<E> extends AbstractList<E> implements List<E>,RandomAccess,Cloneable,Serializable

从中可以看出ArrayList子类继承自AbstractList类。
AbstractList类的定义:

public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E>

此类实现了List接口,所以可以直接通过ArrayList为List接口实例化。
①向集合中增加元素
直接使用Collection接口中定义的方法:

增加一个元素:public boolean add(E o)
增加一组元素:public boolean addAll(Collection<?extends E> c)

也可以使用List接口中定义的方法:

在指定位置处添加一组元素:public void add(int index,E element)

②删除元素
Collection定义的方法:

每次删除一个对象:public boolean remove(Object o)
每次删除一组对象:public boolean removeAll(Collection<?> c)

List扩展的方法:

删除指定位置的元素:public E remove(int index)

③输出List中的内容
在Collection接口中定义了取得全部数据长度的方法size(),而在List接口中存在取得集合中指定位置元素的操作get(int index),使用这两个方法即可输出集合中的全部内容。

for(int i=0;i<allList.size();i++){
    System.out.print(allList.get(i)+”、”);
}

④将集合变成对象数组
在Collecion中定义了toArray()方法,此方法可以将集合变为对象数组,但是由于在类集声明时已经通过了泛型指定了集合中的元素类型,所以在接收时要使用泛型指定的类型。
⑤集合的其他操作
在List中还存在截取集合、查找元素位置、判断元素是否存在、集合是否为空等操作。

2)Vector子类
历史比较老,相对于ArrayList子类来说。
定义:

public class Vector<E> extends AbstractList<E> implements List<E>,RandomAccess,Cloneable,Serializable

3)ArrayList与Vector的区别
这里写图片描述

(2)LinkedList子类与Queue接口
LinkedList是一个链表的操作类,即Java中已经为开发者提供好了一个链表程序,开发者直接使用即可,无须重新开发。
定义:

public class LinkedList<E> extends AbstractSequentialList<E> implements List<E>,Queue<E>,Cloneable,Serialzable

此类不仅实现了List接口,同时也实现了Queue接口。Queue表示的是队列操作接口(先进先出)。
Queue接口的定义:

public interface Queue<E> extends Collection<E>

Queue接口也可以增加元素并输出,方法如下:
这里写图片描述
在LinkedList类中除了实现Queue接口中的方法外,还提供了操作链表的方法
这里写图片描述
①在链表的开头和结尾增加数据
为了达到操作链表的母的,必须直接使用LinkedList类。
②找到链表头
常用方法:

找到表头:public E element();
找到不删除表头:public E peek();
找到并删除表头:public E poll();

③以先进先出的方式取出全部的数据
在LinkedList类中存在poll()方法,通过循环此操作,就可以把内容全部取出(以先进先出的方式)。

4.Set接口

(1)Set接口的定义
Set接口也是Collection接口的子接口,但是与Collection或List接口不同的是,Set接口中不能加入重复的元素。
Set接口定义:
public interface Set extends Collection
Set接口的主要方法与Collection接口的主要方法是一致的,也就是说Set接口并没有对Collection接口进行扩充,只是比Collection接口的要求更加严格了,不能增加重复元素。
Set接口的实例不能像List接口那样可以进行双向输出,因为此接口没有提供像List接口定义的get(int index)方法。
(2)Set接口的常用子类
Set接口的常用子类是HashSet、TreeSet。
1)HashSet(散列存放)
HashSet是Set接口的一个子类,主要特点是:里面不能存放重复元素,而且采用散列的存储方式,所以没有顺序。
注:其中对于重复元素只能增加一次,而且程序运行时向集合中加入元素的顺序并不是集合中的顺序。

2)TreeSet(有序的存放)
定义:
public class TreeSet extends AbstractSet implements SortedSet,Cloneable,Serializable
TreeSet也是继承了AbstractSet类
此类的定义如下:
public abstract class AbstractSet extends AbstractCollection implements Set
注:在TreeSet中即使插入数据是没有顺序的,输出之后的数据仍是有序的。
3)关于TreeSet的排序说明
如果自定义一个类,需要为其指定好排序规则,且TreeSet中的每个对象所在的类都必须实现Comparable即可才可以正常使用。
4)关于重复元素的说明
①一个好的类应该覆写Object类中的equals()、hashCode()、toString()三个方法,实际上在String中已经全部覆写完成。(区分同一对象)
②Set接口依靠hashCode()和equals()完成重复元素的判断,在Map接口中同样也是。
③TreeSet接口依靠Comparable接口完成排序操作。

5.SortSet接口

TreeSet接口实现了SortSet接口,此接口主要用于排序操作,即实现此接口的子类都属于排序的子类。
定义:
public interface SortedSet extends Set
此类也继承了Set接口,其中SortedSet接口的定义:
这里写图片描述

6.集合的输出

如果要输出Collection、Set集合中的内容,可以将其转换为对象数组输出,而使用List则可以直接通过get()方法输出,但是这些都不是集合的标准输出方式。
在类集中提供了一下四种常见的输出方式:
①Iterator:迭代输出,是使用最多的输出方式。
②ListIterator:是Iterator的子接口,专门用于输出List中的内容。
③Enumeration:是一个旧的接口,与Iterator类似。
④foreach:JDK1.5之后提供额的新功能,可以输出数组或集合。(很简便)

(1)迭代输出:Iterator
思路:只要是碰到了集合输出的操作,就一定使用Iterator接口。
Iterator是专门的迭代输出接口,所谓的迭代输出就是将元素一个个进行判断,判断其是否有内容,如果有内容则把内容输出。
定义:public interface Iterface<E>

常用方法:
public boolean hasNext() 判断是否有下一个值
public E next() 取出当前元素
public void remove() 移除当前元素

①输出Collection中的全部内容
Iterato是一个接口,可以直接使用Collection接口中定义的iterator()方法为其实例化。
Iterator iter=all.iterator();
while(iter.hasNextI()){
System.out.println(iter.next()+”、”);
}
②使用Iterator删除指定内容(最好不要删除)
直接使用remove()方法即可。
③迭代输出时删除元素的注意点
正常情况下,一个集合要把内容交给Iterator输出,但是集合操作时也存在一个remove()方法,如果在使用Iterator输出时由集合对象调用了自身的删除方法,则会出现运行时的错误。

注:Iterator接口的功能是从前向后输出,是单向输出。

(2)双向迭代输出:ListIterator
如果要想实现由后向前或是由前向后的双向输出,则必须使用Iterator的子接口-ListIterator。
定义:public interface ListIterator<E> extends Iterator<E>

与Iterator接口不同的是,ListIterator接口只能通过List接口实例化,即只能输出List接口中的内容。
①进行双向迭代
使用ListIterator接口中的hasPrevious()方法由后向前判断,并使用previous()方法取出前一个元素。
注:由后向前输出时必须先由前向后输出。
②增加及删除元素
使用add()或set()方法可以增加或替换集合中的元素,但是这样的操作并不建议使用。

(3)新支持的:foreach
格式:

for(类 对象:集合){
    集合操作;
}

注:虽然foreach功能强大,但仍建议使用Iterator接口完成输出功能。

(4)废弃的接口:Enumeration
定义:public interface Enumeration<E>
要想使用此接口只能通过Vector类,Vector类定义如下方法为Enumeration接口实例化:
public Enumeration<E> elements()

注:虽然Enumeration接口是很老的接口,但是在某些古老的系统或类库的方法中仍在使用Enumeration接口。

7.Map接口

(1)Map接口简介
与Collection接口相关的几个接口均属于单值操作,即每次只能操作一个对象,而Map接口与它们不同的是,每次操作的是一对对象,即二元偶对象,Map接口中每个元素都使用”key->value”的形式存储在集合中。
定义:public interface Map

①HashMap:无序存放的,是新的操作类,key不允许重复。
②Hashtable:无序存放的,是旧的操作类,key不允许重复。
③TreeMap:可以排序的Map集合,按集合中的key排序,key不允许重复。
④WeakHashMap:弱引用的Map集合,当集合中的某些内容不再使用时清除掉无用的数据,使用gc进行回收。
⑤IdentityHashMap:key可以重复的Map集合。

1)HashMap(新的子类)
HashMap本身是Map的子类,直接使用此类为Map接口实例化即可。
HashMap类的定义:

public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>,Cloneable,Serializable

HashMap是AbstractMap类的子类,其定义如下:

public abstract class AbstractMap<K,V> extends Object implements Map<K,V>

HashMap相关操作
①向集合中增加和取出内容
在Map接口中使用put(K key,V value)方法可以向集合中增加内容,之后可以通过get(Object key)方法根据key找出其对应的value。
②判断指定的key或value是否存在
如果要判断某一个指定的key或value是否存在,可以使用Map接口中提供的containsKey(Object key)和containValue(Object value)两个方法,前者是判断Map集合是否存在指定的key,后者是判断Map集合是否存在指定的value。
③输出全部的key
在Map接口中提供了一个叫做keySet()的方法,可以将一个Map接口中的全部key变为一个Set集合,一旦有了Set接口实例,就可以直接使用Iterator接口进行输出。
注:接收的Set集合中指定的泛型要和Map中的key的泛型类型保持一致。
④输出全部的value
如果要输出全部的value,则使用values()方法,此方法的返回类型是Collection。

2)Hashtable(旧的子类)
Hashtable也是Map接口的一个子类,是旧的操作类,使用上和之前并没有太大区别。

HashMap与Hashtable的区别
这里写图片描述
3)TreeMap
TreeMap子类的特点是可以按key排序。
注:使用自定义类作为key时类需要实现Comparable接口,否则会出现类转换异常。

4)弱引用类:WeakHashMap
以上的Map接口的子类中的数据都是使用强引用保存的,即里面的内容不管是否使用都始终在集合中保留,如果希望集合自动清理暂时不用的数据就使用WeakHashMap类。这样,当进行垃圾收集时就会释放掉集合中的垃圾信息。
定义:

public class WeakHashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>

关于对象的引用强度谈论(在java.lang.ref包中可观察)

强引用:当内存不足时,JVM宁可出现OutOfMemoryError错误而使程序停止,也不好回收此对象来释放空间。
软引用:当内存不足时,会回收这些对象的内存,用来实现内存敏感的高速缓存。
弱引用:无论内存是否紧张,被垃圾回收器发现立即回收。
虚引用:和没有任何引用一样。

5)关于Map接口使用的注意事项
①不能直接使用迭代输出Map中的全部内容
对于Map接口来说,其本身是不能直接使用迭代进行输出的,因为Map接口中的每个位置存放的是一对值(key->value),而Iterator中每次只能找到一个值。所以如果非要使用使用迭代输出,则必须按以下步骤完成。
A.将Map接口的实例通过entrySet()方法变为Set接口对象。
B.通过Set接口为Iterator实例化
C.通过Iterator迭代输出,每个内容都是Map.Entry的对象。
D.通过Map.Entry进行key->value的分离。
注:Map集合的内容在开发中基本上作为查询的应用较多,全部输的操作较少。而Collection接口在开发中的主要作用就是用来传递内容及输出的。

②直接使用非系统类作为key
使用一个字符串作为key,用一个Person对象表示value是可以的。
但是反过来,将一个Person对象作为key,一个字符串作为value却会出现问题。
如果要想使用一个自定义的对象表示Map对象的key,则对象所在类中一定要覆写equals()和hashCode()方法,否则无法通过匿名对象找到对应的value。

6)IdentityHashMap(key可以重复)
前面的Map的子类中的key值是不能重复的,如果重复则肯定会覆盖之前的内容。
而在IdentityHashMap中的key是可以重复的,只要两个对象的地址不相等即可。

8.SortMap接口

SortMap接口是排序接口,只要实现了此接口的子类,都属于排序的子类,TreeMap也是此接口一个子类。
定义:pubic interface SortMap

9.集合工具类:Collections

定义:public class Collections extends Object

Collections类与Collection接口的关系:
Collections类与Colleecion接口没有直接的关系,但是与集合中的各个接口都有操作方法的支持。

常用方法:
这里写图片描述

(1)返回不可变的集合
Collections类中的可以返回空的List、Set、Map集合,但是通过这种方式返回的对象是无法进行增加数据的,因为在这些操作中并没有实现add()方法。
(2)为集合增加内容
使用addAll()方法可以为一个集合增加内容。此方法可以接收可变参数。
(3)反正集合中的内容
直接使用Collections工具类中的reverse()方法即可将集合类中的内容反转保存。
(4)检索内容
直接通过Collections工具类中的binarySearch()方法即可完成内容的检索,检索之后会返回内容的位置。
(5)替换集合中的内容
Collections类中也提供了replaceAll()方法,可以替换一个集合中的指定内容。
(6)集合排序
可以通过Collection类中的sort()方法对一个集合进行排序操作,但是要求集合中每个对象所在的类必须实现Comparable接口。
(7)交换指定位置的内容
直接使用swap()方法可以把集合中两个位置的内容进行交换。

10.其他集合类

(1)Stack类
栈是采用先进后出的数据存储方式,每一个栈都包含一个栈顶,每次出栈都是将栈顶的数据取出。注:浏览器上的后退按钮其实就是栈的一个应用。
在Java中使用Stack类进行栈的操作,Stack类是Vector的子类。
定义:public class Stack<E> extends Vector<E>
注:先进去的内容最后才取出,而且如果栈已经空,则无法再弹出,会出现空栈异常。
(2)属性类:Properties
在一个属性文件中保存了多个属性,每一个属性就是直接用字符串表示出来的”key=value”对。
Properties类本身是Hashtable类的子类,既然是子类,则肯定也是按照key和value的形式存放数据的。
定义:public class Properties extends Hashtable

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值