List、Set、Map的區別
List和Set繼承了Collection接口。
List以特定索引來存取元素,可以有重復元素。Set不能存放重復元素(用對象的equals()方法來區分元素是否重復)。Map保存鍵值對(key-value pair)映射,映射關系可以是一對一或多對一。Set和Map容器都有基於哈希存儲和排序樹的兩種實現版本,基於哈希存儲的版本理論存取時間復雜度為O(1),而基於排序樹版本的實現在插入或刪除元素時會按照元素或元素的鍵(key)構成排序樹從而達到排序和去重的效果。
TreeSet的排序實現:
1 public class Student implements Comparable<Student> { 2 3 private String name; // 姓名 4 private int age; // 年齡 5 6 public Student(String name, int age) { 7 this.name = name; 8 this.age = age; 9 } 10 11 @Override 12 public int compareTo(Student o) { 13 14 //升序排序 15 return this.age - o.age; 16 //降序排序 17 //return this.age - o.age; 18 } 19 20 @Override 21 public String toString() { 22 return "Student [name=" + name + ", age=" + age + "]"; 23 } 24 25 }
//測試類
public class Test1 { public static void main(String[] args) { Set<Student> set=new TreeSet<>(); set.add(new Student("a", 22)); set.add(new Student("b", 12)); set.add(new Student("c", 32)); set.add(new Student("d", 21)); for (Student s:set) { System.out.println(s); } /** * 輸出結果 Student [name=b, age=12] Student [name=d, age=21] Student [name=a, age=22] Student [name=c, age=32] */ } }
ArraList的排序:
1 public class Student2 { 2 3 private String name; // 姓名 4 private int age; // 年齡 5 6 public Student2(String name, int age) { 7 this.name = name; 8 this.age = age; 9 } 10 11 public String getName() { 12 return name; 13 } 14 15 public void setName(String name) { 16 this.name = name; 17 } 18 19 public int getAge() { 20 return age; 21 } 22 23 public void setAge(int age) { 24 this.age = age; 25 } 26 27 @Override 28 public String toString() { 29 return "Student2 [name=" + name + ", age=" + age + "]"; 30 } 31 32 }
//測試類
public class Test2 { public static void main(String[] args) { List<Student2> list=new ArrayList<>(); list.add(new Student2("a", 22)); list.add(new Student2("b", 12)); list.add(new Student2("c", 32)); list.add(new Student2("d", 21)); //通過sort方法的第二個參數傳入一個Comparator接口對象 相當於是傳入一個比較對象大小的算法到sort方法中 Collections.sort(list,new Comparator<Student2>() { @Override public int compare(Student2 arg0, Student2 arg1) { //降序排序 return arg1.getAge()-arg0.getAge(); } }); for(Student2 s:list){ System.out.println(s); } /** * 輸出結果 Student2 [name=c, age=32] Student2 [name=a, age=22] Student2 [name=d, age=21] Student2 [name=b, age=12] */ } }
