文档章节

java中的String:用代码直接分析

zhqb
 zhqb
发布于 2016/08/04 15:51
字数 778
阅读 7
收藏 0

public static void main(String[] args) { // TODO Auto-generated method stub /** * 情景一:字符串池 * JAVA虚拟机(JVM)中存在着一个字符串池,其中保存着很多String对象; * 并且可以被共享使用,因此它提高了效率。 * 由于String类是final的,它的值一经创建就不可改变。 * 字符串池由String类维护,我们可以调用intern()方法来访问字符串池。
/
String s1 = "abc";
// 在字符串池创建了一个对象
String s2 = "abc";
// 字符串pool已经存在对象“abc”(共享),所以创建0个对象,累计创建一个对象
System.out.println("s1 == s2 : "+(s1==s2));
// true 指向同一个对象,
System.out.println("s1.equals(s2) : " + (s1.equals(s2)));
// true 值相等
//------------------------------------------------------over
/
* * 情景二:关于new String("") *
/
String s3 = new String("abc");
// 创建了两个对象,一个存放在字符串池中,一个存在与堆区中; ("abc") // 还有一个对象引用s3存放在栈中
String s4 = new String("abc");
// 字符串池中已经存在“abc”对象,所以只在堆中创建了一个对象
System.out.println("s3 == s4 : "+(s3==s4));
//false s3和s4栈区的地址不同,指向堆区的不同地址;
System.out.println("s3.equals(s4) : "+(s3.equals(s4)));
//true s3和s4的值相同
System.out.println("s1 == s3 : "+(s1==s3));
//false 存放的地区多不同,一个栈区,一个堆区
System.out.println("s1.equals(s3) : "+(s1.equals(s3)));
//true 值相同
//------------------------------------------------------over
/
* * 情景三:
* 由于常量的值在编译的时候就被确定(优化)了。 * 在这里,"ab"和"cd"都是常量,因此变量str3的值在编译时就可以确定。 * 这行代码编译后的效果等同于: String str3 = "abcd"; /
String str1 = "ab" + "cd"; //1个对象
String str11 = "abcd";
System.out.println("str1 = str11 : "+ (str1 == str11));
// true---------------------------------------------------over
/
* * 情景四:
* 局部变量str2,str3存储的是存储两个拘留字符串对象(intern字符串对象)的地址。 *
* 第三行代码原理(str2+str3): * 运行期JVM首先会在堆中创建一个StringBuilder类, * 同时用str2指向的拘留字符串对象完成初始化, * 然后调用append方法完成对str3所指向的拘留字符串的合并, * 接着调用StringBuilder的toString()方法在堆中创建一个String对象, * 最后将刚生成的String对象的堆地址存放在局部变量str3中。 *
* 而str5存储的是字符串池中"abcd"所对应的拘留字符串对象的地址。 * str4与str5地址当然不一样了。 *
* 内存中实际上有五个字符串对象: * 三个拘留字符串对象、一个String对象和一个StringBuilder对象。 /
String str2 = "ab"; //1个对象
String str3 = "cd"; //1个对象
String str4 = str2+str3;
String str5 = "abcd";
System.out.println("str4 = str5 : " + (str4==str5)); // false---------------------------------------------------over
/
* * 情景五: * JAVA编译器对string + 基本类型/常量 是当成常量表达式直接求值来优化的。 * 运行期的两个string相加,会产生新的对象的,存储在堆(heap)中 */
String str6 = "b";
String str7 = "a" + str6;
String str67 = "ab";
System.out.println("str7 = str67 : "+ (str7 == str67));
//false------------str6为变量,在运行期才会被解析。
final String str8 = "b";
String str9 = "a" + str8;
String str89 = "ab";
System.out.println("str9 = str89 : "+ (str9 == str89));
//true-------------str8为常量变量,编译期会被优化

}

© 著作权归作者所有

zhqb
粉丝 0
博文 3
码字总数 2216
作品 0
西安
私信 提问
Java+内存分配及变量存储位置的区别

Java内存分配与管理是Java的核心技术之一,之前我们曾介绍过Java的内存管理与内存泄露以及Java垃圾回收方面的知识,今天我们再次深入Java核心,详细介绍一下Java在内存分配方面的知识。一般J...

郭二翔
2011/12/18
0
0
java内存分配和String类型的深度解析

一、引题 在java语言的所有数据类型中,String类型是比较特殊的一种类型,同时也是面试的时候经常被问到的一个知识点,本文结合java内存分配深度分析关于String的许多令人迷惑的问题。下面是...

萧十一郎君
2013/10/19
0
30
05《Java核心技术》之三种字符串类有什么区别?

一、提出问题 今天,我们来聊聊日常使用的字符串,别看它似乎很简单,但其实字符串几乎在所有编程语言里都是个特殊的存在,因为不管是数量还是体积,字符串都是大多数应用中的重要组成。 今天...

飞鱼说编程
2018/09/24
0
0
Java深度理解——Java字节代码的操纵

导读:Java作为业界应用最为广泛的语言之一,深得众多软件厂商和开发者的推崇,更是被包括Oracle在内的众多JCP成员积极地推动发展。但是对于 Java语言的深度理解和运用,毕竟是很少会有人涉及...

刘学炜
2012/01/13
0
0
[Java] 从Java内核看性能分析与设计

引言 Java语言自90年代出现以来,因为它的安全性和跨平台性(即所谓的”Write Once,Run Anywhere”)等特点,深得广大程序员的青睐,但是同时,Java程序的运行效率问题也是程序员的心病。Jav...

长平狐
2012/11/19
207
0

没有更多内容

加载失败,请刷新页面

加载更多

基于redis分布式锁实现“秒杀”

最近在项目中遇到了类似“秒杀”的业务场景,在本篇博客中,我将用一个非常简单的demo,阐述实现所谓“秒杀”的基本思路。 业务场景 所谓秒杀,从业务角度看,是短时间内多个用户“争抢”资源...

别打我会飞
30分钟前
8
0
Zookeeper的实践指南

本章重点 1.数据存储2.基于Java API初探Zookeeper的使用3.深入分析Watcher机制的实现原理4.Curator客户端的使用,简单高效 数据存储 事务日志快照日志运行时日志 bin/zookeepe...

须臾之余
33分钟前
1
0
MySQL mybatis Point类型数据

MySQL中的point用于表示GIS中的地理坐标,在GIS中广泛使用 如何写入mysql,如下图: CREATE TABLE `test-point` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '序号', `point` ......

张欢19933
45分钟前
2
0
设计模式-适配器模式

适配器模式 适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。 这种模式涉及到一个单一的类,该类负责加入...

HOT_POT
今天
17
0
Qt编写自定义控件7-自定义可拖动多边形

前言 自定义可拖动多边形控件,原创作者是赵彦博(QQ:408815041 zyb920@hotmail.com),创作之初主要是为了能够在视频区域内用户自定义可拖动的多个区域,即可用来作为警戒区域,也可用来其他的...

飞扬青云
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部