前言String是一种特殊的对象,属于引用类型。一旦创建并初始化,就不能更改。由于String对象是不可变的,因此可以共享。定义从概念上讲,Java字符串是Unicode字符的序列。标准Java类库中提供了一个预定义的类String。String是用双引号括起来的几个字符,每个用双引号括起来的字符串都是String类的一个实例:Strings="abc";字符串对象是不可变的。查看JDK文档,你会发现String类中每一个看似修改String值的方法,实际上都会创建一个全新的String对象来包含修改后的字符串内容。原始String对象保持不变。看看下面的代码:publicclassUser{publicstaticStringupcase(Strings){returns.toUpperCase();}publicstaticvoidmain(String[]args){Stringname="manoninsight";Stringname1=upcase(名字);System.out.println(name1);System.out.println(名字);}}输出:MANONISIGHTmanoninsight当名称传递给upcase()方法时,实际传递的是引用的副本。事实上,每当一个String对象被用作方法参数时,都会复制一个引用,而该引用所指向的对象实际上一直停留在一个单一的物理位置,从未移动过。回到upcase()的定义,传入它的引用名字为s,本地引用s只在upcase()运行时存在。一旦upcase()完成运行,s就会消失。当然,upcase()的返回值其实是对最终结果的引用。这足以说明upcase()返回的引用已经指向了一个新对象,而名称仍在原来的位置。对于一个方法来说,参数是为方法提供信息,而不是让方法改变自己。阅读这段代码时,读者自然会有这样的感受。这一点很重要,正是这种保证使得代码易于编写和阅读。小细节:我们知道String是一个对象,但是我们前面说过对象是通过new关键字创建的,但是我们在创建String的时候写:Strings="abc";insteadofStrings=newString("abc");Strings=newString("abc");创建两个对象1、在字符串池中创建一个对象(这个对象不能重复)2、用new创建一个对象Java运行环境有一个字符串池,由String类维护,当执行语句Strings="abc"时,首先检查字符串池中是否存在字符串"abc",如果存在,直接赋值"abc"给s,如果不存在,先在字符串池"abc"中新建一个字符串再赋值给s。当执行语句Strings=newString("abc")时,不管字符串"abc"是否存在"存在于字符串池中,直接新建一个字符串"abc"(注意:新建的字符串"abc"不在字符串池中),然后支付给s。重载String的不可变性会带来一定的效率问题。一个例子是为String对象重载的+运算符。重载意味着运算符在特定类中使用时被赋予特殊含义。运算符+可用于连接字符串:publicstaticvoidmain(String[]args){Stringname="CodeFarmInsights";字符串年龄=30;Strings="姓名:"+姓名+"年龄:"+年龄;System.out.println(s);}想象一下这段代码是这样工作的:String可能有一个append()方法,该方法生成一个新的String对象,其中包含“namge:”并在字符串后连接名称。然后该对象创建另一个新的String对象,然后将其与“age:”连接以产生另一个新对象,依此类推。这种做法当然是可行的,但是为了生成最终的String对象,会生成很多需要垃圾回收的中间对象。我想这就是Java设计者首先所做的(这也是软件设计的一个教训:除非你用代码实现它并让它工作,否则你无法真正知道系统出了什么问题),然后是它们的性能发现比较穷。为了解决这个问题,在JDK5.0中引入了StringBuilder类。在此之前,使用的是StringBuffer。后者是线程安全的,所以开销会更高。使用StringBuilder进行字符串操作要快一些。如果您需要从许多小的字符串中构建一个字符串,您应该按照以下步骤操作。首先,构建一个空字符串构建器:StringBuilderbuilder=newStringBuilder();每次需要添加部件时都会调用append方法。builder.append("abc");builder.append("123");...当需要构建字符串时调用toString方法,会得到一个包含构建器中字符序列的String对象。字符串结果=builder.toString();StringBuilder提供了丰富而全面的方法,包括insert()、replace()、substring(),甚至还有reverse(),但最常用的是append()和toString()。并删除()。SummaryString是一个只读字符串,它是一个对象。每一次+操作都会在堆上隐式创建一个与原字符串相同的新StringBuilder对象,并调用append方法拼接+后的字符串。在使用过程中细节上要注意效率问题,比如适当使用StringBuilder。我们都知道Java是从C++派生出来的。Java设计者认为,C++允许程序员任意重载运算符是一个非常复杂的过程,因此没有包含在Java中。不过,就像现在看到的Python和C#一样,它们都有垃圾回收机制,运算符重载也简单易懂。所以在Java中使用运算符重载并没有想象的那么复杂。这也是软件设计中的一个教训:在用代码实现并使其运行之前,您无法真正知道系统出了什么问题。最后一篇为初学者提供学习指南,对从业者有参考价值。我坚信编码员也有能力产生洞察力。扫描下方二维码关注、学习、交流!
