String和StringBuilder

一、String

package com.javabase;

public class Test {
    /*
    String类代表字符串,所有双引号字符串,都是String类的对象
    特点:1、字符串不可变,它的值在创建后不能被更改,但可以被共享
         2、字符串效果上相当于字符数组(char[]),但底层原理是字节数组(byte[])
            JDK8及之前是字符数组,从9开始是字节数组
     */
    public static void main(String[] args) {
        //可以创建一个空白字符串对象,不含任何内容
        String s1 = new String();
        System.out.println("s1:" + s1);
        
        //如下三种结果虽然输出内容都是abc,但是前两个创建的对象各是各的,在堆中有不同的地址
        //第三种直接赋值(推荐)的方式,都是直接指向堆中常量池中的“abc”,因此地址相同
        //通过字符数组创建字符串对象
        char[] chs = {'a', 'b', 'c'};
        String s2 = new String(chs);
        System.out.println("s2:" + s2);
        //通过字节数组创建字符串对象
        byte[] bys = {97, 98, 99};//分别是a b c的ASCII码
        String s3 = new String(bys);
        System.out.println("s3:" + s3);
        //通过直接赋值创建字符串对象
        String s4 = "abc";
        String s5 = "abc";

        //字符串的比较:
        //1、地址的比较:
        if(s1==s2 || s1==s3 || s2==s3){
            System.out.println("s1 s2 s3存在地址相同");
        }else{System.out.println("s1 s2 s3不存在地址相同");}
        if(s4==s5){
            System.out.println("s4 s5地址相同");
        }else{ System.out.println("s4 s5地址不同");}

        //2、字符串的内容相同
        if(s1.equals(s2) || s1.equals(s3) || s2.equals(s3)){
            System.out.println("s1 s2 s3存在内容相同");
        }else{System.out.println("s1 s2 s3不存在内容相同");}

        if(s4.equals(s5)){
            System.out.println("s4 s5内容相同");
        }else{System.out.println("s4 s5内容不同");}
    }

}

二、StringBuilder

package com.javabase;

public class Test {
    /*
    在字符串的拼接操作中,以s1(hello) 和 s2(100) 拼接为例,堆内存中的操作为:
    1、常量池中分配hello的地址001,"100"的地址002,额外需要分配003的内存地址存储最后结果。
        实际只需要003的内存地址就行,所以001和002地址浪费了。
    StringBuilder解决这个问题:StringBuilder是内容&长度可变的字符串类,可看成容器

     */
    public static void main(String[] args) {
        //通过StringBuilder的构造方法可以创建空白(无参)和有内容及对应长度的字符串
        StringBuilder sb1 = new StringBuilder();
        StringBuilder sb2 = new StringBuilder("hello");
        System.out.println("sb1:" + sb1 + ", sb1.length:" + sb1.length());
        System.out.println("sb2:" + sb2 + ", sb2.length:" + sb2.length());

        //StringBuilder添加
        //链式编程,等价于连写三行append
        sb2.append(1).append(0).append(0);
        System.out.println("sb2:" + sb2 + ", sb2.length:" + sb2.length());

        //StringBuilder反转,reverse方法
        sb2.reverse();
        System.out.println("sb2:" + sb2 + ", sb2.length:" + sb2.length());


        /*
        StringBuilder -> String: toString()
        反之,通过把String当成StringBuilder的参数,通过构造方法实现
         */
        //将刚才翻转后的sb2 : 001elleh 通过toString()方法转换为String
        String s = sb2.toString();
        System.out.println("s:" + s + ", s.length:" + s.length());

        //将s通过StringBuilder带参的构造方法转换为StringBuilder
        StringBuilder sb3 = new StringBuilder(s);
        System.out.println("sb3:" + sb3 + ", sb3.length:" + sb3.length());
    }
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值