string的值可以改变吗,string是啥意思

懵懂先生 投稿文章string的值可以改变吗,string是啥意思已关闭评论53阅读模式

文章源自略懂百科-http://wswcn.cn/97389.html

1 前言

String 是一个特殊的对象,属于引用类型,一经创建初始化后不能更改,由于String 对象的不可变,所以可以共享。文章源自略懂百科-http://wswcn.cn/97389.html

2 定义

从概念上讲,Java字符串就是Unicode字符序列。在标准Java类库中提供了一个预定义类String。String就是用双引号引起来的几个字符,每个用双引号括起来的字符串都是String类的一个实例:文章源自略懂百科-http://wswcn.cn/97389.html

Strings ="abc";文章源自略懂百科-http://wswcn.cn/97389.html

String对象是不可变的。查看 JDK 文档你就会发现,String类中每一个看起来会修改String值的方法,实际上都是创建了一个全新的String对象,以包含修改后的字符串内容。而最初的String对象则丝毫未动。看看下面的代码:文章源自略懂百科-http://wswcn.cn/97389.html

publicclassUser{publicstaticStringupcase(String s){returns.toUpperCase();
}publicstaticvoidmain(String[] args){
String name ="manoninsight";
String name1 = upcase(name);
System.out.println(name1);
System.out.println(name);
}
}文章源自略懂百科-http://wswcn.cn/97389.html

输出:文章源自略懂百科-http://wswcn.cn/97389.html

MANONINSIGHTmanoninsight文章源自略懂百科-http://wswcn.cn/97389.html

当把name传递给upcase()方法时,实际传递的是引用的一个拷贝。其实,每当把 String 对象作为方法的参数时,都会复制一份引用,而该引用所指向的对象其实一直待在单一的物理位置上,从未动过。文章源自略懂百科-http://wswcn.cn/97389.html

回到upcase()的定义,传入其中的引用有了名字s,只有upcase()运行的时候,局部引用s才存在。一旦upcase()运行结束,s就消失了。当然了,upcase()的返回值,其实是最终结果的引用。这足以说明,upcase()返回的引用已经指向了一个新的对象,而name仍然在原来的位置。文章源自略懂百科-http://wswcn.cn/97389.html

对于一个方法而言,参数是为该方法提供信息的,而不是想让该方法改变自己的。在阅读这段代码时,读者自然会有这样的感觉。这一点很重要,正是有了这种保障,才使得代码易于编写和阅读。文章源自略懂百科-http://wswcn.cn/97389.html

小细节:我们知道String是一个对象,然而我们前面说过对象的创建要通过new关键字创建,而我们在创建String时却写成:Strings="abc";而非Strings=newString(abc);文章源自略懂百科-http://wswcn.cn/97389.html

String s=new String(abc);创建了两个对象文章源自略懂百科-http://wswcn.cn/97389.html

1,在字符串池中创建一个对象(此对象是不能重复的)文章源自略懂百科-http://wswcn.cn/97389.html

2,new出一个对象。Java 运行环境有一个字符串池,由 String 类维护。执行语句 String s="abc"时,首先查看字符串池中是否存在字符串"abc",如果存在则直接将"abc"赋给 s,如果不存在则先在字符串池中新建一个字符串"abc",然后再将其赋给 s。执行语句 String s=new String("abc")时,不管字符串池中是否存在字符串"abc",直接新建一个字符串"abc"(注意:新建的字符串"abc"不是在字符串池中),然后将其付给 s。文章源自略懂百科-http://wswcn.cn/97389.html

3 重载

String不可变性会带来一定的效率问题。为String对象重载的+操作符就是一个例子。重载的意思是,一个操作符在用于特定的类时,被赋予了特殊的意义。操作符+可以用来连接String:文章源自略懂百科-http://wswcn.cn/97389.html

publicstaticvoidmain(String[] args) {Stringname ="码农洞见";Stringage =30;Strings ="namge:"+ name +"age:"+ age;
System.out.println(s);
}文章源自略懂百科-http://wswcn.cn/97389.html

可以想象一下,这段代码是这样工作的:String可能有一个append()方法,它会生成一个新的String对象,以包含namge:与name连接后的字符串。该对象会再创建另一个新的String对象,然后与age:相连,生成另一个新的对象,依此类推。文章源自略懂百科-http://wswcn.cn/97389.html

这种方式当然是可行的,但是为了生成最终的String对象,会产生一大堆需要垃圾回收的中间对象。我猜想,Java 设计者一开始就是这么做的(这也是软件设计中的一个教训:除非你用代码将系统实现,并让它运行起来,否则你无法真正了解它会有什么问题),然后他们发现其性能相当糟糕。文章源自略懂百科-http://wswcn.cn/97389.html

为了解决这个问题,在JDK5.0中引入 StringBuilder类。在这之前用的是StringBuffer。后者是线程安全的,因此开销也会大些。使用StringBuilder进行字符串操作更快一点。如果需要用许多小段的字符串构建一个字符串,那么应该按照下列步骤进行。首先,构建一个空的字符串构建器:文章源自略懂百科-http://wswcn.cn/97389.html

StringBuilder builder =newStringBuilder();文章源自略懂百科-http://wswcn.cn/97389.html

当每次需要添加一部分内容时,就调用append方法。文章源自略懂百科-http://wswcn.cn/97389.html

builder.append("abc");
builder.append("123");
...文章源自略懂百科-http://wswcn.cn/97389.html

在需要构建字符串时就调用toString方法,将可以得到一个String对象,其中包含了构建器中的字符序列。文章源自略懂百科-http://wswcn.cn/97389.html

Stringresult = builder.toString();文章源自略懂百科-http://wswcn.cn/97389.html

StringBuilder提供了丰富而全面的方法,包括insert()、replace()、substring(),甚至还有reverse(),但是最常用的还是append()和toString()。还有delete()。文章源自略懂百科-http://wswcn.cn/97389.html

4 总结

String 是只读字符串,它是一个对象。每次+操作隐式在堆上new了一个跟原来字符串相同的StringBuilder对象,在调用append方法拼接+后面的字符串。在使用过程中在细节上要注意效率问题,例如恰当地使用StringBuilder等。文章源自略懂百科-http://wswcn.cn/97389.html

我们都知道Java源自于C++,Java设计者认为C++允许编程人员任意重载操作符是一个很复杂的过程,所以没有纳入到Java中。然而就像现在看到的Python和C,它们都有垃圾回收机制,操作符重载也简单易懂。所以说在Java中使用操作符重载也并非想象中那么复杂。这也是软件设计中的一个教训:除非你用代码将系统实现,并让它运行起来,否则你无法真正了解它会有什么问题。文章源自略懂百科-http://wswcn.cn/97389.html

5 最后的最后

为初学者提供学习指南,为从业者提供参考价值。我坚信码农也具有产生洞见的能力。关注【码农洞见】,一起学习和交流吧!文章源自略懂百科-http://wswcn.cn/97389.html

文章源自略懂百科-http://wswcn.cn/97389.html

懵懂先生
  • 本文由 发表于 2023年2月27日 14:54:21
  • 转载请注明:http://wswcn.cn/97389.html
投稿文章

香皂掉马桶里堵住了怎么办

什么是人生?答案可以形而上同样也可以形而下,于是有人说人生就是吃喝拉撒睡。也许话听起来有点粗俗,但有它的道理。马桶跟人们的拉撒有着密切的联系,它给人们带来方便的同时也伴随着一些烦恼,马桶堵了想必是很多...
投稿文章

小鸡蚂蚁庄园偷吃规律(速览蚂蚁庄园玩法新规)

们在给我们的小鸡喂食后,一般就会离开。离开后,总是有其他家的小鸡来偷吃饲料,特别是总被一只小鸡偷吃,是不是很想把他们胖揍一顿呢?那么,接下来看看蚂蚁庄园怎么揍偷吃的小鸡? 蚂蚁庄园怎么揍偷吃的小鸡 打...
投稿文章

好文:杰字取名寓意

杰字在男孩的名字里非常常见,父母对孩子给予厚望,希望孩子能成为人杰,就喜欢给孩子取这个名字。 不少男明星的名字里都有这个字,比如李连杰、周杰伦、张杰等,他们在自己擅长的领域上,也的确做出了一番事业,不...
投稿文章

电视剧人鱼小姐剧情简介(人鱼小姐剧情简介)

《人鱼小姐》—— 这是我最爱的韩剧三经典之一,能把恩怨情仇演绎得如此细腻深刻,我个人觉得也就是这部《人鱼小姐》了! 能勾上关系的老中青18位演员组成这部经典的主创框架,无论主配,每个人的表演都非常真实...