Java类集
在使用各个类集接口时,如没有指定泛型,会出现警告信息。此时,泛型将被擦除而全部使用Object接收。
类集就是一个动态的对象数组。类集框架本身不受对象数组长度的限制。
Collection接口是单值存放的最大父接口,可以向其中保存多个单值(单个对象)数据。
开发中不一般不直接使用Collection接口,而是使用子接口。如使用Collection接口,表示的操作意义不明确。
List:可以存放重复的内容
Set:不能存放重复的内容,重复内容靠hashCode()和equals()两个方法区分。
Queue:列队接口
SortedSet:可以对接口中的数据进行排序
List接口
可以存放重复的内容。
List常用的子类:
ArrayList是List的子类,可以直接通过对象的多态性为List接口实例化。
实例一:
1、向接口中增加元素
Collection定义的方法:
l 增加一个元素:public boolean add(E o)
l 增加一组元素:public boolean addAll(Collection<? extends E >c)
List定义的方法:
在指定位置增加元素:public void add(int index, E element)
2、删除元素:
Collection定义的方法:
l 每次删除一个元素:public boolean remove(E o)
l 每次删除一组元素:public boolean removerAll(Collection<? >c)
List扩展的方法:
在删除指定位置元素:public E remove(int index)
对于自定义的的类如果要通过remove(Object o)方法来删除,则必须在类中覆写Object类的equals()及hashCode()方法
3、输出List中的内容:
Collection接口取得全部数据长度的方法size(); list.size()
List接口中取得集合中指定位置元素:get(int index),两者结合可输出集合中的全部元素。
list.get(i)
4、将集合变为对象数组:
Collection中定义了toArray()方法,可将集合变为对象数组,由于在类集声明时已经通过泛型指定了集合中的元素类型,在接收时要使用泛型指定的类型。
如定义为String类型,在接收时也要使用String[]类型
LinkList表示的是一个链表的操作类,
Queue表示的是队列操作接口
Set接口
Set接口也是Collection接口的子接口,与Collection或List接口不同的是:Set接口不能加入重复的元素。
Set接口常用的子类:
HashSet是接口的一个子类:里面不能存放重复元素,采用的散列的存储方式,所以没有顺序。
有序存放:TreeSet
在实际开发中经常会碰到区分同一对象的问题,所以,一个完整的类最好覆写Object类的hashCode()、equals()、toString()3个方法。
13.6集合的输出
如果要输出Collection、Set集合中的内容,可以将其转换为对象数组输出,而使用List则可以直接通过get()方法输出。但都不标准
类集中4种常见的输出方式:
Iterator:迭代输出,使用最多。(重点把握)
ListIterator:是Iterator的子接口,专门输出List中的内容
Enumeration:是一个旧的接口,功能与Iterator类似
Foreach:输出数组或集合
迭代输出:Iterator
只要是碰到了集合输出的操作,就一定使用Iterator接口
迭代输出就是将元素一个个进行判断,判断其是否内容,如果有内容则把内容取出。
Iterator接口在使用时需要指定泛型,(此处指定的泛型最好与集合中的泛型类型一致)
Iterator使用hasNext()判断是否有下一个值,并使用next()方法取出下一个元素。
使用迭代删除指定内容时应注意:应避免集合操作中也存在一个remove()方法,如果在使用Iterator输出时集合自己调用了删除方法,会出现运行时的错误。
双向迭代输出:ListIterator
Iterator接口的主要功能是有钱向后单项输出,
如果想实现由前向后或者是由后向前的双向输出,必须使用ListIterator接口(为Iterator的子接口)
ListIterator接口的相关操作:
1、双向迭代
ListIterator接口中的hasPrevious()方法由后向前判断,并使用previous()方法取出前一个元素。并且在使用ListIterator接口进行双向输出时,想完成由后向前的输出,则一定要先进性由前向后的输出。
2、可使用add() 或set()方法增加或替换集合中的元素,但不推荐
foreach:
foreach输出格式:for(类 对象:集合){
//集合操作
}
Enumeration接口:
方法与Iterator中类似,只是缺少删除数据的方法。而且在Web开发中此接口运用比较多。
使用hasMoreElements()方法迭代判断并通过nextElement()方法取出每一个元素(与Iterator中类似)
Map接口
Collection、Set、List接口都属于单值的操作,即每次只能针对一个对象,
而Map每次操作是一对对象,即二元偶对象,Map中的每个元素都使用key->value的形式存储在集合中。
Map上也应用了泛型,必须同时设置好key或value的类型。
Map.Entry是Map内部定义的一个接口,专门用来保存key->value的内容。
在Map的操作中,所有内容都是通过key->value的形式保存数据,对于集合来讲,实际上就是将key->value的数据保存在Map.Entry的实例之后,再在Map集合中插入一个Map.Entry的实例化对象。
Map接口的常用子类
想要使用Map接口必须依靠子类实例化。常用子类有
HashMap:无序存放的,是新的操作类,key不可以重复
Hashtable:无序存放的,是旧的操作类,key不可以重复
TreeMap:可以排序的Map集合,按照集合中的key排序,key不可以重复
WeakHashMap:当集合中的某些内容不再使用时清除无用的数据,使用gc进行回收。
HashMap类本身是Map的子类,直接使用此类为Map接口实例化即可。
HashMap相关操作:
1、向集合中增加和取出内容:
在Map接口中通过put(Object key,Object value)方法向集合中增加内容,然后通过get (E key)方法根据key找出其对应的value。
2、判断指定的key或value是否存在
使用Map接口中的containsKey(Object key)和containsValue(Object value)两个方法。
3、输出全部的key
Map中使用keySet()方法,将Map中的全部key变成一个Set集合,然后再使用Iterator输出。注意:接收Set集合中指定的泛型要和Map中key的泛型类型保持一致。
4、输出全部的value
使用value()方法,此方法的返回类型是Collection,同样注意泛型的类型。再使用Iterator输出
自定义类作为key时类需要实现Comparable接口:
TreeMap 可以按照key排序,如使用的是String类作为key,String类本身已经实现了Comparable接口,不会有问题。如果是自定义的类作为key,则必须实现Comparable接口,否则会有异常。
Map子类中的数据都使用强引用保存,即里面的内容不管是否引用都始终在集合中保留。如希望自动清理集合中暂时不用的数据使用WeakHashMap类。
Java有四种级别的引用:强引用、软引用、弱引用、虚引用
Map接口的使用注意:
一、不能直接使用迭代输出Map中的全部内容
如一定要使用迭代输出,须按照以下步骤;(参考P530程序)
1) 将Map的实例通过entrySet()方法变为Set接口对象
2) 通过Set接口实例为Iterator实例化
3) 通过Iterator迭代输出,每个内容都是Map.Entry的对象
4) 通过Map.Entry进行key->value的分离。最终输出使用Map.Entry完成
二、直接使用非系统类作为key
需要依靠Object类中的hashCode()和equals()的帮助。
如果要使用一个自定义的对象表示Map中的key,则对象所在的类中一定要覆写equals()和hashCode()方法,否则无法找到对应的value。(但如表示Map中的value,是不需要覆写的)
key可以重复的Map集合:IdentityHashMap
Map中的key不允许重复,重复就是覆盖
如使用IdentityHashMap类,可以允许key重复,只要地址不一样就可以。
SortedMap接口
SortedMap接口是排序接口,只要实现了此接口的子类,都属于排序的子类。
集合工具类:Collections
1、返回不可变的集合
2、为集合增加内容,使用addAll()
3、直接使用Collections工具类中的reverse()方法即可将集合类中的内容反转保存。
4、检索内容,直接通过Collections类中binarySearch()方法即可完成内容的检索,检索之后会返回内容的位置。
5、替换集合中的内容:
直接通过Collections类中replaceAll()方法即可替换一个集合中的指定内容。
6、集合排序:使用Collections类中的sort()方法对一个集合进行排序操作,但要求集合中每个对象所在的类必须实现Comparable接口。
7、交换指定位置的内容,:使用swap()方法把集合中的两个位置的内容进行交换。
其他集合类
Stack类(栈)
属性类:Properties类
XML文件格式:
所有的属性内容可以通过storeToXML()和loadFormXML()两个方法以XML文件格式进行保存和读取。
1、设置和取得属性:setProperty()和getProperty()方法设置和取得属性,类操作时要以String为操作类型。
2、将属性保存在普通文件中:直接使用sote()方法即可,同时指定OutputStream类型,指明输出的位置。
3、从普通文件读取属性内容:通过load()方法,从输入流中将保存的所有属性内容读取出来。
4、将属性保存在XML文件中
5、从XML文件中读取属性