內容:j集合頂層共性的方法,集合下的兩個分支List和Set集合下的小分支——LinkedList、ArrayList、TreeSet、HashSet 在util包###頂層的共性介面collection方法 兩種集合List:有序(存入的順序和取出的順序一致)。有索引,允許重覆元素Set:不允許重 ...
內容:j集合頂層共性的方法,集合下的兩個分支List和Set集合下的小分支——LinkedList、ArrayList、TreeSet、HashSet
在util包
###頂層的共性介面collection方法
//添加 Collection<String> c1 = new ArrayList<String>(); Collection<String> c2 = new ArrayList<String>(); c1.add("x"); c1.add("i"); c1.add("u"); c2.add("g"); c2.add("ha"); c2.add("ai"); //添加所有 c1.addAll(c2); //System.out.println(c1); //刪除相同的元素 c1.removeAll(c2); //System.out.println(c1); //刪除不同的元素 c1.retainAll(c2); //獲取長度 c1.size() //判斷是否包含元素 c1.contains("xia") //調用的是對象的equals方法 //將集合轉成數組 .toArray() //取出元素 Iterator<String> it = c1.iterator(); while(it.hasNext()){ String x = it.next(); System.out.println(x); } 開發中用的是for for (Iterator<String> it = c1.iterator(); it.hasNext();) { String s = (String) it.next(); System.out.println(s); }
兩種集合
List:有序(存入的順序和取出的順序一致)。有索引,允許重覆元素
Set:不允許重覆元素
###List特有方法
import java.util.List; List<String> list = new ArrayList<String>(); list.add("abc1"); list.add("abc2"); list.add("abc3"); //索引插入元素 list.add(1,"haha"); //索引刪除元素 list.remove(1); //獲取 System.out.println(list.get(1)); System.out.println(list.indexOf("abc3")); //修改 list.set(1, "kk"); //索引取出 for (int i = 0; i < list.size(); i++) { System.out.println(list.get(i)); } //列表迭代器,解決迭代器過程中的增刪改查 for (ListIterator<String> it = list.listIterator(); it.hasNext();) { Object obj = it.next(); if(obj.equals("abc2")){ it.add("ai q"); } }
list集合具體子類
Vector:數據結構是數組,可變長度的(不斷new新數據並將元數組複製到新數組)。線程同步的。增刪和查詢都慢
ArrayList:也是數組結構,長度可變。線程不同步,代替了Vector。增刪速度不快,查詢速度快
LinkedList:鏈表結構,線程不同步。增刪速度快,查詢速度慢
存儲自定義對象
對象的set、get方法快速創建,Alt+Shift+S
##ArrayList
存儲個人的對象 ArrayList<Person_arraylist> al = new ArrayList<Person_arraylist>(); Person_arraylist p1 = new Person_arraylist("ia", 21); Person_arraylist p2 = new Person_arraylist("u",20); al.add(p1); al.add(p2); al.add(new Person_arraylist("ai", 7)); for (Iterator it = al.iterator(); it.hasNext();) { Person_arraylist p = (Person_arraylist) it.next(); //需要向下轉型,才能進去的時候是Object類 System.out.println(p.getName()); } #去除重覆對象練習 Person_arraylist類中的equals方法 public boolean equals(Object obj){ if(this == obj){ return true; } if(!(obj instanceof Person_arraylist)){ throw new ClassCastException("類型錯誤"); } Person_arraylist p = (Person_arraylist)obj; return this.getName().equals(p.getName()) && this.getAge() == p.getAge(); public static void single_list(ArrayList<Person_arraylist> al){ ArrayList<Person_arraylist> tmp = new ArrayList<Person_arraylist>(); for (Iterator it = al.iterator(); it.hasNext();) { Person_arraylist p = (Person_arraylist) it.next(); if(!tmp.contains(p)){ //通過contains調用Person_arraylist的比較方法,上面 tmp.add(p); } } al.clear(); al.addAll(tmp); }
##LinkedList
一般都是頭尾操作 LinkedList<String> link = new LinkedList<String>(); link.addFirst("a"); link.addFirst("ai"); link.addFirst("iu"); //獲取元素,只是獲取沒有刪除 System.out.println(link.getFirst()); //獲取並且刪除元素 System.out.println(link.removeFirst()); 判斷是否為空:isEmpty()
###Set集合:不允許重覆元素
和collection方法相同,只有一個迭代器
HashSet:哈希(散列)表結構
TreeSet:
##HashSet
Set<String> set = new HashSet<String>(); set.add("ia"); set.add("u"); set.add("ai"); set.add("pingpang"); set.add("xingfu"); //只能通過迭代器取出 for (Iterator it = set.iterator(); it.hasNext();) { String str = (String) it.next(); System.out.println(str); } HashSet預設調用的是Object裡面的hashcode()方法,一般保存對象都需要對象覆蓋hashcode和equals方法 hashcode()方法,根據自身特點定義hash值,返回一個整數值,當返回的整數值相同就會調用equals方法進行比較。 equals()方法是為瞭解決hash衝突 要實現有序的話,使用LinkedHashSet對象
##TreeSet
1)第一種要求保存的對象要實現Comparable介面,實現compareTo方法。 public int compareTo(Object o) { Student stu = (Student)o; if(this.age > stu.age){ return 1; } if(this.age < stu.age){ return -1; } return 0; } //簡單的compareTo方法實現,或者直接return this.age-stu.age public int compareTo(Object o) { Student stu = (Student)o; return this.name.compareTo(stu.name); } TreeSet是根據compareTo方法返回的值來保證唯一性,所以單單使用一個沒有辦法保證不會出錯,萬一兩個年齡相同姓名不同,或者姓名相同年林不同的,這樣子會漏掉要保存的。 這裡解決辦法可以把return 0改成 return this.name.compareTo(stu.name)
2)第二種要求建立指定排序方式的 在創建集合對象的時候,參數使用實現comparator介面的一個比較對象 public class Comparator_by_name implements Comparator<Student> { public int compare(Student o1, Student o2) { int tmp = o1.getName().compareTo(o2.getName()); return tmp==0?o1.getAge()-o2.getAge():tmp; } }
ArrayList:數組結構。數組查詢快,list,可以重覆
LinkedList:鏈表結構。增刪快,***First ***Last ***為add get remove
HashSet:哈希表,查詢速度更快,不保證有序。
LinkedHashSet:鏈表+哈希表。可以實現有序
TreeSet:二叉樹,可以排序。兩種比較方式:一種是自然排序Comparable,一種是比較器Comparator
##foreach語句:for迴圈增強型
for(元素類型 變數:collection容器or數組){}
Collection<String> coll=new ArrayList<String>(); coll.add("a"); coll.add("ai"); coll.add("q"); coll.add("xa"); for(String s:coll){ System.out.println(s); }
###############################
//作業:List集合中存儲的重覆字元串元素,按照長度進行排序。
import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; public class Test2 { public static void main(String[] args) { List<String> list = new ArrayList<String>(); list.add("nba"); list.add("abcde"); list.add("nba"); list.add("cctv"); list.add("zz"); list.add("cctv"); list.add("itcast"); Collections.sort(list,new Comparator<String>() { public int compare(String o1, String o2) { int temp = o1.length() - o2.length(); return temp==0?o1.compareTo(o2):temp; } }); for(String str : list){ System.out.println(str); } } }View Code
#############################
//在一個已排序的List集合中插入一個字元串,繼續保證這個集合原有排序,問如何獲取這個位置。
import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; public class Test3 { public static void main(String[] args) { List<String> list = new ArrayList<String>(); list.add("nba"); list.add("abcde"); list.add("nba"); list.add("cctv"); list.add("zz"); list.add("cctv"); list.add("itcast"); Collections.sort(list); String key = "haha"; //找一個元素在集合中出現的位置。 int index = Collections.binarySearch(list, key); System.out.println("index="+index); if(index<0){ index = -(index+1); } System.out.println("index="+index); System.out.println(list); list.add(index, key); System.out.println(list); } }View Code