关于String对象的比较
1、String对象的比较
String 是一个常量,从String类中的代码可以看出。String类内部是通过char数组来存储字符串,这个char数组是被声明成final的。
// Java中只要使用了new 则生成一个新的对象,该对象永远在堆中,stringpool初始化为空,是由string类单独维护的
// 首先在stringpool中找abc对象,若没有则在stringpool创建abc对象,之后在堆中生成一个abc对象,即生成两个对象
String s = new String("abc");// s指向的是堆中的对象
// 首先从stringpool中去查找是否有abc对象,若有,则不生成(若没有则在stringpool生成abc对象,在用s1指向abc对象)。再用s1指向stringpool中的abc对象
String s1 = "abc";
// 首先在stringpool中找abc对象,若有,则不创建。之后在堆中生成一个abc对象,并把s2指向堆中的对象
String s2 = new String("abc"); System.out.println(s == s1);
System.out.println(s == s2);
System.out.println(s1 == s2);
代码执行内存中的变化如下:
代码执行完第3行的时候,此时会在stringpool中生成了一个abc对象,接着在堆中生成一个abc对象,并把堆中生成的abc对象的引用返回给s。
代码执行完第5行的时候,因为此时stringpool中已经有了一个abc对象,所以不会继续在stringpool中创建abc对象,s1就直接指向了stringpool中这个abc对象。
代码执行完第5行的时候,因为此时stringpool中已经有了一个abc对象,所以不会继续在stringpool中创建abc对象。而是在堆中生成一个abc对象,并把s2指向它。
对于引用类型来说,== 判断的是地址,对于原始数据类型来说==比较的是字面值,所以执行输出的结果如下:
false
false
false
内存示意图如下:

2、String对象的intern()方法
intern()的含义(返回的都是stringpool中的对象)若stringpool中包含abc,则返回stringpool中的abc对象的地址。若stringpool中不存在abc对象,则在stringpool中创建abc对象,并且把stringpool中abc对象的地址返回。
String s = new String("abc");
String s1 = "abc";
String s2 = new String("abc");
System.out.println(s == s.intern());
System.out.println(s1 == s1.intern());
System.out.println(s.intern() == s2.intern());
第5行代码执行的时候,此时stringpool已经有了一个abc对象,s.intern()会将stringpool中的abc对象返回,而s指向的是堆中的abc对象,故为假。
第6行代码执行的时候,此时stringpool已经有了一个abc对象,1s.intern()会将stringpool中的abc对象返回,而s1指向的也是在stringpool中的abc对象,故为真。
第7行代码执行的时候,此时stringpool已经有了一个abc对象,s1.intern()和s2.intern()都是将stringpool中的abc对象返回,故为真。
执行的结果如下
false
true
true
3、关于String中“+”操作
a、当 + 两边都是字面值(常量值)的时候,执行完+后,会首先判断stringpool值是否存在hello对象,若有则返回stringpool中的hello对象的地址。(若没有则创建,并返回stringpool中的对象)
b、当 + 操作时,若+两边有一个不是字面值的常量的时候,(不会检查stringpool,)java会直接在堆中生成一个hello对象,并把堆中的hello对象返回
String hello = "hello";
String hel = "hel";
String lo = "lo"; System.out.println(hello == "hel" + "lo");//编译后的代码为System.out.println(hello == "hello");
System.out.println(hello == "hel" + lo);//编译后的代码为System.out.println(hello == (new StringBuilder("hel")).append(lo).toString());
第5行代码执行的时候,此时stringpool已经有了一个hello对象,"hel" + "lo"也是将stringpool中的hello对象返回,故为真。
第6行代码执行的时候,"hel" + lo因为lo不是一个常量,所以"hel" + lo ,java会在堆中生成一个hello对象并返回。所以这个两个对象一个在stringpool中,一个在堆中,故为假。
执行结果如下:
true
false
4、关于String中concat(String str)方法
concat方法主要是将两个字符串连接起来,当传入的参数长度为0的时候,返回调用对象的本身;否则就对两个字符串进行拼接,生成一个新的对象返回。
String hello = "hello";
String hel = "hel";
String lo = "lo"; System.out.println(hello == hel.concat(lo));
执行结果如下:
false
通过查看String类中concat(String str)方法可以得知结果,源码如下:
public String concat(String str) {
int otherLen = str.length();
if (otherLen == 0) {
return this;
}
int len = value.length;
char buf[] = Arrays.copyOf(value, len + otherLen);
str.getChars(buf, len);
return new String(buf, true);
}
第3行判断传入的参数长度是否为0,如果为0就将调用对象返回;如果不为0就进行拼接,最后以new的方式在堆中创建一个新的String对象,并返回。所以当参数长度不为0的时候使用concat方法返回的对象总是在堆中新创建的对象。故进行对象比较为false。
关于String对象的比较的更多相关文章
- JavaScript String对象
本编主要介绍String 字符串对象. 目录 1. 介绍:阐述 String 对象的说明以及定义方式. 2. 实例属性:介绍 String 对象的实例属性: length. 3. 实例方法:介绍 St ...
- JavaScript中String对象的方法介绍
1.字符方法 1.1 charAt() 方法,返回字符串中指定位置的字符. var question = "Do you like JavaScript?"; alert(ques ...
- js实用篇之String对象
概述 String对象是JavaScript原生提供的三个包装对象之一,用来生成字符串的包装对象. var s1 = 'abc'; var s2 = new String('abc'); typeof ...
- java 创建string对象机制 字符串缓冲池 字符串拼接机制
对于创建String对象的机制,在这一过程中涉及的东西还是值得探究一番的. 首先看通过new String对象和直接赋值的方式有什么区别,看如下代码: public static void main( ...
- 原生JS:String对象详解
@import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/c ...
- JavaScript String 对象
JavaScript String 对象 String 对象 String 对象用于处理文本(字符串). String 对象创建方法: new String(). 语法 var txt = new S ...
- js String对象中常用方法小结(字符串操作)
1.charCodeAt方法返回一个整数,代表指定位置字符的Unicode编码. strObj.charCodeAt(index) 说明: index将被处理字符的从零开始计数的编号.有效值为0到字符 ...
- Javascript中String对象的的简单学习
第十一课String对象介绍1:属性 在javascript中可以用单引号,或者双引号括起来的一个字符当作 一个字符对象的实例,所以可以在某个字符串后再加上.去调用String 对象 ...
- JavaScript中的String对象
String对象提供的方法用于处理字符串及字符. 常用的一些方法: charAt(index):返回字符串中index处的字符. indexOf(searchValue,[fromIndex] ...
- JavaScript基础13——js的string对象
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
随机推荐
- [Test] 单元测试艺术(2) 打破依赖,使用模拟对象,桩对象,隔离框架
在上节中,完成了第一个单元测试,研究了各种特性,在本节,将介绍一些更实际的例子.SUT依赖于一个不可操控的对象,最常见的例子是文件系统,线程,内存和时间等. 本系列将分成3节: 单元测试基础知识 打破 ...
- idea上实现github代码同步
1.先将github远程仓库clone到本地 2.将本地仓库中的项目导入到idea中 3.如果你的项目代码不是放在仓库的根目录下,idea会识别到你的项目是在git仓库目录下,必须点击add root ...
- java:[1,1] 需要class, interface或enum
状态: cmd编译.java文件时报异常:java:[1,1] 需要class, interface或enum异常原因: 主要原因是java文件的编码问题. 在中文操作系统中,使用一贯的"j ...
- js页面跳转参考代码大全
整理一下JS页面跳转参考代码 第一种: <script language=/"javascript/" type=/"text/javascript/&qu ...
- Winform开发框架之简易工作流设计
一讲到工作流,很多人第一反应就是这个东西很深奥,有时候又觉得离我们较为遥远,确实完善的工作流设计很多方面,而正是由于需要兼顾很多方面,一般通用的工作流都难做到尽善尽美.微软也提供了几个版本的WF框架支 ...
- Ext.NET 4.1.0 搭建页面布局
Ext.NET目前的最新版本为4.1.0,可以从官网:ext.net上下载,具体下载网址为:http://ext.net/download/. 文件下载下来后,在\lib\目录下存在3个文件夹,分别对 ...
- css3文字导航鼠标悬停气泡动画特效源码下载
效果体验:http://hovertree.com/texiao/css3/8/ 效果图: 点击这里下载:http://hovertree.com/h/bjaf/8d5vmddq.htm 更多特效:h ...
- PHP正则表达式提取超链接及其标题
有这么一段HTML,比较不规则的,如果要提取其中的链接地址和链接名称,怎么弄? //HTML$str = ''<a id="top8" href="http://l ...
- 10个出色的NoSQL数据库
http://www.infoq.com/research/nosql-databases?utm_source=infoqresearch&utm_campaign=lr-homepage ...
- [原创]winform_PC宴会图片抽奖/文字抽奖
14年6月 好友结婚 14年4月左右知道他们婚礼由迎宾照抽奖的环节 问我有没有可以用的抽奖软件 我网上找了一会儿,就放弃了,自己做一个更快不是? 14年6月,PC宴会图片抽奖软件成功使用 --- 操作 ...