集合类概述
常用集合的继承关系如下图所示:
其中我们常用的就是Collection接口中的Ste接口和List接口。其中最常用的就是ArrayList和LinkedList。
注意:Map、Collection以及其中的Ste和List都是接口,都是不可以被实例化的!
1.Map(映射)
Map 是一种把键对象和值对象映射的集合,它的每一个元素都包含一对键对象和值对象。 Map没有继承于Collection接口 从Map集合中检索元素时,只要给出键对象,就会返回对应的值对象。
a.Map集合中的键对象不允许重复,也就说,任意两个键对象通过equals()方法比较的结果都是false.,但是可以将任意多个键独享映射到同一个值对象上。
b.Map接口中又分Hasmap和Treemap,他们都是Map接口下的具象class是可以被实例化的。
HashMap就是使用对象的hashCode()进行快速查询的。此方法能够显着提高性能。
TreeMap : 基于红黑树数据结构的实现。查看“键”或“键值对”时,它们会被排序(次序由Comparabel或Comparator决定)。TreeMap的特点在 于,你得到的结果是经过排序的。TreeMap是唯一的带有subMap()方法的Map,它可以返回一个子树。
Map的常用方法:
package com.inba.maya.JiHe; import java.util.*; public class Test { //Map接口的常用用法! 在Map接口中没有实现Iterator迭代器! public static void main1(String[] args) { Map<String,String> map=new HashMap<String,String>(); //添加数据 map.put("张三", "张三的歌"); map.put("李四", "李四的歌"); map.put("王五", "王五的歌"); map.put("赵六", "赵六的歌"); map.put("周七", "周七的歌"); //获得key是张三的values值; String s=map.get("张三"); System.out.println(s); //获得map中所有的key对象组成的Set集合 Object obj=map.keySet(); System.out.println(obj); //获得map中所有的值对象组成的Collection集合 System.out.println(map.values()); //获得map的集合大小 System.out.println(map.size()); //是否有key是张三的键,是就返回true,不是就返回false System.out.println(map.containsKey("张三")); //是否有key是王五的歌的值,是就返回true,不是就返回false System.out.println(map.containsValue("王五的歌")); //移除键是王五的键 map.remove("王五"); System.out.println(map.keySet()+"*****"+map.values()); //移除所有 map.clear(); System.out.println(map.size()); } }
打印出来对应的效果:
二:
List接口中社和于自身的方法都与索引有关。因此可以通过对象的索引来操作对象。
List:次序是List最重要的特点:它保证维护元素特定的顺序。List为Collection添加了许多方法,使得能够向List中间插入与移除元素(这只推 荐LinkedList使用。)一个List可以生成ListIterator,使用它可以从两个方向遍历List,也可以从List中间插入和移除元 素。
List接口下分:
ArrayList:由数组实现的List。允许对元素进行快速随机访问,但是向List中间插入与移除元素的速度很慢。ListIterator只应该用来由后向前遍历 ArrayList,而不是用来插入和移除元素。因为那比LinkedList开销要大很多。
LinkedList :对顺序访问进行了优化,向List中间插入与删除的开销并不大。随机访问则相对较慢。(使用ArrayList代替。)还具有下列方 法:addFirst(), addLast(), getFirst(), getLast(), removeFirst() 和 removeLast(), 这些方法 (没有在任何接口或基类中定义过)使得LinkedList可以当作堆栈、队列和双向队列使用。
List接口的常用方法:
package com.inba.maya.JiHe; import java.util.*; public class Test { //Collection接口下List接口的常用方法! public static void main(String[] args){ List<String> list=new ArrayList<String>();//ArryList //添加数据add(obj); list.add("吕布"); list.add("典韦"); list.add("赵云"); list.add("关羽"); list.add("马超"); list.add("张飞"); //获得list的集合大小 System.out.println(list.size()); //用来获得一个包中的所有对象, Iterator<String> it=list.iterator(); while(it.hasNext()){ System.out.println(it.next()); } //获得序列号是0.1.2的对象 System.out.println(list.get(0)+"**"+list.get(1)+"**"+list.get(2)); //指定添加的位置 list.add(1, "我添加的放在了下标为1的位置"); for(int i=0;i<list.size();i++){ System.out.println(list.get(i)); } //移除指定位置的对象 list.remove(0); System.out.println(list.get(0)); //替换指定位置的对象 list.set(0, "替换了"); System.out.println(list.get(0)); // Iterator<String> it2=list.iterator(); while(it2.hasNext()){ System.out.println(it2.next()); } } }
效果图:
三:迭代器
Iterator接口位于java.util包下,Iterator接口中有单个方法。
hsaNext():如果仍有元素可以迭代那么返回true,反之返回false。常用于是for循环中的判断条件
next:返回迭代的下一个元素。
remove():从迭代器指向的collection中移除迭代器返回的最后一个元素(可选操作)
除了Iterator可以实现遍历之外,还有一个更强大的ListIterator,它可以实现逆序遍历列表中的元素,示例如下:
package com.inba.maya.JiHe; import java.util.*; public class Test { public static void main(String[] args){ List<String> list=new ArrayList<String>();//ArryList //添加数据add(obj); list.add("吕布"); list.add("典韦"); list.add("赵云"); list.add("关羽"); list.add("马超"); list.add("张飞"); //正序排列 Iterator<String> it2=list.iterator(); while(it2.hasNext()){ System.out.println(it2.next()); } //倒序排列 ListIterator<String> it3=list.listIterator(); while(it3.hasNext()){ it3.next(); } while(it3.hasPrevious()){ System.out.println(it3.previous()); } } }
效果图:
总结:
Collection
--List:将以特定次序存储元素。
--ArrayList / LinkedList / Vector
--Set : 不能含有重复的元素,自行排序
--HashSet / TreeSet
Map
--HashMap
--HashTable
--TreeMap
追加:
取得两个List的交集,retainAll()方法
import Java.util.ArrayList;
import java.util.List;
public class strSplit {
public static void main(String args[])
{
List<String> list1 = new ArrayList<String>();
List<String> list2 = new ArrayList<String>();
list1.add("g");
list1.add("s");
list1.add("a");
list1.add("f");
list2.add("g");
list2.add("c");
list2.add("b");
list2.add("a");
list1.retainAll(list2);
System.out.print(list1);
}
}
程序输出结果为:
[g, a]
Java中Set有这样一个方法,.addAll( Collection c),直接加入List集合,去掉重复的数据。
- public static void main(String[] args) {
- Set set=new HashSet();
- set.add("abc");
- set.add("cde");
- set.add("efg");
- set.add("fgh");
- set.add("abc"); //重复的abc,set会自动将其去掉
- System.out.println("size="+ set.size() );
- List list = new ArrayList();
- list.add("abc");
- list.add("aaa");
- list.add("fff");
- set.addAll(list); //将list中的值加入set,并去掉重复的abc
- System.out.println("size="+ set.size() );
- for( Iterator it = set.iterator(); it.hasNext(); )
- {
- System.out.println("value="+it.next().toString());
- }
- }