一、集合框架
1.1 為什么要使用集合框架?
當我們需要保持一組一樣(類型相同)的元素的時候,我們應該使用一個容器來保存,數組就是這樣一個容器。
那么,數組的缺點是什么呢?
數組一旦定義,長度將不能再變化。
然而在我們的開發實踐中,經常需要保存一些變長的數據集合,於是,我們需要一些能夠動態增長長度的容器來保存我們的數據。
而我們需要對數據的保存的邏輯可能各種各樣,於是就有了各種各樣的數據結構。我們將數據結構在Java中實現,於是就有了我們的集合框架。
1.2 集合框架的內容
注意: Collction是接口,而Collections是具體類,里面封裝着大量操作方法。(紫色部分是接口,黃色部分是具體類)
1.3 注意
- foreach遍歷只能用於colletion接口下的(即list和set)和數組,map是不能用foreach遍歷的。
- 如果是無序的集合比如set接口下的類,因為無序,所以就不能根據索引號來獲取值,比如有序List.get(0)來獲取存在List里的第一個值。
- 如果我們往集合里(List或set等)添加的是自定義對象,比如我們往TreeSet里添加一個學生類的引用,這個學生類有name、age兩個屬性,如果我們想對name進行排序 比如姓王的排在前面,那么我們需要設置比較器Comparable或compartor,否則會報錯,因為如果沒有設置比較器,那么會對引用進行比較。
1.4 ArrayList類
- 對於ArrayList遍歷的幾種方法:
//利用size()和get()方法對arraylist進行遍歷 List<String> li=new ArrayList<String>(); li.add("abc"); li.add("efg"); li.add("hij"); li.add("klm"); for(int i=0;i<li.size();i++) { System.out.println(li.get(i)); } //用foreach遍歷 for(String str:li) { System.out.println(str); }
//用迭代器遍歷Iterator Iterator<String> i=li.iterator(); while(i.hasNext()) { //執行一次next()就會指向下一個元素,所以這里輸出的是efg的下一個元素 if((i.next()).equals("efg")) { System.out.println(i.next()); continue; } else { System.out.println("不滿足條件"); continue; } }
- 注意: 如果要對arraylist進行元素刪除操作即(Iterator.remove()),那么只能用迭代器來進行,其他方法不行。
1.5 HashSet
- set集合是唯一無序的,也就是說里面的對象不能相同,存儲位置也是無序的,其實說是無序只是相對於添加順序來說,在內存中的存儲位置是按照hash算法來存放的,只是這個算法很難算得出存放的位置。不能使用Comparator比較器。
public static void main(String[] args) { Set<String> se=new HashSet<String>(); se.add("111"); se.add("aaa"); se.add("1sr"); //Iterator迭代 Iterator<String> i=se.iterator(); while(i.hasNext()) { System.out.println(i.next()); }}
1.6 TreeSet
- TreeSet可以給Set集合中的元素進行指定方式的排序(即可以使用comparator和comparable)。
public static void main(String[] args) { Set<String> se=new TreeSet<String>(); se.add("222"); se.add("bbb"); se.add("aaa"); se.add("111"); System.out.println(se); }
- 如果往TreeSet添加的是基本數據類型或者String等,那么TreeSet會自動給這些值進行排序。如果添加的是自定義類,那么必須對TreeSet設置排序規則.即我們需要在這個自定義類里繼承比較器接口Comparable和Compartor,然后覆蓋里面的方法;
Student.java
public class Student { private String name; private int age; //setget方法、構造方法省略 }
TreeSetApp.java
public static void main(String[] args) { Set<Student> se=new TreeSet<Student>(); Student s=new Student("張三",15); se.add(s); System.out.println(se);}
- 注意: ArrayList和HashSet和TreeSet中,只有TreeSet和ArrayList的可以實現compartor比較器,TreeSet可以通過構造方法指定compartor比較器,而ArrayList可以通過Colletions.sort(List list, Compartor c)來指定使用compartor比較器。
1.7 HashMap
- 它是基於哈希表的 Map 接口的實現,以key-value的形式存在。在HashMap中,key-value總是會當做一個整體來處理,系統會根據hash算法來來計算key-value的存儲位置,我們總是可以通過key快速地存、取value。
public static void main(String[] args) { Map<String,String> m=new HashMap<String,String>(); m.put("CN", "中國"); m.put("JP", "日本"); for(String str:m.keySet()){ System.out.println(str+"="+m.get(str)); } }
解析: 對HashMap進行遍歷,不能直接用for(String str:m) 來遍歷 因為Map接口沒有迭代器Iterator ,只能調用hashmap的里的keySet()方法,這個方法返回一個Set集合,而Colletion接口下的類有迭代器,可以使用foreach()。
二、比較器
- 比較器: comparable 和comparator
student.java
public class Student implements Comparable<Student>{ private String name; private int age; //省略getset以及構造方法 public int compareTo(Student o) { if(this.age>o.getAge()){ return 1; } else if(this.age<o.getAge()){ return -1; } else{ return 0; } }}
ListApp.java
public static void main(String[] args) { List<Student> li=new ArrayList<Student>(); Student s1=new Student("張三",15); Student s2=new Student("李四",50); Student s3=new Student("王五",25); li.add(s1); li.add(s2); li.add(s3); for(Student s:li){ System.out.println(s.getAge()); } }
結果:
解析:由結果可知,comparable的比較方法是第一個s1被添加進li中,當s2被添加到li后,把s1的age跟s2的age比,可知s1<s2,所以返回-1,排列結果為:15,50 。 當s3被添加到li后,把s1的age跟s3的age比,可知s1<s3,所以返回-1,排列結果為: 15,50,25.
student.java
public class Student { private String name; private int age; //省略getset以及包含全屬性的構造方法 }
ListApp.java
public static void main(String[] args) { List<Student> li=new ArrayList<Student>(); Student s1=new Student("張三",15); Student s2=new Student("李四",50); Student s3=new Student("王五",25); li.add(s1); li.add(s2); li.add(s3); Collections.sort(li,new MyComparator()); for(Student s:li){ System.out.println(s.getAge()); } }
MyComparator.java
public class MyComparator implements Comparator<Student>{ @Override public int compare(Student o1, Student o2) { if(o1.getAge()>o2.getAge()) { return 1; } else if(o1.getAge()==o2.getAge()) { return 0; } else return -1; } }
實現升序方法。