2021-04-27

有关String中字符串拼接

1.字符串常量拼接

String str1="Hello"+" world";
String str2="Hello world";
System.out.println(str3==str4);//true

上面是字符串常量拼接的例子:在编译时,JVM编译器对字符串做了优化,str1就被优化成"Hello world",str1和str2指向字符串常量池同一个字符串变量,所以结果为true。

2.字符串常量+字符串变量、字符串变量之间的拼接

String str5="Hello";
String str6=" world";
Stirng str7="Hello world";
String str8=str5+" world";
System.out.println(str7==str8);//false

String通过+号来拼接字符串的时候,如果有字符串变量参与,实际上底层会转成通过StringBuilder的append()方法来实现,大致过程如下:

StringBuilder sb=new StringBuilder();
sb.append(str5);
sb.append(" world");
str8=sb.toString();

StirngBuilder的toString()方法底层new了一个String对象,所以str8在堆内存中重新开辟了新空间,而str7指向常量池,所以str7==str8为false。
变量字符串拼接和常量字符串拼接结果是不一样的。因为变量字符串拼接是会先开辟空间,然后再拼接。


基本概念

字符串不变性:String是常量,是Java中一个不可变的类,其对象一旦被创建就不能再被改变,换句话说,每一个看起来被修改的值,实际上都是创造了一个全新的String对象 。

使用+拼接字符串的实现原理:

String对象后面跟着一个 “+” 时,不管 “+” 后面的是什么数据(可能不是Strig对象),都会转换为字符串。转换时是通过调用该对象的toString()方法。string + 其实是由 stringbuilder 的 append()方法 完成的。编译器使用 append() 方法追加后用 toString() 转换成 String字符串(自动转换,不需要重写toString()方法),也就说 str +=”b” 等同于
str = new StringBuilder(str).append(“b”). toString() ;

它变慢的关键原因就在于new StringBuilder()和toString(),这里可是创建了10W个StringBuilder对象,而且每次还需要将其转换成 String 。

同时,当使用 “+” 拼接字符串时,会生成新的String对象,而不是向原有的String对象追加内容,故 效率较低。

String wechat = “Hollis”;

String introduce = “每日更新Java相关技术文章”;

String hollis = wechat + “,” + introduce;

反编译后的内容如下,反编译工具为jad。

String wechat = “Hollis”; String introduce = “每日更新Java相关技术文章”;

String hollis = (new StringBuilder()).append(wechat).append(",").append(introduce).toString();

通过查看反编译以后的代码,我们可以发现,原来字符串常量在拼接过程中,是将String转成了StringBuilder后,使用其append方法进行处理的。那么也就是说,Java中的+对字符串的拼接,其实现原理是使用StringBuilder.append。

concat是如何实现的

当两个量都为String类型且值不为null时,可以用concat方式。

我们再来看一下concat方法的源代码,看一下这个方法又是如何实现的。

public String concat(String str) {

   int otherLen = str.length();

   if (otherLen == 0) {

         return this;

        }

  int len = value.length; char buf[] = Arrays.copyOf(value, len + otherLen);

  str.getChars(buf, len); return new String(buf, true);

}

这段代码首先创建了一个字符数组,长度是已有字符串和待拼接字符串的长度之和,再把两个字符串的值复制到新的字符数组中,并使用这个字符数组创建一个新的String对象并返回。通过源码我们也可以看到,经过concat方法,其实是new了一个新的String,这也就呼应到前面我们说的字符串的不变性问题上了。

append 方式

StringBuilder 类和 StringBuffer 类使用 append() 方法追加字符串,向 原有对象 追加而 不 是 新建 对象,toString()方法返回String类对象。
StringBuilder 和 StringBuffe r的主要区别:StringBuffer 是线程 安全 的, StringBuilder效率 更高。

( 关于字符串,Java中除了定义了一个可以用来定义字符串常量的String类以外,还提供了可以用来定义字符串变量的StringBuffer类,它的对象是可以扩充和修改的。使用StringBuffer可以方便的对字符串进行拼接)

对于三者 运行效率而言,append() 速度最快,concat() 次之,+ 最慢。但是当 “+” 拼接时 ,连接的是常量时,编译器在编译期就完成了这个运算,效率高。

**对于三者使用的总结:
** 1.如果要操作少量的数据且在字符串 不 经常 变化 的场景中用 : String+

2.单线程操作字符串缓冲区下 频繁 操作 大 量数据 :StringBuilder

3.多线程操作字符串缓冲区下 频繁 操作 大 量数据 :StringBuffer

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
本火锅店点餐系统采用Java语言和Vue技术,框架采用SSM,搭配Mysql数据库,运行在Idea里,采用小程序模式。本火锅店点餐系统提供管理员、用户两种角色的服务。总的功能包括菜品的查询、菜品的购买、餐桌预定和订单管理。本系统可以帮助管理员更新菜品信息和管理订单信息,帮助用户实现在线的点餐方式,并可以实现餐桌预定。本系统采用成熟技术开发可以完成点餐管理的相关工作。 本系统的功能围绕用户、管理员两种权限设计。根据不同权限的不同需求设计出更符合用户要求的功能。本系统中管理员主要负责审核管理用户,发布分享新的菜品,审核用户的订餐信息和餐桌预定信息等,用户可以对需要的菜品进行购买、预定餐桌等。用户可以管理个人资料、查询菜品、在线点餐和预定餐桌、管理订单等,用户的个人资料是由管理员添加用户资料时产生,用户的订单内容由用户在购买菜品时产生,用户预定信息由用户在预定餐桌操作时产生。 本系统的功能设计为管理员、用户两部分。管理员为菜品管理、菜品分类管理、用户管理、订单管理等,用户的功能为查询菜品,在线点餐、预定餐桌、管理个人信息等。 管理员负责用户信息的删除和管理,用户的姓名和手机号都可以由管理员在此功能里看到。管理员可以对菜品的信息进行管理、审核。本功能可以实现菜品的定时更新和审核管理。本功能包括查询餐桌,也可以发布新的餐桌信息。管理员可以查询已预定的餐桌,并进行审核。管理员可以管理公告和系统的轮播图,可以安排活动。管理员可以对个人的资料进行修改和管理,管理员还可以在本功能里修改密码。管理员可以查询用户的订单,并完成菜品的安排。 当用户登录进系统后可以修改自己的资料,可以使自己信息的保持正确性。还可以修改密码。用户可以浏览所有的菜品,可以查看详细的菜品内容,也可以进行菜品的点餐。在本功能里用户可以进行点餐。用户可以浏览没有预定出去的餐桌,选择合适的餐桌可以进行预定。用户可以管理购物车里的菜品。用户可以管理自己的订单,在订单管理界面里也可以进行查询操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值