JDK1.2之后完善的架构,作用是完成了一个动态的对象数组,里面的数据元素可以动态的增加.
类集中提供了以下集中接口:
①单值操作接口:Collection,List,Set
List和Set是Collection的子接口
②一对值的操作接口: Map
③排序的操作接口: SortedMap,SortedSet
④输出的接口: Iterator,ListIterator,Enumeration
⑥队列: Queue
规定了 一个集合的基本操作方法.
接口定义:
public interface Collection<E> extends Iterable<E>
从开发的角度来说,集合的操作很少直接使用Collection类去完成功能,而是直接使用其子接口List和Set接口去实现.
List接口最大的特点是,里面的内容都允许重复.并新增操作方法.
List接口常用的子类有: ArrayList,Vector,LinkedList.
属于新的子类
定义:
public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, Serializable
示例1:
package com.ares.collectiondemo.listdemo; import java.util.ArrayList; import java.util.List; public class ArrayListAddDemo { public static void main(String args[]) { List<String> allList = new ArrayList<String>();// 为List接口实例化 allList.add("hello");// 增加元素,Collection接口定义 allList.add(0, "MLDN");// 增加元素,List接口定义 allList.add("world");// 增加元素,Collection接口定义 allList.add("world");// 增加元素,Collection接口定义 System.out.println(allList) ; } }
注:没有数组长度限制.
示例2:(删除操作)
package com.ares.collectiondemo.listdemo; import java.util.ArrayList; import java.util.List; public class ArrayListDeleteDemo { public static void main(String args[]) { List<String> allList = new ArrayList<String>();// 为List接口实例化 allList.add("hello");// 增加元素,Collection接口定义 allList.add(0, "MLDN");// 增加元素,List接口定义 allList.add("world");// 增加元素,Collection接口定义 allList.remove(0); // 删除第一个位置的元素,List接口定义 allList.remove("world");// 删除元素,Collection接口定义 System.out.println(allList); } }
示例3:(完成输出数据的操作)
package com.ares.collectiondemo.listdemo; import java.util.ArrayList; import java.util.List; public class ArrayListPrintDemo01 { public static void main(String args[]) { List<String> allList = new ArrayList<String>();// 为List接口实例化 allList.add("hello");// 增加元素,Collection接口定义 allList.add(0, "MLDN");// 增加元素,List接口定义 allList.add("world");// 增加元素,Collection接口定义 for (int i = 0; i < allList.size(); i++) {// 循环输出 System.out.println(allList.get(i)); // 输出内容 } } }
注意:Collection接口的输出因为没有get方法,所以需要先转化一下.
示例4:
package com.ares.collectiondemo.listdemo; import java.util.ArrayList; import java.util.Collection; public class ArrayListPrintDemo02 { public static void main(String args[]) { Collection<String> allList = new ArrayList<String>();// 为Collection接口实例化 allList.add("hello");// 增加元素,Collection接口定义 allList.add("MLDN");// 增加元素,Collection接口定义 allList.add("world");// 增加元素,Collection接口定义 Object obj[] = allList.toArray() ; for (int i = 0; i < obj.length; i++) {// 循环输出 System.out.println(obj[i]) ; } } }备注 :还可以指定泛型类型完成操作 :
String obj[] = allList.toArray(new String[]{}) ; for (int i = 0; i < obj.length; i++) {// 循环输出 String str = obj[i] ; System.out.println(str) ; }
ArrayList类的其他操作.
示例5:
package com.ares.collectiondemo.listdemo; import java.util.ArrayList; import java.util.List; public class ArrayListOtherDemo { public static void main(String args[]) { List<String> allList = new ArrayList<String>();// 为List接口实例化 allList.add("hello");// 增加元素 allList.add(0, "MLDN");// 增加元素 allList.add("world");// 增加元素 allList.add("www");// 增加元素 allList.add("mldnjava");// 增加元素 System.out.println(allList.contains("hello")) ; //结果为true System.out.println(allList.subList(2, 4)) ; //结果为[world,www] } }
旧的子类.
JDK1.0就有的子类,ArrayList是1.2推出的.Vector类实现了List接口,可以直接为List接口实例化.
示例:
package com.ares.collectiondemo.listdemo; import java.util.List; import java.util.Vector; public class VectorAddDemo { public static void main(String args[]) { List<String> allList = new Vector<String>();// 为List接口实例化 allList.add("hello");// 增加元素,Collection接口定义 allList.add(0, "MLDN");// 增加元素,List接口定义 allList.add("world");// 增加元素,Collection接口定义 System.out.println(allList) ; } }
备注:此类的操作方法和List接口中的方法是完全一样的.
ArrayList采用的是异步的处理操作,而Vector是同步,所以ArrayList类性能较高,Vector是线程安全的,输出的化,ArrayList类有Iterator,ListIterator,foreach,而Vector除了这三种外还多了一个Enumeration.
LinkedList完成的是一个链表的操作.
定义:
public class LinkedList<E> extends AbstractSequentialList<E> implements List<E>, Deque<E>, Cloneable, Serializable
示例:
package com.ares.collectiondemo.listdemo; import java.util.LinkedList; public class LinkedListDemo01 { public static void main(String[] args) { LinkedList<String> link = new LinkedList<String>() ; link.add("A") ; link.add("B") ; link.add("C") ; link.addFirst("X") ; link.addLast("Y") ; System.out.println("链表头:" + link.getFirst()); System.out.println("链表尾:" + link.getLast()); } }
示例2:
package com.ares.collectiondemo.listdemo; import java.util.LinkedList; public class LinkedListDemo02 { public static void main(String[] args) { LinkedList<String> link = new LinkedList<String>(); link.add("A"); link.add("B"); link.add("C"); link.addFirst("X"); link.addLast("Y"); for (int i = 0; i <= link.size(); i++) { System.out.print(link.element()); // 取出表头 } System.out.println("\nelemtn()操作之后:"+link); for (int i = 0; i <= link.size(); i++) { System.out.print(link.poll()); // 取出表头,同时删除表头 } System.out.print("\npoll()操作之后:"+link); } }
Set接口也是Collection接口的子接口,最大的特点是里面没有任何的重复元素,在Set接口中常用的子类有:
TreeSet
HashSet
Set接口并没有对Collection接口进行任何的扩充.
示例:
package com.ares.collectiondemo.setdemo; import java.util.HashSet; import java.util.Set; public class HashSetAddDemo { public static void main(String[] args) { Set<String> allSet = new HashSet<String>(); allSet.add("A"); // 增加 allSet.add("B"); // 增加 allSet.add("C"); // 增加 allSet.add("C"); // 增加重复元素 allSet.add("C"); // 增加重复元素 allSet.add("D"); // 增加 allSet.add("E"); // 增加 System.out.println(allSet); } }输出结果 :
[D,A,C,B,E] //没有重复,而且是散列存放的.
示例:
package com.ares.collectiondemo.setdemo; import java.util.Set; import java.util.TreeSet; public class TreeSetAddDemo { public static void main(String[] args) { Set<String> allSet = new TreeSet<String>(); allSet.add("C"); // 增加重复元素 allSet.add("D"); // 增加 allSet.add("E"); // 增加 allSet.add("A"); // 增加 allSet.add("B"); // 增加 allSet.add("C"); // 增加 allSet.add("C"); // 增加重复元素 System.out.println(allSet); } }结果 :
[A,B,C,D,E] //不允许有重复,但是是有序存放的.
示例:
Person类代码:
package org.lxh.collectiondemo.setdemo; public class Person implements Comparable<Person> { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } public String toString() { // 覆写toString() return "姓名:" + this.name + ";年龄:" + this.age; } public int compareTo(Person o) { //覆写实现Comparable接口后的方法 if (this.age > o.age) { //比较的是对象中的年龄属性 return 1; } else if (this.age < o.age) { return -1; } else { return this.name.compareTo(o.name); // 比较name } } }
HashSetAdd类代码:
Set<Person> allSet = new HashSet<Person>(); … ... allSet.add(new Person("王五",31));
说明: 如果没有name属性的比较,那么只要是年龄相同的元素都是不可能被添加进去的,因为会被当做重复的元素被过滤掉.但是添加了name属性的比较又有一个新的问题,那就是同名通年龄的对象不会被过滤掉,都会显示出来.因为在add 时,allSet.add(new Person("王五",31));对象会开辟不同的内存,会被当做是两个不同的HashSet元素.
要想解决4.3中的问题则需要另外覆写两个方法.
public boolean equals(Object obj) { if (this == obj) { return true; } if (!(obj instanceof Person)) { return false; } Person p = (Person) obj; if (this.name.equals(p.name) && this.age == p.age) { return true; } else { return false; } } public int hashCode() { // 这个方法的返回值都是通过一个公式计算的 // 此时的公式:名字的hashCode * age |乘法 return this.name.hashCode() * this.age; }
注:在Object类中是通过hashCode()和equals()方法来完成重复元素的验证的.
java类集中集合输出常用的有四种输出:
Iterator
ListIterator
foreach
Enumeration
Iterator接口表示迭代接口.
常用方法:
hasNext()
next()
remove()
如果想为Iterator接口实例化,则必须使用Collection接口的如下方法:
public Iterator<T> iterator()
示例:
package com.ares.iteartordemo; import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class IteratorDemo { public static void main(String[] args) { List<String> allList = new ArrayList<String>(); allList.add("A"); allList.add("B"); allList.add("C"); Iterator<String> iter = allList.iterator(); //示例化 while (iter.hasNext()) { System.out.print(iter.next() + "、"); } } }
删除操作的代码:
Iterator<String> iter = allList.iterator(); while (iter. ()) { String str = iter.next(); // 取出内容 if ("C".equals(str)) { iter.remove();// 删除元素 } System.out.print(str + "、"); } System.out.println("删除之后的集合:" + allList);
需要注意的一点是,如果上述的代码iter.remove();删除操作用的是allList.remove(str);则为报错,因为Iterator类是将一个集合的输出交给它来完成,如果直接使用集合的删除操作为破坏整个集合的内容,实际开发中也很少使用Iterator进行删除的操作,只是判断是否有值并将其输出.
ListIterator接口是Iterator接口的子接口.Iterator接口最大的特点是从前向后迭代输出,如果现在要想执行双向输出,则只能使用ListIterator接口,但此接口使用只能输出List接口的内容,因为要依靠如下方法:
public ListIterator<E> listiterator()
示例:
package org.lxh.listiteartordemo; import java.util.ArrayList; import java.util.List; import java.util.ListIterator; public class ListIteratorDemo01 { public static void main(String[] args) { List<String> allList = new ArrayList<String>(); allList.add("A"); allList.add("B"); allList.add("C"); ListIterator<String> iter = allList.listIterator(); System.out.print("从前向后输出:"); while (iter.hasNext()) { System.out.print(iter.next() + "、"); } System.out.print("\n从后向前输出:"); while (iter.hasPrevious()) { System.out.print(iter.previous() + "、"); } } }注 :要想执行双向输出 ,首先一定要保证执行了有前向后的输出 ,否则执行会没有内容 .
ListIterator接口除了双向输出外还可以对数据执行修改操作.
示例:
package com.ares.listiteartordemo; import java.util.ArrayList; import java.util.List; import java.util.ListIterator; public class ListIteratorDemo { public static void main(String[] args) { List<String> allList = new ArrayList<String>(); allList.add("A"); allList.add("B"); allList.add("C"); ListIterator<String> iter = allList.listIterator(); iter.add("X"); // 增加数据 System.out.print("从前向后输出:"); while (iter.hasNext()) { String str = iter.next(); iter.set(str + " - A"); // 修改 System.out.print(str + "、"); } System.out.print("\n从后向前输出:"); while (iter.hasPrevious()) { System.out.print(iter.previous() + "、"); } } }输出结果 :
从前向后输出:A、B、C 从后向前输出:C-A、B-A、C-A
示例:
package com.ares.foreachdemo; import java.util.HashMap; import java.util.Map; public class ForeachMapDemo { public static void main(String[] args) { Map<String, Integer> map = new HashMap<String, Integer>(); map.put("zhangsan", 1); map.put("zhangsan", 2); map.put("lisi", 3); map.put("wangwu", 5); for (Map.Entry<String,Integer> me : map.entrySet()) { System.out.println(me.getKey() + " --> " + me.getValue()); } } }
注:(ArrayList遍历输出)
List<String> allList = new ArrayList<String>(); allList.add("A"); ... ... for (String str : allList) { System.out.print(str + "、"); ... ...
Enumeration接口是一个古老的接口,支持此种输出的只有Vector类.
Vector类中有如下的方法:public Enumeration<E> elements(),通过此方法为Enumeration接口实例化.
示例:
package com.ares.enumerationdemo; import java.util.Enumeration; import java.util.Vector; public class EnumerationDemo { public static void main(String[] args) { Vector<String> allList = new Vector<String>(); allList.add("A"); allList.add("B"); Enumeration<String> enu = allList.elements(); while (enu.hasMoreElements()) { System.out.print(enu.nextElement() + "、"); } } }
20150513
JAVA学习笔记系列
--------------------------------------------
联系方式
--------------------------------------------
Weibo: ARESXIONG
E-Mail: [email protected]
------------------------------------------------