Collection 接口 經常使用的子接口
List 接口 --》存放的元素有序且容許有重複的集合接口java
Set 接口 --》存放的元素不包括重複的集合接口算法
Set接口的實現類
HashSet 散列存放 -- 不保存元素的加入順序ide
TreeSet 有序存放this
LinkeHashSetcode
HashSet --> 調用hashCode() 用固定的算法算出它的存儲索引 而後把值放在一個
教散列表的相應位置(表元)中對象
若是對應的位置沒有其餘元素,直接存入排序
若是該位置有元素了,將新的值跟該位置的全部值進行比較
這時候 就調用 equals() 方法 看有沒有該值 沒有就存入 有就直接使用索引
******************************************************************
重點 *
*
對於要存放到HashSet集合中的對象 對應的類必定要重寫equals方法 *
和hashCode(Object obj) 方法 以實現對象相等規則 *
*
*
******************************************************************接口
public class SetDemo {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<String>();
list.add("0");
list.add("1");
list.add("2");
list.add("3");
list.add("4");
list.add("5");
list.add("5");
list.add("5");
System.out.println(list);
//set 不保存元素的加入順序
//set 集合是一個不能夠重複的集合
//問題:爲何能夠不重複?
//原理:它底層是一個Map -- key -value 對, key 跟 value 一一對應,其中
//key 是不能重複的
HashSet<String> set = new HashSet<String>();
set.add("1");
set.add("1");
set.add("1");
set.add("1");
set.add("1");
set.add("1");
set.add("1");
set.add("1");
System.out.println(set);
}
}開發
結果 [0, 1, 2, 3, 4, 5, 5, 5]
[1]
---------------------------------------------------------------
import java.util.HashSet;
//set 進行存儲的時候,
//一、若是是添加同一個對象(即把同一個對象添加屢次),那麼set只添加一次,無論hashcode
//equals 方法的結果是啥
//其結果是由它底層的map決定,由於key只能惟一
//二、若是添加的不是同個對象,那麼先調用 hashcode方法,獲取hashcode值 ,
//若是 hascode 同樣,那麼就調用equals方法,若是返回時true表示元素不能夠存入,
//反之則能夠
//得出的結果:
//實際開發中,若是須要將自定義的類添加入set中,同樣重寫hashcode 跟 equals
//怎麼去重寫 hascode 跟 equals
public class Test {
public static void main(String[] args) {
HashSet<Point> set = new HashSet<Point>();
Point point = new Point(1, 1);
Point point2 = new Point(1, 1);
Point point3 = new Point(1, 1);
Point point4 = new Point(1, 5);
set.add(point);
set.add(point2);
set.add(point3);
set.add(point4);
System.out.println(set);
}
}
------------
blic class Point{
public int x;
public int y;
private String a;
private String b;
public Point(int x, int y) {
super();
this.x = x;
this.y = y;
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
@Override
public String toString() {
return "Point [x=" + x + ", y=" + y + "]";
}
//重寫hashcode 的緣由:爲了提升效率
//一、獲取值的時候,是經過hascode進行判斷的,若是hashcode同樣,
//那麼必須比較內容,才能肯定具體獲取那個值
//二、添加的時候,若是hashcode值不同,就能夠不須要調用equals判斷是否一致
//屬性1的int形式+ C1*屬性2的int形式+ C2*屬性3的int形式+ …
//係數:通常是一個大一點的質數 31 c2
@Override
public int hashCode() {
//this.x + 31*this.y;
String xS = this.x + "";
String yS = this.y + "";
return xS.hashCode() + this.x + 31 * yS.hashCode();
}
@Override
public boolean equals(Object obj) {
if(obj == null){
return false;
}
if(this == obj){
return true;
}
if(obj instanceof Point){
Point point = (Point) obj;
if(point.x == this.x && point.y == this.y){
return true;
}else{
return false;
}
}
return false;
}
}
結果 [Point [x=1, y=1], Point [x=1, y=5]]
-------------------------------------------------------------------------
TreeSet -->一、能夠排序 二、不能夠重複
public class TreeSetDemo {
public static void main(String[] args) {
//set集合不能放重複的元素
//TreeSet
//添加進去的元素,無論添加順序怎樣子的,輸出結果,都是同樣的
//添加進去的元素,不能重複,若是重複,取其中一個 (由set的特性決定)
TreeSet<String> set = new TreeSet<String>();
set.add("0");
set.add("1");
set.add("7");
set.add("4");
set.add("3");
set.add("5");
set.add("6");
set.add("2");
System.out.println(set);
}
}
-------------------------------------------------------------------
Comparable 接口 —— 全部可排序的類均可以經過該接口實現
該接口惟一方法
public int compareTo(Object obj)
返回 0 表示 this == obj 輸出裏面的
返回正數 表示 this > obj 小 -- 大排
返回負數 表示 this <obj 大 -- 小排
public class Test {
public static void main(String[] args) {
TreeSet<Student> set = new TreeSet<Student>();
for(int i = 0; i < 5; i++){
set.add(new Student(i, "name_" + i));
}
for(Student student : set){
System.out.println(student);
}
}
}
---------
public class Student implements Comparable<Student>{
int id;
String name;
public Student(int id, String name) {
super();
this.id = id;
this.name = name;
}
@Override
public String toString() {
return "Student [id=" + id + ", name=" + name + "]";
}
@Override
public int compareTo(Student o) { //返回值 只能int 類型
//id小的排在前面
//this.id 加進去的元素
//o.id 裏面的元素
//return 0; return 1; return -1;
//return this.id; return o.id;
return this.id - o.id ;
}
}
結果 Student [id=4, name=name_4]
Student [id=3, name=name_3]
Student [id=2, name=name_2]
Student [id=1, name=name_1]
Student [id=0, name=name_0]
----------------------------------------------------------------------
Comparator 接口
由於使用Comparable 接口定義排序順序有侷限性(實現此接口的類
只能按compareTo() 定義的這一種方式排序)
Comparator 接口中的比較方法
public int compare(Object o1,Object o2)
返回 0 表示 o1 == o2 輸出裏面的
返回正數 表示 o1 > o2 小 -- 大排
返回負數 表示 o1 <o2 大 -- 小排
public class Student{
int id;
String name;
double score;
public Student(int id, String name, double score) {
super();
this.id = id;
this.name = name;
this.score = score;
}
@Override
public String toString() {
return "Student [id=" + id + ", name=" + name + ", score=" + score + "]";
}
}
-----------
import java.util.Comparator;
import java.util.TreeSet;
public class Test {
public static void main(String[] args) {
//Comparator 比較器
TreeSet<Student> set = new TreeSet<Student>(
new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
//o1 外面的
//o2 是裏面的
return o1.id - o2.id;
}
});
TreeSet<Student> set2 = new TreeSet<Student>(
new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
//o1 外面的
//o2 是裏面的
if(o1.score == o2.score){
return 0;
}
return o1.score > o2.score ? -1 : 1;
}
});
for(int i = 0; i < 5; i++){
set.add(new Student(i, "name_" + i, 40 * i));
}
for(Student student : set){
System.out.println(student);
}
System.out.println("---------------------------");
for(int i = 0; i < 5; i++){
set2.add(new Student(i, "name_" + i, 40 * i));
}
for(Student student : set2){
System.out.println(student);
}
}
}
結果
Student [id=0, name=name_0, score=0.0]
Student [id=1, name=name_1, score=40.0]
Student [id=2, name=name_2, score=80.0]
Student [id=3, name=name_3, score=120.0]
Student [id=4, name=name_4, score=160.0]
---------------------------
Student [id=4, name=name_4, score=160.0]
Student [id=3, name=name_3, score=120.0]
Student [id=2, name=name_2, score=80.0]
Student [id=1, name=name_1, score=40.0]
Student [id=0, name=name_0, score=0.0]
----------------------------------------------------------------------
LinkedHashSet
import java.util.HashSet;
import java.util.LinkedHashSet;
public class LinkedHSetDemo { public static void main(String[] args) { //元素最終打印的順序跟添加的順序無關,跟具體的hashcode值 HashSet<String> set = new HashSet<String>(); set.add("0"); set.add("5"); set.add("2"); set.add("3"); set.add("7"); set.add("4"); set.add("1"); set.add("6"); for(String string : set){ System.out.println(string); } System.out.println("-----------------"); //元素最終打印的順序跟添加的順序同樣 LinkedHashSet<String> linkedHashset = new LinkedHashSet<String>(); linkedHashset.add("0"); linkedHashset.add("7"); linkedHashset.add("6"); linkedHashset.add("2"); linkedHashset.add("3"); linkedHashset.add("5"); linkedHashset.add("1"); linkedHashset.add("4"); for(String string : linkedHashset){ System.out.println(string); } }}