问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

java中String到底能不能变化?String,StringBuffer的区别是什么?

发布网友 发布时间:2023-07-31 15:48

我来回答

4个回答

热心网友 时间:2024-12-11 22:48

String s1 = "java1";   // 语句1    
s1 += " great";        // 语句2
StringBuffer s2 = new StringBuffer("java2");   // 语句3
s2.append(" great");   // 语句4

首先回答你的问题:  String不能发生变化。

String属于不可变类,创建这个类的实例,其实是声明了一个指向字符串"java1"的引用s1,由于不可变类不会提供改写或是修改成员变量的任何方法,因此String的值本身不能发生变化。语句2的作用只不过是让s1指向了另一个String类型的对象"java1 great"而已,"java1"仍存在于内存中,直到等待gc回收。

StringBuffer的状态可以发生改变,创建这个类的实例,其实是声明了一个指向字符串"java2"的引用s2,由于StringBuffer并非是不可变类,它本身支持改变状态,因此语句4执行后,会让s2指向的存放在内存中的字符串发生改变,即"java2"=》 "java2 great"。

热心网友 时间:2024-12-11 22:48


过上面例子的童鞋一定会觉得很奇怪,s = s + s1.charAt(i); 马克-to-win, s不是老在变化吗?其实s =
"";时,虚拟机会创建一个String对象,s = s + s1.charAt(i);
时,会创建一个新对象,而不是之前的s了,会导致新对象的生成,这样做次数少还没有太大的问题,如果次数多的话,很浪费空间。StringBuffer是
在同一个实例上做这些事,不用生成新对象。当做的次数多的话,会节省大量空间。

java堆和栈的区别

Java中内存分成两种:一种是栈stack,一种是堆heap。

函数中的一些基本类型的变量(int, float)和对象的引用变量(reference)都在函数的栈中,马克-to-win,(工作于编译阶段, 生成class文件之前)分配。存取速度快,稍逊于寄存器, 比堆快,

函数执行完后,Java会自动释放掉为函数里变量开辟的栈内存空间,该内存空间可以立即被另作他用。

堆heap内存用来存放由new创建的对象和数组。堆内存,负责运行时(runtime, 执行生成的class文件时)数据,由JVM的自动管理。缺点是,存取速度较慢。

栈中的引用变量指向堆中的对象或数组。


中有共享池的概念,比如下面例子中,sz="hello";在栈中创建一个String对象引用变量sz,然后看看栈中有没有"hello",如果没有,
则将"hello"存放进栈,并令sz指向”hello”,如果已经有”hello” 则直接令sz指向“hello”。对于int, float
类型的变量也是一样的有这种共享池的概念,注意上述的工作是在compile(编译)的阶段完成的,而不是runtime运行时完成的。


于下面程序中:ss0 = new String( "hello"
);是用new()来新建对象的,存于堆中。每调用一次就会创建一个新的对象。当然从节省空间的角度来讲,肯定不如str="hello",有童鞋一定
问,那要它有什么用?当时设计编译器时,为什么要设计它?马克-to-win,那我请问你,如果在你编程序时,你还不知道字符串内容怎么办?这时就用到
new String,所以,什么都有什么的用处。

本章源码

public class Test
{
public static void main(String args[]) {
String str, str1, ss0, ss1, ss2, ss3, ss4;
。。。。。。。。。。。详情网上找“马克-to-win”,参考他的网站或他的百度空间:java第2章的内容

热心网友 时间:2024-12-11 22:48

String不能,StringBuffer能,且性能更好,推荐后者

热心网友 时间:2024-12-11 22:49

当然不能变化,

区别当然是可变和不可变了
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
amd锐龙r75700g超频性价比装机方案,要核显性能综合表现超 架空电线故障如何排除 ...unexpected T_CONSTANT_ENCAPSED_STRING in 怎么解决这个错啊_百度... php错误Parse error: syntax error, unexpected T_CONSTANT_ENCAPSED_S... PHP出现如下情况 syntax error, unexpected T_ENCAPSED_AND_WHITES... php 如何捕获类似于Parse error: syntax error, unexpected T_CONSTA... 挂烫机如何熨西装 戗驳领西装怎么熨烫 西装前片怎么推拉拔烫 西装能不能拿去烫 我爱消消到了100元能不能提现?到时候提不了,就白玩了。 JAVA的String和StringBuffer java关于String和StringBuffer运用的问题 富贵竹如何用水快速根治? 卧虎山滑雪场介绍卧虎山滑雪场带什么 卧虎山的简介 阳痿早期症状有哪些?阳痿早期症状表现 阳痿的症状有哪些?阳痿的主要表现是什么? 想知道: 东莞市 东莞横沥西城一区离大朗车站有多远了 在哪 被限制所有场景15天怎么解封? 被封了15天,到时间会自动解封么? 被封了15天,到时间会自动解封么? vivo手机锁屏广告如何关闭 人防办的合同工有社保医保吗 合同制工人在事业单位病假期间可以缴停医保吗 全民合同制工人可不可以办职工医保和职工养老保险 事业单位聘请的合同工能否享受职工医保 在学校入职合同工后是享受什么医保 三亚学院是正规大学吗 三亚学院在哪个位置 在网上买耳机,手机是华为荣耀3,商品只写了华为,那商品可以买吗?_百 ... 华硕显卡evo什么意思 酷我音乐如何切换账号 骱字的意思 骱是什么意思 38mm等于多少米 38mm的锁有多大 京阪京都酒店是到关西机场巴士哪个站下 出租房装修如何省钱出租房装修攻略 出租房装修要多少钱出租房如何装的好看又省钱 ...个几个巴掌大的公仔到广东省廉江市,需要多少费用? 深圳寄一个公仔到佛山邮费多少 有部电影,在一个房子里讲述一个人讲他以前的经历,最后隐晦他就是... 三星c5怎么允许后台运行软件 美丽心情刘惜君歌词 怎么关闭OPPO手机的热点消息提示? 买本田凌派幻夜版利息多少合适 逻辑“与”算符是用来组配()。 使用逻辑或是为了? 上嵌科技靠谱吗?求大神指点... ...被人恶意曲解了说话的意思,现在心情特别难受怎么调节啊?