当前位置:文档之家› JAVA常用集合类详解(有例子 经典呐!!!集合类糊涂的来看啊!!)

JAVA常用集合类详解(有例子 经典呐!!!集合类糊涂的来看啊!!)

Collections Framework 集合框架是一个统一的架构,用来表示和操作集合. 集合框架主要是由接口,抽象类和实现类构成. 接口:蓝色;实现类:红色 Collection |_____Set(HashSet) | |_____SortedSet(TreeSet) |_____List(LinkedList,ArrayList) Collection:集合层次中的根接口,JDK 没有提供这个接口的实现类。 Set:不能包含重复的元素, 子接口 SortedSet 是一个按照升序排列的元素的 Set。 List:可以包含重复的元素,是一个有序的集合,提供了按索引访问的方式,有 次序,位置不改变。 Collection 接口常用的方法: boolean add(E o) 确保此 collection 包含指定的元素(可选操 作)。 boolean contains(Object o) 如果此 collection 包含指定的元素,则返回 true。 boolean remove(Object o) 从此 collection 中移除指定元素的单个实 例,如果存在的话(可选操作)。 int size() 返回此 collection 中的元素数。 Object[] toArray() 返回包含此 collection 中所有元素的数组。 Iterator<E> iterator() 返回在此 collection 的元素上进行迭代 的迭代器。 List 接口特有方法: E get(int index) 返回列表中指定位置的元素。 SortedSet 接口特有方法: E first()
用 element 替换指定的 index 的对象 Arrays.asList()和 Collection.toArray()是作为数组和集合类的一个桥 如果想从集合类中获得一个数组可以使用 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]
返回此有序集合中当前第一个(最小的)元素。 E last() 返回此有序集合中最后一个(最大的)元素。 集合框架中的实现类. 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]
x=3,y=3 x=4,y=4 x=5,y=5 [ng.Object;@1fc4bec [x=3,y=3, x=4,y=4, x=5,y=5] LinkedList 类 LinkedList 是采用双向循环链表实现的. 利用 LinkedList 实现栈(stack), 队列(queue), 双向队列(double-ended queue) LinkedList 常用方法 void addFirst(Object o) void addLast(Object o) Object getFirst() Object getLast() Object remove(int index) boolean remove(Object o) Object removeFirst() Object removeLast() 判断是否为空 LinkedList 继承了一个方法 isEmpty() 如果没有包含任何元素返回 true,没有包含任何元素返回 false ArrayList 底层采用数组完成,而 LinkedList 则是以一般的 双向链表完成,其内每个对象除了数据本身外,还有两个引用, 分别指向前一个元素和后一个元素. 如果我们经常在 List 的开始处增加元素,或者在 List 中进行插入 和删除操作,我们应该使用 LinkedList,否则的话,使用 ArrayList 将更加快速. 因为插入和删除都要移动数组中的元素. 只是访问就用 ArrayList,提供了按索引访问的机制. HashSet HashSet 实现了 Set 接口的 hash table(哈希表),依靠 HashMap 来实现. 应该为要存放到散列表的各个对象定义 hashCode()和 equals(). 因为实现了 set 接口所以不能有重复的元素. 散列表: 散列表又称为哈希表. 散列表算法的基本思想: 以结点的关键字为自变量,通过一定的函数关系(散列函数) 计算出对应的函数值,以这个值作为该结点存储在散列表中的地址. 当散列表中的元素存放太满,就必须进行再散列,将产生一个新的散列表, 所有元素存放到新的散列表中,原先的散列表将被删除. 在 java 语言中,通过负载因子(load factor)来决定何时对散列表进行再 散列.例如:如果负载因子是 0.75,当散列表中已经有 75%的位置已经放满, 那么将进行散列.
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=pareTo(); } 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) { =name; this.num=num; } public int HashCode() { return num*name.hashCode(); }
利用 ArrayList 的 toArray()返回一个对象的数组也可以利用 Arrays.asList() 方法返回一个列表 返回固定尺寸的列表,当返回以后就不能修改列表的大小了,可以修改列表中元 素的值,但不能增加容量,可以用 set()方法对值进行修改: Object set(int பைடு நூலகம்ndex,Object element)
{ =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(); } public String toString() { return "name : ="+name; } } 需要覆盖 HashCode()和 equals()方法 HashSet->HashCode->对象内存地址
负载因子越高(越接近 1.0),内存的使用率越高,元素的寻找时间越长. 负载因子越低(越接近 0.0),元素的寻找时间越短,内存浪费越多. HashSet 类的缺省负载因子是 0.75. HashSet 在 java.util 包当中. 需要导入. 常用方法 boolean add(Object o) 需要使用迭代器 HashSet 类实现了 Set 接口,所以不能有重复的元素. 要根据散列码计算存储位置. 而散列码是利用 Object 类当中的 HashCode()函数获得的. 而 HashCode()函数是通过一个对象的内存地址来得到散列码的. 所以要重写 public int HashCode()方法. String 类实继承了 HashCode()方法. 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)
相关主题