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

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开始 效率低 线程安全

相关文章

本文从从Bitcask存储模型讲起,谈轻量级KV系统设计与实现。从...
内部的放到gitlab pages的博客,需要统计PV,不蒜子不能准确...
PCM 自然界中的声音非常复杂,波形极其复杂,通常我们采用的...
本文介绍如何离线生成sst并在线加载,提供一种用rocksdb建立...
验证用户输入是否正确是我们应用程序中的常见功能。Spring提...
引入pdf2dom &lt;dependency&gt; &lt;groupId&a...