標籤:set list java集合架構
|–List:元素是有序的,元素可以重複。因為該集合體系有索引。
|–ArrayList:底層的資料結構使用的是數組結構。特點:查詢速度很快,但是增刪較慢。線程不同步。
|–linkedList:底層使用的是鏈表資料結構。特點:增刪速度很快,查詢稍慢。
|–Vector:底層是數組資料結構。特點:線程同步,被ArrayList替代。
|–Set:元素是無序的,元素不可重複。
|–HashSet: 底層資料結構是雜湊表。線程是非同步的。
保證元素唯一性原理:判斷hashcode值是否相等,再判斷equals方法。
|–TreeSet: 可以對Set集合中的元素進行排序
底層結構是二叉樹
保證元素唯一性的依據:compareTo方法return 0
排序方法1:實現Comparable介面,並重寫compareTo方法
排序方法2:實現comparator介面,並重寫compare方法
package pack;
import java.util.*;
public class Demo { public static void sys(Object obj) { System.out.println(obj); } public static void main(String[] args) { method8(); } public static void method1() { ArrayList al = new ArrayList(); //建立集合,collection的子類,ArrayList al.add("java1"); al.add("java2"); al.add(1,"java9"); //增 al.remove(1); //刪 al.set(1, "hello"); //改 al.get(1); //查 al.add(23); //al.remove("java1"); //al.clear(); sys(al.indexOf("hello")); sys(al.isEmpty()); sys(al.contains("java")); sys(al); //輸出資料行表 sys("size="+al.size()); for(int i = 0;i<al.size();i++) { al.get(i); } /* Iterator it=al.iterator(); //擷取迭代器,取出元素 while(it.hasNext()) { sys(it.next()); */ for(Iterator it = al.iterator();it.hasNext();) { sys(it.next()); } } public static void method2() { ArrayList al1 = new ArrayList(); al1.add("java1"); al1.add("java2"); al1.add("java3"); ArrayList al2 = new ArrayList(); al2.add("java2"); al2.add("java3"); al2.add("java4"); al1.retainAll(al2); //取交集 al1.removeAll(al2); //去除交集 /*for(Iterator it = al2.iterator();it.hasNext();) { if(it.next().equals("java3")) it.remove(); //此迭代器只能刪除,其它做不了,會出現並發修改異常。 //所以出現了ListIterator }*/ /*for(ListIterator li = al2.listIterator();li.hasNext();) { if(li.next().equals("java2")) al2.add("java"); }*/ sys(al2); } public static void method3() { Vector v = new Vector(); v.add("java1"); v.add("java2"); v.add("java3"); //sys(v); for(Enumeration en = v.elements();en.hasMoreElements();) //枚舉是Vector的特有取出方式 sys(en.nextElement()); } public static void method4() { LinkedList link = new LinkedList(); link.addFirst("java1"); link.addLast("java2"); link.addFirst("java3"); sys(link.getFirst()); //取 sys(link.removeFirst()); //取、刪 /* while(!link.isEmpty()) { sys(link.removeFirst()); }*/ } public static void method5() { HashSet hs = new HashSet(); hs.add("java1"); sys(hs.add("java1")); //false,set裡無重複,添加失敗 hs.add("java2"); hs.add("java3"); hs.add("java4"); for(Iterator it = hs.iterator();it.hasNext();) { //set只能迭代輸出 sys(it.next()); } } public static void method6() { HashSet hs = new HashSet(); hs.add(new Person("aa",1)); hs.add(new Person("bb",6)); hs.add(new Person("cc",3)); hs.add(new Person("dd",4)); for(Iterator it = hs.iterator();it.hasNext();) { sys(((Person)it.next()).getName()); sys(((Person)it.next()).getAge()); } } public static void method7() { //TreeSet特點:比較性 TreeSet ts = new TreeSet(); ts.add(new Person("aa",1)); ts.add(new Person("bb",6)); ts.add(new Person("cc",3)); ts.add(new Person("dd",4)); /*for(Iterator it = ts.iterator();it.hasNext();) { //4個元素排序了 sys(((Person)it.next()).getName()+((Person)it.next()).getAge()); }*/ Iterator it = ts.iterator(); while(it.hasNext()) { Person p = (Person)(it.next()); sys(p.getName()+"----"+p.getAge()); } } public static void method8() { TreeSet ts = new TreeSet(new Mycompare()); //往建構函式傳入比較子對象 ts.add(new Person("aa",1)); ts.add(new Person("bb",6)); ts.add(new Person("cc",3)); ts.add(new Person("dd",4)); Iterator it = ts.iterator(); while(it.hasNext()) { Person p = (Person)(it.next()); sys(p.getName()+"----"+p.getAge()); } }}/*該介面強制讓人對象具備比較性。因為TreeSet輸出要排序的,而人對象不具備比較性,輸出出錯, 因此要實現Comparable,並重寫compareTo方法*/class Person implements Comparable { //實現介面是為了method7() private String name; private int age; Person(String name,int age) { this.name = name; this.age = age; } public int compareTo(Object obj) { //重寫compareTo方法,指定以年齡為排序方式 if(!(obj instanceof Person)) { throw new RuntimeException("not Person object"); } Person p = (Person)obj; if(this.age>p.age) return 1; /*if(this.age==p.age) //這是不對的,如果兩個人年齡相同救返回0,被認為是同一對象, * 按照Set的規則將不儲存後面這個元素 return 0;*/ if(this.age==p.age) { return this.name.compareTo(p.name); //年齡相同時按照姓名排序 } else return -1; } public String getName() { return name; } public int getAge() { return age; }}class Mycompare implements Comparator { //實現個比較子,實現介面是為了method8() public int compare(Object o1,Object o2) { //重寫compare方法 Person p1 = (Person)o1; Person p2 = (Person)o2; int a = p1.getName().compareTo(p2.getName()); //按姓名比較 if(a==0) { if(p1.getAge()>p2.getAge()) return 1; if(p1.getAge()==p2.getAge()) return 0; else return -1; } return a; }}
java集合架構---List/Set