平時學了很多的java知識,但是發現自己經常忘記好多的知識點,我以我打算一邊學習一邊寫博客,其實整個寫博客的過程也是我自己鞏固學習,熟悉理解的過程,希望熱心的朋友多多給我指出錯誤啊。在此也感謝張龍老師的慷慨分享。
這次講解一下HashSet中add方法的使用以及許多注意的地方,首先大家知道數據結構分爲線性結構和非線性結構,前面講的ArrayList是線性結構的順序表示法,LinkedList是線性結構的鏈式表示法,今天講的hashset是非線性結構的。
首先:
HashSet hashSet = new HashSet();hashSet.add("zhangsan");
hashSet.add("lisi");
System.out.println(hashSet);
這樣打印出來的值並不一定是按順序出來的,因爲它並不像ArrayList那樣在內部是有序存放的;
另外,它存放之前會判斷之前HashSet裏面是否已經存在統一數值,如果有則不會繼續存。
看這樣的例子:
public class HashSetTest
{
public static void main(String[] args)
{
HashSet hashSet = new HashSet();
hashSet.add(new Persion("zhangran"));
hashSet.add(new Persion("zhangran"));
System.out.println(hashSet);
System.out.println("以上爲第一部分----------------");
Persion p1=new Persion("zhangran");
hashSet.add(p1);
hashSet.add(p1);
System.out.println(hashSet);
System.out.println("下面來的爲第三部分------------");
String s1 = new String("aa");
String s2 = new String("aa");
hashSet.add(s1);
hashSet.add(s2);
System.out.println(hashSet);
}
}
class Persion
{
String name;
Persion(String name)
{
this.name=name;
}
}
大家可以猜猜那些會真正的加入到hashset當中去
答案是:第一部分加進去兩個,第二部分跟第三部分加進去了一個。
講解:使用add方法是,首先會判斷對象是否是相同的如果是相同的一定不會繼續往裏面加,就像第二部分,如果對象是不同的,例如第一部分是new出來的兩個對象,它加了進去,第三部分是new出來的兩個對象,但是他就沒加進去。所以得再進一步區分。其實判斷對象是否相同並不是一眼就能看出來的,而是通過內部定義好了的equals方法來判斷的,而用equals方法又是根據對象的hashCode來判斷的。比如第一部分,Persion類是Object的子類繼承了Object的equals和hashcode方法,而在Object類當中它的不同的實例中的hashcode是不同的,這是Object中本來就定義好了的hashcode();所以繼承它的類也都有這樣的方法,所以第一部分通過equals之後Persion的兩個實例是不相同的,但是String類重寫了hashcode方法,使得String實例化出來的對象的hashcode()都是相同的,所以第三部分就得再進一步判斷它的具體的數值,結果它的具體數值是相同的所以插不進去。大家可以把上面的代碼自己運行一下。
下面咱們自己重寫一下,hashcode()以及equals方法,實現:無所謂是不是相同的對象,只根據對對象具體的數值是否相同來進行add的增加
public class HashSet2
{
public static void main(String[] args)
{
HashSet hashSet = new HashSet();
People p1 = new People("zhangsan");
People p2 = new People("lisi");
hashSet.add(p1);
hashSet.add(p2);
System.out.println(hashSet);
}
}
class People
{
String name;
People(String name)
{
this.name=name;
}
public int hashCode()
{
return this.name.hashCode();
}
public boolean equals(Object obj)
{
if(this==obj)
{
return true;
}
if(obj!=null&&obj instanceof People)
{
People p = (People)obj;
if(name.equals(p.name))
{
return true;
}
}
return false;
}
}
我都運行過的,大家也試試吧。。。