浅析Java的字符串的底层和相关知识(恳请大佬指正)

本期经验和建议的总结:

在拼接字符串的时候,如果大量拼接时建议使用StringBuilder,在转为字符串。

1:Java的==号比较的原理:

在Java中,==号在对基本数据类型进行比较时,比较的时具体的数值大小例如double,int之流。
在针对引用数据类型的比较中,我们发现比较的是引用数据类型的地址是否相同,所以我们在比较引用数据类型的对象是否相等时,基本上要使用equals方法,在这里我们记得要重写equals方法。

2:字符串的拼接原理

在这里我们分成两种情况来讲,分别是常量直接的拼接变量加常量的拼接

常量的直接拼接:

举例子:在这里插入图片描述
在这里我们使用常量进行的拼接,他会直接在串池里进行拼接出现,如果串池里有现成的就复用,而不是直接新建。举个例子和代码:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.Scanner;

public class Main3 {
    public static void main(String[] args) throws IOException {
        Scanner sc=new Scanner(System.in);
     String a="a"+"b"+"c";
     String b="abc";
     String c="a"+"b"+"c";
        System.out.println(a==b);
        System.out.println(b==c);
        System.out.println(a==c);

    }


}


在这里插入图片描述
我们可以清楚的看到,字符串a拼接在串池里留下了abc,而b等于abc,由于也是常量拼接,所以直接复用串池的abc,字符串c的也是同理,他们会看看串池里是否有已经出现abc,已经出现就直接复用,为出现就自己开一块内存进行存储。
在这里插入图片描述
在这里插入图片描述

继续看以上字符串d就是abd之前未在串池留下,无法复用,所以==号比较地址的时候地址不同,返回false,而之前的哪个等于号比较地址返回true就是说明他们的地址相同,这也证实了我们的字符串复用的观点。

变量的拼接:

变量的拼接就是直接地址不同了,在这里简单来聊一下拼接的底层处理过程吧。
在jdk8以前的版本,使用字符串变量的拼接

 String d="abd";
     String e=d+"12";

过程中,他会首先在底层内存中首先开一个StringBuilder,然后将数据在这个字符串容器中进行拼接,之后再开一个字符串对象返回这个字符串对象。我们可以看到在jdk8以前字符串的拼接是耗时耗力的。那JDK8以后呢?
在JDK8以后,不在直接开StringBuilder的对象了,而是直接在内存中开一个数组,来预估要拼接的字符串的大小,返回一个新的字符串。我们看到,在这里空间开销变小了,但是预估拼接的字符的大小仍然要花费大量的时间(多个拼接),所以使用+号拼接效率不高。
所以在处理时建议使用StringBuilder。

3:StringBuilder的存储拼接字符的原理

首先,它StringBuilder默认的存储容量是16,存储16个字符,一旦超过16这个数,他会开到34,但是超过34就是直接你存储的字符是多少位,它就开多少位了。

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值