Collection 表示一组对象,这些对象也称为 collection 的元素。一些 collection 允许有重复的元素,而另一些则不允许。一些 collection 是有序的,而另一些则是无序的
常用子接口 List,Set,Queue
List是有序的Collection,使用此接口能够精确的控制每个元素插入的位置。用户能够使用索引(元素在List中的位置,类似于数组下 >标)来访问List中的元素,这类似于Java的数组
Collections.sort() 排序数组 Collections.reverse()实现逆排序
List接口的常用子类有Vector,ArrayList,LinkedList
基于数组(Array)的List
1.封装了数组所不具备的一些功能,性能也不可能超越数组 2.线程同步【多个线程对其读写会抛出异常】
Vector<Object> vector = new Vector<Object>(); vector.add(1);//整型 vector.add(0.3);//浮点型 vector.add("hello");//字符型 vector.add(Boolean.FALSE);//布尔型 System.out.println("Vector:"+vector); System.out.println("Size:" + vector.size()); vector.remove(1);//删除index处元素 System.out.println("Vector after remove:"+vector); vector.remove(vector.lastElement());//删除最后一个节点 vector.set(1,"world"); System.out.println("Vector after set:"+vector);Vector和ArrayList用法均相同
不同点是 ArrayList允许多个线程读写
ArrayList<Double> arraylist = new ArrayList<Double>(); arraylist.add(1.0); arraylist.add(4.0); arraylist.add(5.0); arraylist.add(2.3); System.out.println("单纯的add表示从结尾加入元素:" + arraylist); System.out.println("size()能求出所含元素的个数:" + arraylist.size()); arraylist.remove(1); System.out.println("remove(1)表示删去第1个元素,由于计数从0开始,也就是4这个元素:" + arraylist); arraylist.remove(arraylist.size() - 1); System.out.println("删去最后一个元素的arraylist为:" + arraylist); arraylist.add(0, 1.8888); System.out.println("在第0个位置加入1.8888这个元素:" + arraylist); arraylist.set(0, 9.0); System.out.println("把第0个位置这个元素改为a:" + arraylist); Collections.sort(arraylist); System.out.println("如果arraylist不是抽象类型,则支持排序" + arraylist);2.随机访问,通过索引值去遍历
for (int i=0;i<arraylist.size();i++){ System.out.println(arraylist.get(i)); }3.foreach循环遍历
for (Double d:arraylist){ System.out.println(d); }LinkedList不同于前面两种List,它不是基于数组的,而是双向列表,列表中的每个节点都包含了对前一个和后一个元素的引用.
它每一个节点(Node)都包含两方面的内容: 1.节点本身的数据(data); 2.下一个节点的信息(nextNode)。
所以当对LinkedList做添加,删除动作的时候就不用像基于数组的ArrayList一样,必须进行大量的数据移动。只要更改nextNode的相关信息就可以实现了,这是LinkedList的优势。
LinkedList<Object> linkedList = new LinkedList<Object>(); //添加元素 linkedList.add("hello"); linkedList.add(111); linkedList.add(100.2200); linkedList.add(1,"world"); System.out.println(linkedList); System.out.println(linkedList.getFirst());//取首元素 System.out.println(linkedList.getLast());//取尾元素 List<Object> list = linkedList.subList(0,2);//从链表生成子表 System.out.println(list); //把链表当初栈或者队列来处理 linkedList.addFirst("first"); linkedList.addLast("last"); System.out.println(linkedList); //删除元素 linkedList.remove(linkedList.size()-1); linkedList.pop(); linkedList.removeFirst(); linkedList.removeLast();Stack 类表示后进先出(LIFO)的对象堆栈。它通过五个操作对类 Vector 进行了扩展 ,允许将向量视为堆栈。它提供了通常的 push 和 pop 操作,以及取堆栈顶点的 peek 方法、测试堆栈是否为空的 empty 方法、在堆栈中查找项并确定到堆栈顶距离的 search 方法
Stack stack = new Stack(); // 创建堆栈对象 System.out.println("11111, absdder, 29999.3 三个元素入栈"); stack.push(new Integer(11111)); //向 栈中 压入整数 11111 printStack(stack); //显示栈中的所有元素 stack.push("absdder"); //向 栈中 压入 printStack(stack); //显示栈中的所有元素 stack.push(new Double(29999.3)); //向 栈中 压入 printStack(stack); //显示栈中的所有元素 String s = new String("absdder"); System.out.println("元素absdder在堆栈的位置"+stack.search(s)); System.out.println("元素11111在堆栈的位置"+stack.search(11111)); System.out.println("11111, absdder, 29999.3 三个元素出栈"); //弹出 栈顶元素 System.out.println("元素"+stack.pop()+"出栈"); printStack(stack); //显示栈中的所有元素 System.out.println("元素"+stack.pop()+"出栈"); printStack(stack); //显示栈中的所有元素 System.out.println("元素"+stack.pop()+"出栈"); printStack(stack); //显示栈中的所有元素 private static void printStack(Stack<Integer> stack ){ if (stack.empty()) System.out.println("堆栈是空的,没有元素"); else { System.out.print("堆栈中的元素:"); Enumeration items = stack.elements(); // 得到 stack 中的枚举对象 while (items.hasMoreElements()) //显示枚举(stack ) 中的所有元素 System.out.print(items.nextElement()+" "); } System.out.println(); //换行 }所有的List中只能容纳单个不同类型的对象组成的表,而不是Key-Value键值对。例如:[ tom,1,c ]
所有的List中可以有相同的元素,例如Vector中可以有 [ tom,koo,too,koo ]
所有的List中可以有null元素,例如[ tom,null,1 ]
基于Array的List(Vector,ArrayList)适合查询,而LinkedList 适合添加,删除操作
Set是一种不包含重复的元素的无序 Collection。
弱键(weak key)Map,Map中使用的对象也被允许释放: 这是为解决特殊问题设计的。如果没有map之外的引用指向某个“键”,则此“键”可以被垃圾收集器回收。
使用==代替equals()对“键”作比较的hash map。专为解决特殊问题而设计。