Java 深入学习(6) —— 打印 String 对象引用时显示的不是 hashCode 而是 String 对象本身的原因
2017-11-29 16:46
357 查看
问题概述
正常打印一个 Object 对象引用的时候,会默认打印 Object.toString() 方法返回的getClass().getName() + "@" + Integer.toHexString(hashCode())
即打印出 对象所属类的名字与对象的 hashCode
StringCannotChange stringCannotChange = new StringCannotChange(); System.out.print(stringCannotChange);
com.practice.string.StringCannotChange@4554617c
但是当打印 String对象的引用时,则会显示字符串本身。
String str = "test string"; System.out.println(str);
test string
原因是 String 重写了 toString() 方法
Object.java 源码String.java 源码
测试代码
package com.practice.string;
public class StringCannotChange {
public static void main(String[] args) {
// s 是对 常量存储区 中 "s" 的引用
String s = "s";
// s2 是对 常量存储区 中 "s" 的引用
String s2 = "s";
// s3(存储于内存的栈区,指向了新对象的首地址) 是对 一个新对象(存储于内存的堆区)的 引用
String s3 = new String("s");
// s4 也是一个对新对象的引用,但和 s3 分别指向不同的对象
String s4 = new String("s");
System.out.println(s == s2); // true
System.out.println(s3 == s2); // false
System.out.println(s3 == s4); // false
System.out.println("------------------------------");
/*
* A String's hashCode() method is calculated based on the chars it contains.
* If two String objects contain the same chars with the same case and in the same order,
* then they will have the same hashCode().
* */
System.out.println(StringCannotChange.class.getName() + "@" + Integer.toHexString(s.hashCode()));
System.out.println(StringCannotChange.class.getName() + "@" + Integer.toHexString(s2.hashCode()));
System.out.println(StringCannotChange.class.getName() + "@" + Integer.toHexString(s3.hashCode()));
System.out.println(StringCannotChange.class.getName() + "@" + Integer.toHexString(s4.hashCode()));
System.out.println("------------------------------");
System.out.println(s.equals(s2)); // true
System.out.println(s.equals(s3)); // true
System.out.println(s.equals(s4)); // true
System.out.println("------------------------------");
StringCannotChange stringCannotChange = new StringCannotChange(); System.out.print(stringCannotChange);
System.out.println("------------------------------");
String str = "test string"; System.out.println(str);
System.out.println("------------------------------");
}
}
true false false ------------------------------ com.practice.string.StringCannotChange@73 com.practice.string.StringCannotChange@73 com.practice.string.StringCannotChange@73 com.practice.string.StringCannotChange@73 ------------------------------ true true true ------------------------------ com.practice.string.StringCannotChange@4554617c------------------------------ test string ------------------------------ Process finished with exit code 0
Reference
https://stackoverflow.com/questions/21964606/java-string-pool-storage-doubts
相关文章推荐
- java传递是引用的拷贝,既不是引用本身,更不是对象
- Java 深入学习(7) —— Object.hashCode()的返回值与对象内存地址的关系
- java传递是引用的拷贝,既不是引用本身,更不是对象
- java传递是引用的拷贝,既不是引用本身,更不是对象
- java传递是引用的拷贝,既不是引用本身,更不是对象
- 原!! java直接打印一个对象时,并不是直接调用该类的toString方法 ,而是会先判断是否为null,非null才会调用toString方法
- JAVA随笔篇二(深入分析JAVA简单类型、String和对象的值传递和引用传递)
- 深入研究java对String字符串对象的创建以及管理
- 深入研究java对String字符串对象的创建以及管理
- ajax打印对象时,转换由java对象转为Json格式的String时遇到的Hibernate问题
- 深入研究java对String字符串对象的创建以及管理
- 【转】深入研究java对String字符串对象的创建以及管理
- 深入了解java中的String对象
- 深入研究java对String字符串对象的创建以及管理
- java语言学习连载(四)--深入理解面象对象
- Java深入了解String对象
- JNI学习笔记4——本地代码创建Java对象(包括javaString)
- 深入研究java对String字符串对象的创建以及管理【转帖】
- 深入研究java对String字符串对象的创建以及管理
- (原创)深入研究java对String字符串对象的创建以及管理