平时学了很多的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;
}
}
我都运行过的,大家也试试吧。。。