javaSE - 007 - 集合

集合:

  • 集合中只能放對象的引用,對于原生數(shù)據(jù)類型,會自動拆包和打包

1.List接口的2個實(shí)現(xiàn)類

  • ArrayList 實(shí)現(xiàn)原理是一個數(shù)組,可以打開源碼看看,內(nèi)容就是所添加對象的一個引用
  • LinkedList 實(shí)現(xiàn)原理是一個雙向鏈表,添加對象是真正添加對象經(jīng)過包裝后(Entry對象),有前置引用和后置引用

2.Map

  • HashMap

3.Set(不可重復(fù),無順序的集合)

  • HashSet 是實(shí)現(xiàn)Set接口的一個主要類,里面是沒有順序的
  • TreeSet 也是Set接口的實(shí)現(xiàn)類,這個set是可以排序的

hash code 和 equals

純屬臆測。如下:
1.hash code能很快找到內(nèi)存物理地址,(好像有個hash表維護(hù)著)
2.不同的對象,可能有相同的hashcode,但是不同的hashcode一定是不同的2個對象
3.根據(jù)第二條,就能推斷出比較equals,首先得具有相同的hashcode(更直白的說:扎堆,人跟人站一起,大象跟大象站一起。然后用equals來比較適否完全相等...當(dāng)比較2個對象的時(shí)候,就可以用hashcode扎堆,然后用equals比較)
4.重寫equals須重寫hashCode的說法,如果只重寫equals(實(shí)實(shí)在在比較想等的),不重寫hashcode(相當(dāng)于過濾,大象只跟大象堆里的比較),很容易造成短路


public class test {
 public static void main(String[] args) {
  Set<A> s = new HashSet<A>();
  A a1= new A("liyang","26");
  A a2= new A("liyang","21");
  A a3= new A("liyang","22");
  A a4= new A("liyang","23");
  A a5= new A("liyang","26");
  
  s.add(a1);
  s.add(a2);
  s.add(a3);
  s.add(a4);
  s.add(a5);
  
  System.out.println(s);
  
      
 }

}
class A{
 String name ;
 String age;
 A(String name, String age){
  this.name = name;
  this.age = age;
 }
 @Override
 public int hashCode() {
  System.out.println(this.name + " hashcode " + this.age);
  return this .age.hashCode();
 }
 @Override
 public boolean equals(Object obj) {
  System.out.println(this.name + " equals " + this.age);
  A other = (A) obj;
  return other.name.equals(this.name);
 } 
}
輸出結(jié)果:
liyang hashcode 26
liyang hashcode 21
liyang hashcode 22
liyang hashcode 23
liyang hashcode 26
liyang equals 26
以下是  System.out.println(s);造成的
liyang hashcode 22
liyang hashcode 23
liyang hashcode 26
liyang hashcode 21
[javaSEtest.A@640, javaSEtest.A@641, javaSEtest.A@644, javaSEtest.A@63f]
總結(jié):本來equals只用了“l(fā)iyang”字符串做比較,且完全相同,但是我們用hashcode是有年齡產(chǎn)生的,造成了短路,根本不會走equals方法,除了年齡相同的

集合迭代

Set<String> s = **new** HashSet<String>();
  s.add("liyang");
  s.add("liyang1");
  s.add("liyang2");
  s.add("liyang3");
  s.add("liyang4");
  
  Iterator i = s.iterator();
  while (i.hasNext()){
   System.out.println(i.next());
  }
 }

Comparable接口


public class test {
 public static void main(String[] args) {
  Set<Person> s = new TreeSet<Person>();
  s.add(new Person(12));
  s.add(new Person(13));
  s.add(new Person(14));
  s.add(new Person(1));
  s.add(new Person(123));
  Iterator i = s.iterator();
  while (i.hasNext()) {
   System.out.println(i.next());
  }
 }
}
class Person implements Comparable {
 int score;
 Person(int score){
  this.score = score;
 }
 @Override
 public int compareTo(Object o) {
  Person p = (Person) o;
  if (this.score > p.score) {
   return 1;
  } else if (this.score == p.score) {
   return 0;
  } else {
   return -1;
  }
 }
 public String toString(){
  return ""+this.score;
 }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,745評論 18 399
  • 本文出自 Eddy Wiki ,轉(zhuǎn)載請注明出處:http://eddy.wiki/interview-java.h...
    eddy_wiki閱讀 1,224評論 0 16
  • java筆記第一天 == 和 equals ==比較的比較的是兩個變量的值是否相等,對于引用型變量表示的是兩個變量...
    jmychou閱讀 1,657評論 0 3
  • Java8張圖 11、字符串不變性 12、equals()方法、hashCode()方法的區(qū)別 13、...
    Miley_MOJIE閱讀 3,906評論 0 11
  • 今宵冷雪上新寒,殘照孤燈瘦影單。 聞得北風(fēng)簾外嘯,飛花點(diǎn)點(diǎn)潑天漫。 (平水韻上平十四寒) ???
    Odette伊菲閱讀 436評論 2 10

友情鏈接更多精彩內(nèi)容