从String到==和hashcode
public static void main(String[] args) {
String s1 = "ni";
String s2 = "hao";
String s3 = "nihao";
String s4 = "ni" + "hao";
String s5 = s1 + s2;
System.out.println(s3 == s4);
System.out.println(s3 == s5);
System.out.println(s3.equals(s5));
System.out.println(s3.hashCode() == s5.hashCode());
}
执行结果
true
false
true
true
第一个输出结果大伙应该都知道,String在常量池里找到"nihao"就直接返回地址引用
第二个是因为等号后面有变量(假设是String s5 = s1 + "hao"结果也是一样),他都必须new一个新的String对象出来,就不回去常量池里找了
第三个大伙应该也知道String的equals方法被重写了,比较的是值一不一样而不是地址值
第四个就是典型地验证了 == 不相等的哈希值可能相等,估摸着就是算着俩对象一样哈希值一样拉链法给s5扔s3那颗红黑树里了(更可能是链表,就这么小的世界不会那么巧8 ^ ^_ )
根据第四个延申会不会两个对象长一样哈希值就一样呢,立刻实验
public class WhatEver implements Cloneable{
public static void main(String[] args) {
WhatEver o1 = new WhatEver();
WhatEver o2 = null;
try {
o2 = (WhatEver) o1.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
System.out.println(o1.hashCode() == o2.hashCode());
}
}
执行结果
false
clone出来基本保证俩对象一样,结果却是false,俺也不知道咋回事了,懂的评论一下,去研究hashcode了
看了一下深入理解JVM,发现一个更有趣的String是否相等问题
String str1 = new StringBuilder("Hello").append("World").toString();
System.out.println(str1 == str1.intern());
String str2 = new StringBuilder("ja").append("va").toString();
System.out.println(str2 == str2.intern());
在JDK6中结果为false false ,JDK7中结果为 true false
JDK6中字符常量池在永久代,StringBuilder创建的"HelloWorld"实例在堆中,并复制一份扔到字符常量池中,两个引用指向不同地方所以不等;JDK7中字符常量池移回堆中,用StringBuilder创建'HelloWorld"没有了复制的步骤,常量池里扔的是StringBuilder创建对象的引用,指向的是同一个,为true;第二个为false是因为jvm初始化的时候就创建过"java"这个字符串到常量池中了,所以和StringBuilder新创建对象不一样,啥时候创建的可以看一下R大的知乎回答。
一言以蔽之,JDK7之后字符串常量池移回堆了,StringBuilder等创建新字符串对象时,如果这个字符串在常量池没有就往常量池扔这个新对象的引用,而不是JDK6中再复制一份字符串到常量池中
从String到==和hashcode的更多相关文章
- 关于Java中String类的hashCode方法
首先来看一下String中hashCode方法的实现源码 public int hashCode() { int h = hash; if (h == 0 && value.lengt ...
- 关于String重写的hashcode的代码分析
public int hashCode() { int h = hash; if (h == 0 && value.length > 0) { char val[] = valu ...
- 浅谈 String 的 hashCode() 方法
Java 中 hash 值的含义 hash 值主要是用来在散列存储结构中确定对象的存储地址的,提高对象的查询效率,如HashMap.HashTable等: 如果两个对象相同,那么这两个对象的 hash ...
- String源码中hashCode算法
针对java中String源码hashcode算法源码分析 /** The value is used for character storage. */ private final char val ...
- Java String引起的常量池、String类型传参、“==”、“equals”、“hashCode”问题 细节分析
在学习javase的过程中,总是会遇到关于String的各种细节问题,而这些问题往往会出现在Java攻城狮面试中,今天想写一篇随笔,简单记录下我的一些想法.话不多说,直接进入正题. 1.String常 ...
- 深度解析对象的hashcode和equals的差异,以及String的内存分配方式
Q:Java对象的hashcode是怎么得到的 A:Java对象的hashcode是native方法,不是通过Java实现的.hashcode的值是根据对象的内存地址得到的一串数字. Q:如果两个对象 ...
- 计算机程序的思维逻辑 (29) - 剖析String
上节介绍了单个字符的封装类Character,本节介绍字符串类.字符串操作大概是计算机程序中最常见的操作了,Java中表示字符串的类是String,本节就来详细介绍String. 字符串的基本使用是比 ...
- Java中的equals和hashCode方法
本文转载自:Java中的equals和hashCode方法详解 Java中的equals方法和hashCode方法是Object中的,所以每个对象都是有这两个方法的,有时候我们需要实现特定需求,可能要 ...
- HashCode
如果一个类的对象要用做hashMap的key,那么一定要注意覆盖该类的equals和hashCode方法. equals()是基类Object的方法,用于判断对象是否有相同地址及是否为同一对象 pub ...
随机推荐
- 70-persistent-net.rules无法自动生成,解决方法
无法自动生成70-persistent-net.rules文件的原因: 在更换linux内核前修改ifcfg-eth0文件,更换内核,使用dhclient无法动态分配IP,删掉70-persisten ...
- spring-mvc基于xml的配置
配置web.xml <!--配置spring-MVC拦截--> <servlet> <servlet-name>DispatcherServlet</serv ...
- JavaScript--DOM,BOM
前戏 到目前为止,我们已经学过了JavaScript的一些简单的语法.但是这些简单的语法,并没有和浏览器有任何交互. 也就是我们还不能制作一些我们经常看到的网页的一些交互,我们需要继续学习BOM和DO ...
- 吴裕雄--天生自然 R语言开发学习:R语言的简单介绍和使用
假设我们正在研究生理发育问 题,并收集了10名婴儿在出生后一年内的月龄和体重数据(见表1-).我们感兴趣的是体重的分 布及体重和月龄的关系. 可以使用函数c()以向量的形式输入月龄和体重数据,此函 数 ...
- django操作非ORM创建的表
问题:django的ORM怎么连接已存在的表,然后进行增删查改操作? 工作中会遇见很多二次开发的时候,表都是已经创建好的,用django的ORM进行二次开发,怎么操作数据库中的表呢? 下面介绍 ...
- python语法基础-函数-内置函数和匿名函数-长期维护
################## 内置函数 ####################### """ 一共是 68个内置函数: 反射相关的内置函 ...
- Linux上部署Tomcat+Nginx负载均衡
前提:配置好了JDK. 我这里是vm上的linux虚拟机,可能不适用于所有情况. 一.Linux上配置Tomcat 1.下载地址:https://tomcat.apache.org/download- ...
- javaSE复习之——线程
线程其实就是程序执行的一条路径,一个进程中可以包含多条线程,多线程并发执行可以提高程序效率,可以同使完成多项任务 多线程的应用场景 迅雷多线程一起下载 服务器同时处理多个客户请求 多线程原理(单核CP ...
- centos7添加阿里云的epel源
有些包在别的yum源找不到,在阿里云的yum源里成功找到,这里记录在不影响base源的情况快速添加epel源的添加方法 wget https://mirrors.aliyun.com/epel/7Se ...
- 三星HTC价格跳水 安卓旗舰会否崩塌?
安卓旗舰会否崩塌?" title="三星HTC价格跳水 安卓旗舰会否崩塌?"> 官方降价,对于国产手机来说似乎是家常便饭.小米.魅族等,总会时隔几个月就将自家旗舰机 ...