大数据必学Java基础(五十):String类和StringBuilder类的讲解

Posted Lansonli

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了大数据必学Java基础(五十):String类和StringBuilder类的讲解相关的知识,希望对你有一定的参考价值。

文章目录

String类和StringBuilder类的讲解

一、String类

1、常用方法

2、String的内存分析

二、StringBuilder类

1、解释可变和不可变字符串

2、常用方法

三、String,StringBuilder,StringBuffer区别和联系


String类和StringBuilder类的讲解

一、String类

【1】直接使用,无需导包:

 

【2】形象说一下字符串:  

 

 

【3】 "abc"就是String类下的一个具体的对象  

String str = “abc”;

 

【4】字符串是不可变的

【5】这个String类不可以被继承,不能有子类

 

【6】String底层是一个char类型的数组

验证:

 

1、常用方法

【1】构造器:底层就是给对象底层的value数组进行赋值操作。

//通过构造器来创建对象:
       String s1 = new String();
       String s2 = new String("abc");
       String s3 = new String(new char[]'a','b','c');

【3】常用方法

String s4 = "abc";
        System.out.println("字符串的长度为:"+s4.length());

        String s5 = new SZtring("abc");
        System.out.println("字符串是否为空:"+s5.isEmpty());

        System.out.println("获取字符串的下标对应的字符为:"+s5.charAt(1));

【4】equals

String s6 = new String("abc");
String s7 = new String("abc");
System.out.println(s6.equals(s7));

【5】String类实现了Comparable,里面有一个抽象方法叫compareTo,所以String中一定要对这个方法进行重写:4  

String s8 = new String("abc");
String s9 = new String("abc");
System.out.println(s8.compareTo(s9));

【6】常用方法:  

//字符串的截取:
String s10 = "abcdefhijk";
System.out.println(s10.substring(3));
System.out.println(s10.substring(3, 6));//[3,6)
//字符串的合并/拼接操作:
System.out.println(s10.concat("pppp"));
//字符串中的字符的替换:
String s11 = "abcdeahija";
System.out.println(s11.replace('a', 'u'));
//按照指定的字符串进行分裂为数组的形式:
String s12 = "a-b-c-d-e-f";
String[] strs = s12.split("-");
System.out.println(Arrays.toString(strs));
//转大小写的方法:
String s13 = "abc";
System.out.println(s13.toUpperCase());
System.out.println(s13.toUpperCase().toLowerC
//去除收尾空格:
String s14 = "    a  b  c    ";
System.out.println(s14.trim());
//toString()
String s15 = "abc";
System.out.println(s15.toStr
//转换为String类型:
System.out.println(String.valueOf(false));

 

2、String的内存分析

【1】字符串拼接:

public class Test02 
    //这是一个main方法,是程序的入口:
    public static void main(String[] args) 
        String s1 = "a"+"b"+"c";
        String s2 = "ab"+"c";
        String s3 = "a"+"bc";
        String s4 = "abc";
        String s5 = "abc"+"";
    

 上面的字符串,会进行编译器优化,直接合并成为完整的字符串,我们可以反编译验证: 

然后在常量池中,常量池的特点是第一次如果没有这个字符串,就放进去,如果有这个字符串,就直接从常量池中取:

内存:

【2】new关键字创建对象:

String s6 = new String("abc");

内存:开辟两个空间(1.字符串常量池中的字符串 2.堆中的开辟的空间)

 【3】有变量参与的字符串拼接:

public class Test03 
    //这是一个main方法,是程序的入口:
    public static void main(String[] args) 
        String a = "abc";
        String b = a + "def";
        System.out.println(b);
    

a变量在编译的时候不知道a是“abc”字符串,所以不会进行编译期优化,不会直接合并为“abcdef”

反汇编过程:为了更好的帮我分析字节码文件是如何进行解析的:

利用IDEA中的控制台:

二、StringBuilder类

【1】字符串的分类

(1)不可变字符串:String

(2)可变字符串:StringBuilder,StringBuffer

疑问:

(1)可变不可变??

(2)本节课重点:StringBuilder   -----》√

(3)StringBuilder和StringBuffer区别  ??

【2】StringBuilder底层

非常重要的两个属性:

 

【3】对应内存分析:  

package com.lanson.test05;

/**
 * @Auther: lanson
 */
public class Test01 
    //这是一个main方法,是程序的入口:
    public static void main(String[] args) 
        //创建StringBuilder的对象:
        StringBuilder sb3 = new StringBuilder();
        //表面上调用StringBuilder的空构造器,实际底层是对value数组进行初始化,长度为16
        StringBuilder sb2 = new StringBuilder(3);
        //表面上调用StringBuilder的有参构造器,传入一个int类型的数,实际底层就是对value数组进行初始化,长度为你传入的数字
        StringBuilder sb = new StringBuilder("abc");
        System.out.println(sb.append("def").append("aaaaaaaa").append("bbb").append("ooooooo").toString());;//链式调用方式:return this

    

 

 

1、解释可变和不可变字符串

【1】String---》不可变

【2】StringBuilder---》可变

可变,在StringBuilder这个对象的地址不变的情况下,想把“abc”变成“abcdef”是可能的,直接追加即可

public class Test02 
    //这是一个main方法,是程序的入口:
    public static void main(String[] args) 
        StringBuilder sb = new StringBuilder();

        System.out.println(sb.append("abc")==sb.append("def"));//true
    

 2、常用方法

【1】StringBuilder常用方法:

package com.lanson.test05;

/**
 * @Auther: lanson
 */
public class Test03 
    //这是一个main方法,是程序的入口:
    public static void main(String[] args) 
        StringBuilder sb=new StringBuilder("nihaojavawodeshijie");
        //增
        sb.append("这是梦想");
        System.out.println(sb);//nihaojavawodeshijie这是梦想
        //删
        sb.delete(3, 6);//删除位置在[3,6)上的字符
        System.out.println(sb);//nihavawodeshijie这是梦想

        sb.deleteCharAt(16);//删除位置在16上的字符
        System.out.println(sb);//nihavawodeshijie是梦想

        //改-->插入
        StringBuilder sb1=new StringBuilder("$23445980947");
        sb1.insert(3, ",");//在下标为3的位置上插入 ,
        System.out.println(sb1);
        StringBuilder sb2=new StringBuilder("$2你好吗5980947");
        //改-->替换
        sb2.replace(3, 5, "我好累");//在下标[3,5)位置上插入字符串
        System.out.println(sb2);
        sb.setCharAt(3, '!');
        System.out.println(sb);
        //查
        StringBuilder sb3=new StringBuilder("asdfa");
        for (int i = 0; i < sb3.length(); i++) 
            System.out.print(sb3.charAt(i)+"\\t");
        
        System.out.println();
        //截取
        String str=sb3.substring(2,4);//截取[2,4)返回的是一个新的String,对StringBuilder没有影响
        System.out.println(str);
        System.out.println(sb3);
    

【2】StringBuffer常用方法:

package com.lanson.test05;

/**
 * @Auther: lanson
 */
public class Test03 
    //这是一个main方法,是程序的入口:
    public static void main(String[] args) 
        StringBuffer sb=new StringBuffer("nihaojavawodeshijie");
        //增
        sb.append("这是梦想");
        System.out.println(sb);//nihaojavawodeshijie这是梦想
        //删
        sb.delete(3, 6);//删除位置在[3,6)上的字符
        System.out.println(sb);//nihavawodeshijie这是梦想

        sb.deleteCharAt(16);//删除位置在16上的字符
        System.out.println(sb);//nihavawodeshijie是梦想

        //改-->插入
        StringBuilder sb1=new StringBuilder("$23445980947");
        sb1.insert(3, ",");//在下标为3的位置上插入 ,
        System.out.println(sb1);
        StringBuilder sb2=new StringBuilder("$2你好吗5980947");
        //改-->替换
        sb2.replace(3, 5, "我好累");//在下标[3,5)位置上插入字符串
        System.out.println(sb2);
        sb.setCharAt(3, '!');
        System.out.println(sb);
        //查
        StringBuilder sb3=new StringBuilder("asdfa");
        for (int i = 0; i < sb3.length(); i++) 
            System.out.print(sb3.charAt(i)+"\\t");
        
        System.out.println();
        //截取
        String str=sb3.substring(2,4);//截取[2,4)返回的是一个新的String,对StringBuilder没有影响
        System.out.println(str);
        System.out.println(sb3);
    

三、String,StringBuilder,StringBuffer区别和联系

  • String类是不可变类,即一旦一个String对象被创建后,包含在这个对象中的字符序列是不可改变的,直至这个对象销毁。
  • StringBuffer类则代表一个字符序列可变的字符串,可以通过append、insert、reverse、setChartAt、setLength等方法改变其内容。一旦生成了最终的字符串,调用toString方法将其转变为String
  • JDK1.5新增了一个StringBuilder类,与StringBuffer相似,构造方法和方法基本相同。不同是StringBuffer是线程安全的,而StringBuilder是线程不安全的,所以性能略高。通常情况下,创建一个内容可变的字符串,应该优先考虑使用StringBuilder

StringBuilder:JDK1.5开始  效率高   线程不安全

      StringBuffer:JDK1.0开始   效率低    线程安全


  • 📢博客主页:https://lansonli.blog.csdn.net
  • 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!
  • 📢本文由 Lansonli 原创,首发于 CSDN博客🙉
  • 📢停下休息的时候不要忘了别人还在奔跑,希望大家抓紧时间学习,全力奔赴更美好的生活✨

以上是关于大数据必学Java基础(五十):String类和StringBuilder类的讲解的主要内容,如果未能解决你的问题,请参考以下文章

大数据必学Java基础(五十七):Set接口讲解

大数据必学Java基础(五十三):Colletion接口

大数据必学Java基础(五十二):集合的深入了解

大数据必学Java基础(五十九):Map接口源码部分

大数据必学Java基础(五十四):List接口深入了解

大数据必学Java基础(五十六):LinkedList实现类的使用