<span style="font-family: Arial, Helvetica, sans-serif;">转载地址:http://blog.csdn.net/zdwzzu2006/article/details/4567787</span>
Collections Framework
集合框架是一个统一的架构,用来表示和操作集合.
集合框架主要是由接口,抽象类和实现类构成.
接口:蓝色;实现类:红色
Collection
|_____Set(HashSet)
| |_____SortedSet(TreeSet)
|_____List(LinkedList,ArrayList)
Collection:集合层次中的根接口,JDK没有提供这个接口的实现类。
Set:不能包含重复的元素,子接口SortedSet是一个按照升序排列的元素的Set。
List:可以包含重复的元素,是一个有序的集合,提供了按索引访问的方式,有次序,位置不改变。
ArrayList:
本质:我们可以将其看作是能够自动增长容量的数组,实际是采用对象数组实现的。
自动增长容量就是当数组不够的时候,再定义更大的数组,然后将数组元素拷贝到新的数组.
import java.util.*; class ArrayListTest { public static void main(String[] args) { ArrayList a1=new ArrayList(); a1.add("winsun"); a1.add("weixin"); a1.add("mybole"); for(int i=0;i<a1.size();i++) { System.out.println(a1.get(i)); } System.out.println(a1); } }
结果:
winsun
weixin
mybole
[winsun, weixin, mybole]
利用ArrayList的toArray()返回一个对象的数组也可以利用Arrays.asList()方法返回一个列表。如果想从集合类中获得一个数组可以使用toArray()方法;如果想从数组中获得一个列表可以使用asList()方法 :
import java.util.*; class Point { int x, y; Point(int x, int y) { this.x = x; this.y = y; } public String toString() { return "x=" + x + ",y=" + y; } } public class ArrayListToArrayTest { public static void main(String[] args) { ArrayList a1 = new ArrayList(); a1.add(new Point(3, 3)); a1.add(new Point(4, 4)); a1.add(new Point(5, 5)); for (int i = 0; i < a1.size(); i++) { System.out.println(a1.get(i)); } System.out.println(a1); Object[] objs = a1.toArray(); // 利用ArrayList的toArray()返回一个对象的数组. for (int i = 0; i < objs.length; i++) { System.out.println(objs[i]); } System.out.println(objs);// List l = Arrays.asList(objs);// Arrays.asList()返回一个列表. System.out.println(l); } }
结果:
x=3,y=3
x=4,y=4
x=5,y=5
[x=3,y=3, x=4,y=4, x=5,y=5]
x=3,y=3
x=4,y=4
x=5,y=5
[Ljava.lang.Object;@1fc4bec
[x=3,y=3, x=4,y=4, x=5,y=5]
LinkedList:
import java.util.Deque; import java.util.LinkedList; import java.util.Queue; import java.util.Stack; public class LinkedListDemo { public static void main(String[] args) { Stack<Object> s = new Stack<Object>();//堆栈 Queue<Object> q = new LinkedList<Object>();//队列 Deque<Object> d = new LinkedList<Object>();//双向队列 } }HashSet:
HashSet实现了Set接口的hash table(哈希表),依靠HashMap来实现.
应该为要存放到散列表的各个对象定义hashCode()和equals().
因为实现了set接口所以不能有重复的元素.
散列表:
散列表又称为哈希表.
散列表算法的基本思想:
以结点的关键字为自变量,通过一定的函数关系(散列函数)
计算出对应的函数值,以这个值作为该结点存储在散列表中的地址.
当散列表中的元素存放太满,就必须进行再散列,将产生一个新的散列表,
所有元素存放到新的散列表中,原先的散列表将被删除.
在java语言中,通过负载因子(load factor)来决定何时对散列表进行再
散列.例如:如果负载因子是0.75,当散列表中已经有75%的位置已经放满,
那么将进行散列.
负载因子越高(越接近1.0),内存的使用率越高,元素的寻找时间越长.
负载因子越低(越接近0.0),元素的寻找时间越短,内存浪费越多.
HashSet类的缺省负载因子是0.75.
import java.util.*; public class HashSetTest { public static void main(String []args) { HashSet hs=new HashSet(); /* hs.add("one"); hs.add("two"); hs.add("three"); hs.add("one"); */ hs.add(new Student(1,"zhangsan")); hs.add(new Student(2,"lisi")); hs.add(new Student(1,"zhangsan")); hs.add(new Student(3,"wangwu")); Iterator it=hs.iterator(); while(it.hasNext()) { System.out.println(it.next()); } } } class Student { int num; String name; Student(int num,String name) { this.name=name; this.num=num; } public int HashCode() { return num*name.hashCode(); } public boolean equals(Object o) { Student s=(Student)o; return num==s.num && name.equals(s.name); } public String toString() { return "name : ="+name; } }
import java.util.*; public class TreeSetTest { //如果自定义类对象要加入TreeSet要实现Comparable接口 public static void main(String []args) { TreeSet ts=new TreeSet(new Student.StudentComparator()); /* ts.add("winsun"); ts.add("weixin"); ts.add("mybole"); */ ts.add(new Student(2,"lisi")); ts.add(new Student(1,"wangwu")); ts.add(new Student(3,"zhangsan")); ts.add(new Student(3,"mybole")); Iterator it=ts.iterator(); while(it.hasNext()) { System.out.println(it.next()); } } } class Student implements Comparable { int num; String name; static class StudentComparator implements Comparator { public int compare(Object o1,Object o2) { Student s1=(Student)o1; Student s2=(Student)o2; int result=s1.num>s2.num ? 1 : (s1.num==s2.num ? 0 : -1); if(result==0) { //String类实现了compareTo()方法. result=s1.name.compareTo(s2.name); } return result; } } public static void printElements(Collection c) { Iterator it=c.iterator(); while(it.hasNext()) { System.out.println(it.next()); } } Student(int num,String name) { this.name=name; this.num=num; } public int HashCode() { return num*name.hashCode(); } public boolean equals(Object o) { Student s=(Student)o; return num==s.num && name.equals(s.name); } public int compareTo(Object o) { Student s=(Student)o; return num>s.num?1:(num==s.num?0:-1); } public String toString() { return num+":"+name; } }
迭代器:
Collection提供了一个iterator()方法,可以返回一个迭代器,迭代器是指向两个元素之间的指针。凡是继承自Collection的接口或间接的实现类都有这个方法.
其中有3个方法
1.hasNext()
2.next()
3.remove()
hasNext()判断是否有更多的元素,如果有返回true
ArrayList al1=new ArrayList(); Iterator it=al.iterator(); it.next(); while(it.hasNext()) { System.out.println(it.next()); }通用方式访问集合中的元素
public static void printElements(Collection c) { Iterator it=c.iterator(); while(it.hasNext()) { System.out.println(it.next()); } }
import java.util.*; public class HashMapTest { public static void printElements(Collection c) { Iterator it=c.iterator(); while(it.hasNext()) { System.out.println(it.next()); } } public static void main(String []args) { HashMap hm=new HashMap(); hm.put("1", "zhang3"); hm.put("2", "li4"); hm.put("3", "wang5"); System.out.println(hm.get("1")); System.out.println(hm.get("2")); System.out.println(hm.get("3")); Set keys=hm.keySet(); System.out.println("-----------keys---------"); printElements(keys); Collection values=hm.values(); System.out.println("-----------values---------"); printElements(values); Set entrySets =hm.entrySet(); System.out.println("------------entrySets-----------"); printElements(entrySets); Iterator it=entrySets.iterator(); while(it.hasNext()) { Map.Entry me=(Map.Entry)it.next(); System.out.println(me.getKey()+" = "+me.getValue()); } } }
Vector集合类
Vector:用ArrayList代替Vector.Vector内所有方法都是同步的,存取元素效率低.在多线程中可以使用
Hashtable:用HashMap代替Hashtable 需要同步Map的时候可以用Collection类的方法
static Map synchronizedMap(Map m) 但是还是Hashtable获取的同步Map快一些.
Stack集合类:Stack:用LinkedList代替Stack.