问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501
你好,欢迎来到懂视!登录注册
当前位置: 首页 - 正文

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

发布网友 发布时间:2022-05-16 03:58

我来回答

4个回答

热心网友 时间:2023-10-10 16:59

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"。

热心网友 时间:2023-10-10 16:59


过上面例子的童鞋一定会觉得很奇怪,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章的内容

热心网友 时间:2023-10-10 17:00

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

热心网友 时间:2023-10-10 17:00

当然不能变化,

区别当然是可变和不可变了
声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。
E-MAIL:11247931@qq.com
锁阳可以和枸杞泡酒吗泡酒方法 为什么360手机卫士老是自动退? k8s入门实战(一)--概念篇 基金估值和收益有关系吗 基金分析指标重要吗 股票休盘什么意思 股票什么情况不能买 股票什么时候休盘 欧洲股市为什么休市 公司实习报告有用吗 Stencil buffer失效了怎么办 缓冲器的专用语 请问什么是模板缓冲(Stencil Buffer) 日语早上好,下午好,晚上好!还有你好意思 日语中“下午好,晚上好”怎么讲的啊? 日语下午好怎么说 下午好用日文怎么写? 下午好的日语如何翻译? 下午好用日语怎么说? 下午好,用日语怎么写? 下午好,日语怎么说 下午好,日语怎么说? 日语的下午好怎么说? 日语下午好怎么说? JavaScript问题 如何使鼠标移到不同的文字上 另一侧的图片发生相应的变换?求代码!!我菜鸟!初学者 关于企业未设置预付账款的会计分录 可以不用设预付账款的账户,应该把预付款项计入那? 不设置预收预付账款,如何做账? 设置预付账款与不设置预付账款 公司不设预付账款 如何入账 帮翻译下~~ ANativeWindow是个什么东西 c++ 编辑的.cpp文件如何在matlab中mex编译报错 snort规则 英文翻译摘要 想要的是语法正确得翻译,不要“中式”英语 求大神cdr中如何做裂纹字啊 像图片这样的 求大神指教 求步骤???? 为何有的pdf无法用Apple pen标记 an apple a day keeps the doctor away连读读音标记 怎么去除苹果上的系统提醒标记 丰田18年1.4T智辉版卡罗拉有定速巡航功能吗? 卡罗拉2018自动巡航灯黄色故障怎么解决? 卡罗拉定速巡航时下坡离合器空转发动机空响正常吗? 卡罗拉双擎加装定速巡航有影响吗 卡罗拉上有车标ACC吗? 取环后多久还能上环 为什么腾讯视频不能免流了! 为什么我的腾讯视频不显示免流了,流量没有上限,大王卡也是设置的主卡 为什么我的腾讯视频不能免流了 沣标电子考勤制度 为什么突然,我看腾讯视频不显示免流了,那我要怎么弄
  • 焦点

最新推荐

猜你喜欢

热门推荐