public class StringTest {

    private static String getA() {return "a";}

    public static void main(String[] args) {
String s1 = "ab";
String s2 = "a"+"b";
String a = "a";
String s3 = a+"b";
//s1.equals(s2);
//Object
//HashMap
/*HashMap<String, Integer> map = new HashMap<String, Integer>();
map.put("语文", 1);
map.put("数学", 2);
map.put("英语", 3);
map.put("历史", 4);
map.put("政治", 5);
map.put("地理", 6);
map.put("生物", 7);
map.put("化学", 8);
for(Entry<String, Integer> entry : map.entrySet()) {
System.out.println(entry.getKey() + ": " + entry.getValue());
}
更多了解:https://yikun.github.io/2015/04/01/Java-HashMap%E5%B7%A5%E4%BD%9C%E5%8E%9F%E7%90%86%E5%8F%8A%E5%AE%9E%E7%8E%B0/
*/
final String aa = "a";
String s4 = aa +"b";
String s5 = getA() +"b"; String s6 = new String("ab"); System.out.println(s1==s2);//true
System.out.println(s1==s3);//false
System.out.println(s1==s4);//true
System.out.println(s1==s5);//false
System.out.println(s1==s6);//false
System.out.println(s1==s6.intern());//true
System.out.println(s2.intern()==s6.intern());//true
System.out.println(s1.hashCode());//
System.out.println(s2.hashCode());//
System.out.println(s3.hashCode());//
System.out.println(System.identityHashCode(s1));//
System.out.println(System.identityHashCode(s2));//
System.out.println(System.identityHashCode(s3));// /**
* 问:
* 1、为什么是true? 这里涉及到基础知识点有哪些?
* 答:
* 1、
* a、首先这里要明白"=="是干什么的?
* "=="是匹配内存单元上的内容是否相等,其实就是一个数字,因为计算机内存中也只有数字0和1;
* 原始类型"byte,boolean,short,char,int,float,double,long",就直接比较它们的值;
* 引用类型"Reference",就比较引用的值,通常指对象的逻辑地址,也就是比较两个引用是否是同一个对象;
* 空值"null",JVM也会赋予给它一个特定的值;
* b、equals()方法?
* 首先是在Object类中定义的,equals()方法只所以存在Object类,是希望子类去重写该方法,因为业务场景不一样,所以比较的
* 标准就不一样。String类就重写了该方法。
*

          

         *       重写equals()方法,一般会重写hashCode()方法?
* 首先明白HashCode是什么?
* hashCode值是hashCode()方法提供了对象的hashCode值,它的返回值默认与System.identityHashCode(object)相同
* hashCode具体是对象头部的一部分二进制组成的数字,有标识对象的作用,但是不等价于地址。
* 为什么存在hashCode? 因为对象要用于算法中,而算法建立在数字基础上。
*    
         *       这里Object.hashCode()与System.identityHashCode(Object)值为什么不一致?
* 因为System.identityHashCode()方法是java根据对象在内存中的地址计算出来的一个数值,不同的地址计算出来数值不一样
* 所以s2和s3不是同一个对象,所以计算不是同一个值
* 又因为String重写了hashCode()方法,所以值也不一样。
*
         *       Hashmap,HashSet等类似集合中,如果用某个对象作为key,,也是要基于这个对象实现hash的写入和查找。
* Hash算法可以将对象相对离散开,这样就可以在查找数据的时候根据这个key快速地缩小数据的范围。
* 这个时候key就如同数组里面的key,而value就是链表,hashcode值不能说是唯一的,所以在Hash算法中定位
* 到具体链表之后,需要进一步循环链表,然后通过equals()来对比Key的值是否一样的,所以在这个时候,hashCode()
* 与equals()似乎成了一对儿,换句话说,HashCode是为了算法快速定位数据而存在,equals()是为了对比真实值
* 存在的。
* 需要注意的是,我们可以重写HashCode()方法,但最好是返回值最好是能将对象相对离散的数据,如果始终是返回一个值
* 那就是一个key,链表将会很长,查询链表还慢。
* 更多了解HashMap底层。
*
         *     c、编译时优化方案
* s1==s3//false 因为a不是常量,而是局部变量,并且可以通过字节码增强技术改变,所以不会编译时优化
* s1==s4//true 因为c是final修饰不可变,编译可以优化
* s1==s5//false 来源方法,编译器不知道方法做了什么,即是返回是常量,也是对引用实现的拷贝,拷贝并不是final
*
* 因为s1,s2是引用同一个对象,对象比较用"=="所以为true.
* 2、
* s1==s6// false 两个不同的对象 ,new
* intern() 保存在方法区的常量池中 ,效率不高
*/ } }

面试——String的比较总结的更多相关文章

  1. Java面试——String、StringBuider以及StringBuffer的区别和使用场景

    1.  String.StringBuider.StringBuffer的区别  String是不可变的对象,因此在每次对String类型进行改变的时候,都会生成一个新的String对象,然后将指针指 ...

  2. C++面试中string类的一种正确简明的写法

    本文首发于酷壳网 http://coolshell.cn/articles/10478.html 先说说程序员(应届生)面试的一般过程,一轮面试(面对一到两个面试官)一般是四.五十分钟,面试官会问两三 ...

  3. [转] 请别再拿“String s = new String("xyz");创建了多少个String实例”来面试了吧

    这帖是用来回复高级语言虚拟机圈子里的一个问题,一道Java笔试题的. 本来因为见得太多已经吐槽无力,但这次实在忍不住了就又爆发了一把.写得太长干脆单独开了一帖. 顺带广告:对JVM感兴趣的同学们同志们 ...

  4. leetcode面试准备:Reverse Words in a String

    leetcode面试准备:Reverse Words in a String 1 题目 Given an input string, reverse the string word by word. ...

  5. C++面试中string类的一种正确写法

    C++ 的一个常见面试题是让你实现一个 String 类,限于时间,不可能要求具备 std::string 的功能,但至少要求能正确管理资源.具体来说: 能像 int 类型那样定义变量,并且支持赋值. ...

  6. Java JVM 请别拿“String s=new String("z");创建了多少实例”来面试 [ 转载 ]

    Java 请别再拿“String s = new String("xyz");创建了多少个String实例”来面试了吧 [ 转载 ] @author RednaxelaFX 原文链 ...

  7. 面试长谈的String,StringBuffer,StringBuilder三兄弟有啥区别

    1.String: /** Strings are constant; their values cannot be changed after they * are created. String ...

  8. String s=new String("abc")产生了几个对象?[权威面试版]

    以下总结是我逛论坛 将零零碎碎的知识整理起来,方便自己记忆和阅读,顺便分享出来给大家学习. 若 String s=new String("abc"); 为第一句代码 则会产生两个对 ...

  9. 请别再拿“String s = new String("xyz");创建了多少个String实例”来面试了吧---转

    http://www.iteye.com/topic/774673 羞愧呀,不知道多少人干过,我也干过,面壁去! 这帖是用来回复高级语言虚拟机圈子里的一个问题,一道Java笔试题的. 本来因为见得太多 ...

随机推荐

  1. [codeforces] 97B Superset || 平面分治

    原题 给出一个平面的一些点,让你添加点,使得所有点对满足以下三个要求中的一个: 1.在一个水平面上 2.在一个竖直线上 3.以这两个点为对角的矩形内包含有其他点 输出一种可行解 因为只需要可行解,且只 ...

  2. Codeforces 359D Pair of Numbers | 二分+ST表+gcd

    题面: 给一个序列,求最长的合法区间,合法被定义为这个序列的gcd=区间最小值 输出最长合法区间个数,r-l长度 接下来输出每个合法区间的左端点 题解: 由于区间gcd满足单调性,所以我们可以二分区间 ...

  3. linux下源代码分析和阅读工具比较

    Windows下的源码阅读工具Souce Insight凭借着其易用性和多种编程语言的支持,无疑是这个领域的“带头大哥”.Linux/UNIX环境下呢?似乎仍然是处于百花齐放,各有千秋的春秋战国时代, ...

  4. Vue,watch观察对象中的某个属性的变化

    你只需要属性这样写,用引号引起来

  5. bzoj3561 莫比乌斯反演

    DZY Loves Math VI Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 518  Solved: 344[Submit][Status][D ...

  6. CSS 清除浮动的4种方法

    此为未清除浮动源代码,运行代码无法查看到父级元素浅黄色背景.<style type=”text/css”> <!– *{margin:0;padding:0;} body{font: ...

  7. Linux/unix inode

    一.inode是什么? 理解inode,要从文件储存说起. 文件储存在硬盘上,硬盘的最小存储单位叫做"扇区"(Sector).每个扇区储存512字节(相当于0.5KB). 操作系统 ...

  8. 母函数(Generation Function) 入门 + 模板

    转自:母函数 入门 + 模板  感谢 在数学中,某个序列的母函数(Generating function,又称生成函数)是一种形式幂级数,其每一项的系数可以提供关于这个序列的信息.使用母函数解决问题的 ...

  9. 将GDB中的输出定向到文件

    1 set args >output.log 三种方法,一种通过tee在启动时重定向: 1 gdb |tee -a file 第二种在run时加入: 1 run <input.txt &g ...

  10. 第一章:1-22、长度为100字节的应用层数据交给运输层传送,需加上20字节的TCP首部。再交给网络层传送,需加上20字节的IP首部。最后交给数据链路层的以太网传送,加上首部和尾部18字节。试求数据的传输效率。  若应用层数据长度为1000字节,数据的传输效率是多少?

    <计算机网络>谢希仁著第四版课后习题答案答: 数据长度为100字节时 传输效率=100/(100+20+20+18)=63.3% 数据长度为1000字节时, 传输效率=1000/(1000 ...