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的更多相关文章

  1. 关于Java中String类的hashCode方法

    首先来看一下String中hashCode方法的实现源码 public int hashCode() { int h = hash; if (h == 0 && value.lengt ...

  2. 关于String重写的hashcode的代码分析

    public int hashCode() { int h = hash; if (h == 0 && value.length > 0) { char val[] = valu ...

  3. 浅谈 String 的 hashCode() 方法

    Java 中 hash 值的含义 hash 值主要是用来在散列存储结构中确定对象的存储地址的,提高对象的查询效率,如HashMap.HashTable等: 如果两个对象相同,那么这两个对象的 hash ...

  4. String源码中hashCode算法

    针对java中String源码hashcode算法源码分析 /** The value is used for character storage. */ private final char val ...

  5. Java String引起的常量池、String类型传参、“==”、“equals”、“hashCode”问题 细节分析

    在学习javase的过程中,总是会遇到关于String的各种细节问题,而这些问题往往会出现在Java攻城狮面试中,今天想写一篇随笔,简单记录下我的一些想法.话不多说,直接进入正题. 1.String常 ...

  6. 深度解析对象的hashcode和equals的差异,以及String的内存分配方式

    Q:Java对象的hashcode是怎么得到的 A:Java对象的hashcode是native方法,不是通过Java实现的.hashcode的值是根据对象的内存地址得到的一串数字. Q:如果两个对象 ...

  7. 计算机程序的思维逻辑 (29) - 剖析String

    上节介绍了单个字符的封装类Character,本节介绍字符串类.字符串操作大概是计算机程序中最常见的操作了,Java中表示字符串的类是String,本节就来详细介绍String. 字符串的基本使用是比 ...

  8. Java中的equals和hashCode方法

    本文转载自:Java中的equals和hashCode方法详解 Java中的equals方法和hashCode方法是Object中的,所以每个对象都是有这两个方法的,有时候我们需要实现特定需求,可能要 ...

  9. HashCode

    如果一个类的对象要用做hashMap的key,那么一定要注意覆盖该类的equals和hashCode方法. equals()是基类Object的方法,用于判断对象是否有相同地址及是否为同一对象 pub ...

随机推荐

  1. Linux SSH 使用密钥登陆

    Linux SSH 使用密钥登陆 通常我们登录 Linux 服务器,我们需要使用密码进行登录,但是密码存在被暴力破解的可能. 可以将默认服务端口 22 改成其他不常用的端口. 可以设置非常复杂的密码. ...

  2. 树状数组 hdu2689 hdu2838

    题意:给定一个正整数n,和一个1-n的一个排列,每个数可以和旁边的两个数的任意一个交换,每交换一次总次数就要加一,问将这个排列转换成一个递增的排列需要多少次交换? 题意可以转换成求这个排列的逆序对数. ...

  3. PyCharm4.5 中文破解版破解步骤

    1.在下载之家下载PyCharm4.5中文版软件包,然后右击软件安装包选择解压到“pycharm4.5.3”. 2.在解压文件夹中找到pycharm-professional-4.5.3,右击打开. ...

  4. 漫谈2014年人机交互(CHI)大会

    编者按:2014年度以人机交互为主题的顶级会议ACM SIGCHI已经落下帷幕.微软研究院在此次会议的入选论文总数仅次于卡耐基•梅隆大学,位列第二.此次会议中,有哪些创新想法或技术让人眼前一亮?听微软 ...

  5. WEB 安全 - xss 初探

    零.参考资料 网络攻击-XSS攻击详解: 前端安全之XSS攻击: 一.概念 跨站脚本攻击Cross-site scripting (XSS)是一种安全漏洞,攻击者可以利用这种漏洞在网站上注入恶意的客户 ...

  6. CentOS7下MySQL5.7的安装-RPM方式

    Installing MySQL on Linux Using RPM Packages 下载安装包 mysql下载地址:https://dev.mysql.com/downloads/mysql/ ...

  7. VBA 读取加密的Excel文件(VBA 加密Excel)

    实验成功的: ExcelApp.Workbooks.Open(文件路径,,,'密码') 这里很坑,搜了别人的博客,下面这个方法试了N次,都没用... ExcelApp.Workbooks.Open(文 ...

  8. JDBC连接到数据库查询打印数据

    通过一天的视频学习,认识了jdbc的连接原理前来小结: 游标读取数据库表的行一次读取一个,getXxx()方法读取表的列一个数据 next()方法可以让游标下移 可以把数据库的表看做是一个类,每条记录 ...

  9. TCP大文件发送案例以及UDP介绍

    基于TCP的大文件发送 #server服务端 import struct import json import os import socket server = socket.socket() # ...

  10. Python 字符编码判断

    题记 在获取中文字符的时候,如果出现乱码的情况,我们需要了解当前的字符串的编码形式.使用下面两种方法可以判断字符串的编码形式. 法一: isinstance(s, str) 用来判断是否为一般字符串 ...