String 这玩意,对于Javer 来说,在面试或笔试是总让你魂牵梦绕哦。什么是否相等哦,什么这个字符串的结果是多少哦,有时候很厌恶这类型的题哈,如果你现在感到厌恶,就说明你还是没有弄明白这玩意的特性以及功能了,好吧。我就来说说这玩意的特点(以面试的方式)。
先看个例子
String str1="abc";
String str2="abc";
String str3=new String("abc");
String str4=new String("abc");
1) str1==str2 true;
2) str1==str3 false
3) str3==str4 false;
说到1)比较就要牵扯到,常量池的知识咯。
我们都知道,Java程序要运行,首先需要编译器将源代码文件编译成字节码文件(也就是.class文件)。然后在由JVM解释执行,在class文件中有一个非常重要的项-就是常量池,它可以存放静态数据,常量,还有就是直接通过赋值创建的字符串,,在Java源代码中的每一个字面值字符串,都会在编译成class文件阶段,形成标志号 为8(CONSTANT_String_info)的常量表 。 当JVM加载 class文件的时候,会为对应的常量池建立一个内存数据结构,并存放在方法区中。同时JVM会自动为CONSTANT_String_info常量表中 的字符串常量字面值 在堆中 创建 新的String对象(intern字符串 对象 ,又叫拘留字符串对象)。然后把CONSTANT_String_info常量表的入口地址转变成这个堆中String对象的直接地址(常量池解 析)。 这里很关键的就是这个拘留字符串对象 。源代码中所有相同字面值的字符串常量只可能建立唯一一个拘留字符串对象。 实际上JVM是通过一个记录了拘留字符串引用的内部数据结构来维持这一特性的。在Java程序中,可以调用String的intern()方法来使得一个常规字符串对象成为拘留字符串对象。我们会在后面介绍这个方法的。
所以str1和str2在常量池中都是指向了同一个地址,所以比较的结果是相等的咯
str3和str4是创建了两个String 对象,所以str3和str4的地址是不一样的,所以他俩就不相等咯。
再看例子
String str="a";
String str1="bc"
String str2=st+st1;
String str3="abc";
str2==str3 false;
这俩为啥不等咯,主要是这“+”的运算功效,当执行st+st1时,JVM首先会在堆中创建一个StringBuilder类,同时用st指向的拘留字符串对象完成初始化,然后调用append方法完成对st1所指向的拘留字符串的合并操作,接着调用StringBuilder的toString()方法在堆中创建一个String对象,最后将刚生成的String对象的堆地址存放在局部变量st2中。而局部变量str3存储的是常量池中"abc"所对应的拘留字符串对象的地址。 st2与st3地址当然不一样了。这里要注意了,堆中实际上有五个字符串对象:三个拘留字符串对象、一个String对象和一个StringBuilder对象。
String sc="ab"+"cd";
String sd="abcd";
System.out.println(sc==sd); //true
"ab"+"cd"会直接在编译期就合并成常量"abcd", 因此相同字面值常量"abcd"所对应的是同一个拘留字符串对象,所以地址是相同的咯。
分享到:
相关推荐
Java基础之字符串及
java中字符串处理函数,java学习的基础,起飞的垫脚石
java 语言基础(5-7) 介绍数组、字符串以及类的基础运用!
接受用户输入的一个字符串和一个字符,把字符串中所有指定的字符删除后输Java字符串中删除指定子字符串的方法,是Java入门学习中的基础知识,需要的朋友可以下载参考下
主要介绍了java基础-给出一个随机字符串,判断有多少字母?多少数字?文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
java基础面试题字符串的排列提取方式是百度网盘分享地址
一般程序需要处理大量文本数据Java语言的文本数据被保存为字符或字符串类型。 若干个字符在计算机里面如何存储? 如何引用呢? 引入 例如 “320106199503150101” String类:连接、查找、比较等 引入 String是Java库...
去掉重复的字符串及在第一个字符串中删除在第二个字符串中出现的字符两个程序,vs2013已经验证
JAva方面操作字符串和文本的相关代码集,面向Java初学者,高手请绕行,这些实例都是挺简单的,可帮助初学者熟悉这方面的基础操作。
完整版精品java课件 Java基础入门教程 Java程序设计 第7章 字符串处理(共38页).ppt 完整版精品java课件 Java基础入门教程 Java程序设计 第8章 异常处理(共27页).ppt 完整版精品java课件 Java基础入门教程 Java...
字符串基础:详细介绍了Java中字符串的创建、拼接、比较、搜索等基本操作,以及常用的字符串类和API。 算法解析:深入解析了常见的字符串算法问题,如最长公共子串、字符串排序、子串查找等,并提供了解题思路和代码...
java基础面试题左旋转字符串提取方式是百度网盘分享地址
Java 中操作字符串都有哪些类?它们之间有什么区别? 操作字符串的类有:String、StringBuffer、StringBuilder。 String 和 StringBuffer、StringBuilder 的区别在于 String 声明的是不可变的对象,每次操作都会...
java基础面试题把字符串转化为整数本资源系百度网盘分享地址
java2 使用教程(第三版) 实验指导 上机实践5 字符串、时间与数字 String 类的常用方法 比较日期的大小 (日期比较中【代码2】和【代码4】处的public final void set(int year,int month,int date) 方法在设置月份时...
c++或者Java是提供字符串类型的。 字符串的结束标志是\0的转义字符。在计算字符串空间长度的时候,\0作为结束标志,不算作字符串内容。 例如: 这时候我们发现空字符串的空间长度为1,原因是系统默认\0作为字符串的...
本课程适合零基础的java爱好者,本节介绍了java中的字符串相关概念
java基础面试题表示数值的字符串本资源系百度网盘分享地址
java字符串和数组基础共21页.pdf.zip
java语言基础数组向量字符串PPT教案学习.pptx