java容易被人忽略的细节

版权声明:本文为博主原创文章,请随意转载。 https://blog.csdn.net/a_hui_tai_lang/article/details/83867615
  1. 同一个类的哈希值相等吗?
  2. 字符串的哈希值相等吗?
  3. 直接打印对象是个什么东西?
  4. equals和== , ===

1.同一个类的哈希值相等吗?

我们用代码来测试一下,我们先来创建一个Person对象,里面什么属性都没有

public class Person{}

然后我们用这个类来生成小明和小芳,看一下他们的哈希值

public class Test{
	public static void main(String[] args) {
		Person xiaoMing = new Person();
		Person xiaoFang = new Person();
		System.out.println("小明的哈希值为"+xiaoMing.hashCode()+",小芳的哈希值为:"+xiaoFang.hashCode());
		System.out.println();
	}
}

在这里插入图片描述

结论:同一个类的哈希值不一定相等,同一个对象的哈希值才相等

2.字符串的哈希值相等吗?

public static void main(String[] args) {
		String a=new String("a");
		String a2=new String("a");
		System.out.println("a的哈希值:"+a.hashCode()+",a2的哈希值:"+a2.hashCode());
	}

在这里插入图片描述
其实字符串的哈希值总是相等的,即便是通过new 的方式来进行创建
为什么呢?
三脸茫然

因为String是一个特殊的类,java的对String的hashCode的方法早就写好了。

3.直接打印对象是个什么东西?

public static void main(String[] args) {
		Person xiaoMing = new Person();
		Person xiaoFang = new Person();
		System.out.println("直接打印小明:"+xiaoMing+",直接打印小芳:"+xiaoFang);
		System.out.println();
	}

在这里插入图片描述
三脸茫然
打印类,其实是调用类的toString方法,如果没有重写toString方法,则默认为:类的全路径名@哈希值,但仔细一看好像也不对啊,哈希值还有数字,其实这个数字是16进制的数字,不信我们来验证一下。
三脸茫然
如果我们想打印对象时输出一句话,那么就得重新toString方法如下

public class Person{
	@Override
	public String toString() {
		return "我是一个人";
	}
}
public static void main(String[] args) {
		System.out.println(new Person());
	}

在这里插入图片描述

4.equals和== , ===

咱们还是拿Person过来做例子,给这个Person一个属性name

public class Person{
	private String name;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Person(String name){
		this.name=name;
	}
}

再来测试

public static void main(String[] args) {
		Person xiaoMing = new Person("小明");
		Person xiaoMing2 = new Person("小明");
		System.out.println(xiaoMing==xiaoMing2);
	}

结果是false,==比较的是他们在内存中的存放位置的地址值的,所以当然不相等了。那怎么样才能让他们按照名字相等给我返回true呢?
答案就是使用equals方法,我们需要在类里面重写这个equals方法。

public class Person{
	private String name;
	public String getName() {
		return name;
	}
	public Person(String name){
		this.name=name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public boolean equals(Person obj) {
		return obj.getName()==this.name;
	}
}
	public static void main(String[] args) {
		Person xiaoMing = new Person("小明");
		Person xiaoMing2 = new Person("小明");
		System.out.println(xiaoMing.equals(xiaoMing2));
	}

这个时候返回的就是true。
但是在equals方法里注意到我用了==符号,这里没问题吗?String类型还有特权吗?猜猜看

	public static void main(String[] args) {
		System.out.println("a"=="a");
		System.out.println(new String("a")=="a");
		System.out.println(new String("a")==new String("a"));
	}

在这里插入图片描述
惊不惊喜,意不意外
字符串是还真的比较特殊,因为java会在内容中为String类型的对像开辟一个空间,称为串池,字符串对象的创建之后会被放入到串池中,对于相同对象,池中只存储一份。串池会把"a" 对于这样的类型的声明方式(不是new出来的)串池把他们看做一个对象,所以池中只存储一分,故相等!
对于String只要用new关键字new出来的string,都是单独的一个对象。
而== 号他是用来比较对象的内存地址的,只要不是自己比自己,那肯定是false。

我的GitHub
QQ:2541692705
邮箱:[email protected]
我想去流浪,我想去读书,若有机会,江湖再见
扫一扫,领取红包,就当奖励你我付出的努力

猜你喜欢

转载自blog.csdn.net/a_hui_tai_lang/article/details/83867615