JAVA 中的类集主要分为两大块,一块是由Collection作为父接口的单值接口;另一块是以Map作为父接口的映射接口。
在Collection的子接口中,比较常用的有:List,Set,Queue,SortedSet接口;
在Map中,比较常用的子接口为SortedMap。
接下来介绍下这些接口的常用的具体实现类:
List:其内容是允许重复的(不会自动去重);
a. ArrayList:
List<String> list = null;//声明List对象
list = new ArrayList<String>();//用ArrayList实例化List对象
/*往List对象中添加元素*/
list.add("wangjxy");
list.add("zhangsan");
list.add("lisi");
list.remove("zhangsan");//删除元素
/*判断List中是否包含某元素*/
if(list.contains("wangjxy")){
System.out.println("true");
}
String name = list.get(0);//根据下标直接取得某元素
System.out.println(name);
//类集的标准输出-运用迭代器
Iterator<String> listIter = list.iterator();
while(listIter.hasNext()){
String outName = listIter.next();
System.out.println(outName);}
注意:这里在运用remove()方法时候,直接提供元素去与List中的元素进行对比,当基本类型与String类型没有问题,但是如果为自定义的非系统类,则必须对该类产生的对象进行唯一性的比较鉴别措施,方法就是重写Object类中的两个函数-booleanequals(Object obj)和inthashCode(),从而能够让系统自动判别两个对象是否相等。(具体写法见后面)
b. LinkedList:就是数据结构中的链表,使用方法与上类似,概念与数据结构中的链表一致。(同时可以发现,该类也实现了Queue接口,所以该类也可以进行队列的操作)。
c. Stack:栈,与数据结构中的操作类似。
Set: 内容不允许重复,即会自动去重,因此,该接口的所有子类,如果是非系统类的对象,要重写上面提到的两个函数;
a. HashSet: 散列,顾名思义,存进去的东西,是没有顺序的,而且跟存的先后也无关,因为是按照某个哈衣映射存储的。
b. TreeSet: 该类同样也实现了SortedSet接口,因此该类是能够自动排序的(要完成非系统类的排序,是比去重,一致性鉴别更进一步的判别,因为不但要判断是否相等,还要判断大小,因此,定义这些非系统类对象的类,要通过比较器,即实现Comparable接口)。
注:对于类集的标准输出,代码中已经给出,是通过迭代器实现;而对于List接口的输出,还有一种双向迭代器-ListIterator可供使用,即除了booleanhasNext(),Enext()外,还有boolean hasPrevious(),Eprevious()可供使用,但是,由于一开始迭代器的指针是在头部,即最前面。因此,如果想要由后向前进行迭代输出,那么必须先后前向后把指针移动到最后。
Map:映射,即里面元素是成对出现的,如key->value;一组键名与键值是保存在Map内部接口Entry中的,常用的子类有:
a. HashMap: 由Hash可知,该存放的元素是无序得,(但是保存顺序与输入顺序一致,与HashSet区别)而对于map来讲,有序无序,则是针对于key,跟value无关;同时该类的元素,即key,还是不可重复的;如:
Map<String,String> map = null;//声明Map
map = new HashMap<String,String>();//用HashMap实例化
//向map添加元素
map.put("A","wangjxy");
map.put("B","zhangsan");
map.put("C","lisi");
String name = map.get("A");//得到A对应的值:wangjxy
System.out.println(name);
Set<String> keySet = map.keySet();//得到key的set形式,可进一步运用set取得key值;
System.out.println(keySet);
Collection<String> values = map.values();//得到value的Collection形式,可进一步取得value;
System.out.println(values);
//Map的标准输出,不是直接用迭代器,而是先要转换成Entry的Set然后再用迭代器
Set<Map.Entry<String,String>> entrySet = map.entrySet();
Iterator<Map.Entry<String,String>> entryIter = entrySet.iterator();
while(entryIter.hasNext()){
Map.Entry<String,String> entry = entryIter.next();
System.out.println(entry.getKey()+"->"+entry.getValue());
}</span>
b. TreeMap:操作与HashMap类似,但是里面的数据是根据key来排序的。
c. WeakHashMap:弱引用(了解);与HashMap的不同就是,改集合里面的元素,一旦调用System.gc后就会被回收清除。
补充:对象的引用强度;
-强引用:无论内存是否足够,引用对象都不会被清除;
-软引用:只有当内存不足的时候,才会被gc回收清除;
-弱引用:无论内存是否足够,一旦gc调用就立马清除回收;
-虚引用:和无任何引用一样;
d. IdentityHashMap:与HashMap的区别就是,集合里面的内容是可以重复的。
小结:以上Map中的所有操作,凡是涉及到非系统类对象的比较删除,或者自动去重,都需要在相应的类中重写上面提到的两个函数;涉及的排序的,就要在类中实现比较器接口;equals()与Comparable接口的运用在前面文章提到过,这里不再重提,而hashCode()方法一般就是通过把非数字属性的hashCode乘上数字属性,如:
public int hashCode(){
return this.name.hashCode()*this.age;//name为字符窜,age为整型
}