关于String的经典问题很多,不过弄清楚jvm如果创建和存储String对象,一般的问题应该都能对付
1 String对象的存放
(1) 直接使用双引号:String s = "abc"; "abc"字符串存在jvm的常量池中,常量池在方法区中
(2) 使用new String:String s = new String("abc");在堆中分配内存区域
2 + 操作String对象
(1) String s = "a" + "bc";这种类型的操作,类文件在编译成class文件时,直接把"a" + "bc"编译成了"abc";常量池中只存在"abc",不存在"a", "bc"
(2) String a = "a"; String b = "bc"; String c = a + b;针对这种操作,编译后的指令为:先创建一个StringBuilder对象,然后使用append方法,把两个字符串append进来,然后调用 toString方法,生成一个新的String对象
3 itern()方法
该方法去查找常量池用没有,有则返回,没有创建
4 两个类同时声明相同的str
比如:
public class StringDemo { private static String xx = "abc"; public static void main (String[] args) { String a = "a"; String b = "bc"; String c = a + b; String d = "a" + "bc"; String e = "abc"; String ss = "x" + "yyy"; System.out.println(e == c ); System.out.println(e == d ); System.out.println(xx == e); System.out.println(xx == TestDemo.str); } } class TestDemo { public static final String str = "abc"; // public static final StringDemo strDemo = new StringDemo(); static { System.out.println("TestDemo clinit..."); } }
执行结果:
com.malone.common.StringDemo false true true true
在类TestDemo.java声明了str对象,在StringDemo声明了xx,两个类使用了相同的字符串,常量池中只存在一个"abc"
看一下上面mian函数编译后的命令:
ldc "a" astore_1 ldc "bc" astore_2 new java/lang/StringBuilder dup invokespecial java/lang/StringBuilder/<init>()V aload_1 invokevirtual java/lang/StringBuilder/append(Ljava/lang/String;)Ljava/lang/StringBuilder; aload_2 invokevirtual java/lang/StringBuilder/append(Ljava/lang/String;)Ljava/lang/StringBuilder; invokevirtual java/lang/StringBuilder/toString()Ljava/lang/String; astore_3 ldc "abc" astore 4 ldc "abc" astore 5 ldc "xyyy" astore 6 getstatic java/lang/System/out Ljava/io/PrintStream; aload 5 aload_3 if_acmpne 26 iconst_1 goto 27 iconst_0 invokevirtual java/io/PrintStream/println(Z)V getstatic java/lang/System/out Ljava/io/PrintStream; aload 5 aload 4 if_acmpne 34 iconst_1 goto 35 iconst_0 invokevirtual java/io/PrintStream/println(Z)V getstatic java/lang/System/out Ljava/io/PrintStream; getstatic com/malone/common/StringDemo/xx Ljava/lang/String; aload 5 if_acmpne 42 iconst_1 goto 43 iconst_0 invokevirtual java/io/PrintStream/println(Z)V getstatic java/lang/System/out Ljava/io/PrintStream; getstatic com/malone/common/StringDemo/xx Ljava/lang/String; ldc "abc" if_acmpne 50 iconst_1 goto 51 iconst_0 invokevirtual java/io/PrintStream/println(Z)V return
相关推荐
String对象的创建问题,分为:编译期和执行期 详细的讲解String对象创建问题
Java String对象的经典问题,有关String类的介绍
String a="hello world"; //在java中有一个常量池,当创建String 类型的引用变量给它赋值时,java会到它的常量池中找"hello world"是不是在常量池中已存在。如果已经存在则返回这个常量池中的"hello world"的地址...
关于String类中常量池、字符串池的理解
Java技术:Java String常见问题解析
我在网上找的,感觉很有用,希望大家有用的看一下,能给你们带来帮助
idea连接达梦数据库出现input string "8"问题,驱动已修复,里面包含修复的源码,如果涉及其他版本,参照修改即可
对string作了一些扩展,包括string转化为int、string转化为double、string转化为bool、打印系统当前时间。但没有解决数据溢出的问题,请大神帮忙解决!
关于String类的一些问题 掌握String类的两种实例化方式 掌握String的两种比较操作 深入分析String类两种实例化方式的区别 掌握String的使用特点
针对设置settings --- compiler --- 在compiler flag中 --- 勾选 have g++ follow the C++ 11 ISO C++ language standard,点击ok之后,仍然不能解决to_string()的解决方案用到的替换文件 具体解决方案常见:...
主要介绍了Java中String判断值为null或空及地址是否相等的问题,文中举了简单的例子对字符串类型的值和地址问题进行讲解,需要的朋友可以参考下
Java中十大常见Java String问题_动力节点Java学院整理
使用过protobuf的同学肯定对pb的DebugString相关方法再熟悉不过了,其作用就是打印输出pb对象。有些时候我们可能会有根据这个输出还原原始pb对象的需求。仔细观察发现输出并不是标准json格式,也就是说基于json→pb...
问题来源: 在写二叉树序列化与反序列化时发现序列化函数为char* Serialize1(TreeNode *root) 其函数返回类型为char*,但是我在实现的过程中为了更方便的操作添加字符串使用的是C++中string类型的变量,这就导致我...
Delphi结构中使用String时遇到的内存泄露问题(没有利用String的引用计数自动销毁字符串的功能) .mht
最近在研究Webservice的时候遇到一个问题,把java对象转化问json后传过去,接受的是String类型,怎么恢复到原来的java对象呢,后来再一个项目中看到了转换方法,转换顺序为javaBean--jsonObject--jsonString,还原...
CString对象和string对象的相互转化问题,以及他们呢的用法
CString 可能是 CStringW/CStringA,在与 string 转换时,如果是 CStringW,还涉及编码转换问题。下面以 CStringA 来说明。 1 string to CString CString.format("%s",string.c_str()); CStringA = string.c_...
string 和 date类型相互转换的问题
CString和string的不同在c++中的一部分的问题。