Java字符串初始化原理详解及常量池揭秘

创始人
2024-12-31 10:25:29
0 次浏览
0 评论

有关JAVA中字符串内存分布的问题!

Strings1=newString("abc");//在堆中,创建字符串对象abc,在栈上创建s1引用,指向堆。

Strings2="abc";//在字符串缓冲池中,创建字符串abc对象,并在栈上创建s2引用,指向字符串缓冲池链中的对象。

Strings3="abc";//如果字符串缓冲池中有值为abc的字符串,则创建一个s3引用直接指向它'字符串缓冲池目的。

System.out.println(s1==s2);//结果:false

System.out.println(s2==s3);//结果:true

System.out.println(s2==s3);//结果:true

浅谈Java中字符串的初始化(详细图解)

在深入了解Java字符串类之前,了解JVM字符串处理初始化的细节非常重要。
首先了解一下字符串常量池的概念,应该可以实现数据通信,更好理解。
我们来研究一下字符串常量池是如何工作的。
当直接使用双引号声明字符串时,例如Strings1="Hello";,JVM会首先检查字符串常量池中是否已经存在该字符串。
如果存在,则返回该关系;Strings1的实际操作类比是这样的:JVM在字符串常量池中寻找“hello”。
常量池返回到s1。
使用new关键字创建字符串对象,如Strings2=newString("hello");s1==与s2的比较结果为false。
考虑一个例子:第一行代码Strings1=newString("salt")+new("world");,执行过程是先在内存栈中创建两个字符串对象,然后将它们分割成一个新的对象。
s1.intern()方法在池中查找对“helloworld”常量的引用。
结果是s1和“helloworld”引用了常量池中的同一个对象,所以s1==s2返回true。
反编译代码验证字符串初始化操作:第一行和第二行分别声明字符串对象,分别创建并写入堆内存和常量池。
关键在第三行Strings3=s1+s2。
反编译结果显示s3是通过新的key得到的,说明“helloworld”与常量池无关,s4也不是同样的,这是错误的。
综上所述,字符串常量池提供了复用功能。
读完本文,希望您对Java中的字符串初始化机制有更深入的了解。

char*s1="hello";chars2[]="hello";这两个C语言句有什么区别

你好:我简单地回答一下这个问题,以便你能充分理解(1)什么是“你好”?它是一个数组常量,注意C语言中数组没有变量(2)“hello”在内存中是如何存储的。
就像一般的数组一样,每个小内存数组并不存储一个字母。
这显然是一个指示变量。
在我们的例子中,这个s用于存储字符的地址。
!这是该数组的首地址。
(4)当我们提取这个首地址时,首先找到首地址,然后按顺序读取后面的字符,直到遇到'\0'所以,可以想象,这个字符串的长度是6。
因为系统自动添加'\0'(5)chars2[]="hello",这是什么?它是一个名为s2的字符集,存储了五个字符h、e、l、o,当然它的长度是5,这就是与第一个的区别,称之为运气。

strcat函数问题

可以,但是有一个前提:s1和s2指向的内存区域不能重叠,并且s1必须有足够的空间容纳s2的字符串。
还有,是否在静态存储区,取决于你如何定义这两个地址,是否是静态变量。
热门文章
1
Java字符串分割技巧:轻松获取逗号前的... java任意一个字符串,当它碰到第一个逗号时,返回逗号前面的字符串,例如:str...

2
SQL多表连接查询全解析:JOIN语句应... sql多表关联查询在执行SQL多表连接查询时,可以使用JOIN语句将多个表连接在...

3
Java中字符串类型详解:String与... 变量有字符类型,为什么没有字符串类型??基本类型:charshort、int、l...

4
JavaSE与JavaEE:从基础到企业... javase 和javaee的区别?JavaSE和JavaEE...

5
Java程序员面试必知:核心技术问答与技... java编程程序员技术面试常见面试?随着互联网的不断发展,Java开发已经成为很...

6
Java.exe与Javaw.exe:区... 程序中java和javaw有什么区别java和javaw的区别:两者都是Java...

7
深入解析:Java中的javax包及其与... JAVA导入时,什么是javax?awt是java1.0,swing是java2...

8
Java GUI教程:创建带随机数生成功... 求助:用Java设计一个界面,要求添加5个按钮和一个显示窗口能够生成随机数!急急...

9
Java保留字详解:类型、语句、修饰符与... Java有没有goto?goto是Java保留字,目前在Java中未使用。其实g...

10
Java标识符规则详解:命名规范与组成要... java中标识符由什么组成?标识符?关键词是什么?谢谢!标识符是用于命名变量、类...