JAVA第二周学习笔记-字符串

时间:2024-05-02 15:42:53

创建Sting对象

  1. 直接赋值

    String name = "xuanxuan";
    
  2. new

    构造方法 说明
    public String( ) 无参构造方法,创建一个空字符串对象
    public String(String original) 创建一个与原始字符串内容相同的新字符串对象
    public String(char[ ] chs) 创建一个包含字符数组内容的字符串对象
    public String(byte[ ] chs) 创建一个使用指定字符集编码的字符串对象

    举例:

public class StringDemo {
    public static void main(String[] args) {
        String name1 = "xuan";
        System.out.println(name1);

        String name2 = new String();
        name2 = "xuan";
        System.out.println(name2);

        String name3 = new String("xuan");
        System.out.println(name3);

        char chs[]={'x','u','a','n'};
        String name4 = new String(chs);
        System.out.println(name4);

        byte bytes[]={97,98,99,100};
        String name5 = new String(bytes);
        System.out.println(name5);

    }
}

存储的内存原理

StringTable串池

String 类中的字符串池(String Pool)是一种特殊的存储区域,用于存储字符串常量。它位于堆内存中,并且被所有线程共享。字符串池的主要作用是提高字符串的重用性,避免在内存中重复创建相同内容的字符串,从而节省内存空间。

使用双引号直接创建字符串时,系统会检查该字符串在串池中是否存在:

  • 不存在:创建新的

  • 存在:复用

String s1 = "Hello"; // 创建一个字符串对象,放入字符串池中
String s2 = "Hello"; // 直接从字符串池中获取已存在的字符串对象
  • 通过 new 关键字创建的字符串对象不会放入字符串池中,而是在堆内存中创建一个新的字符串对象

    即使字符串池中已经存在字符串,系统也会在堆内存中创建一个新的字符串对象,而不会复用字符串池中的对象。

常用方法

字符串比较

==对于基本数据类型比较数据值,对于引用数据类型比较地址值

字符串内容比较:

  1. boolean equals:完全一样返回true
  2. boolean equalsIgnoreCase:忽略大小写

键盘输入的也是new出来的

字符串遍历

  1. public char charAt(int index):根据索引返回字符
  2. public int length():返回字符串长度

数组名.length

字符串对象.length()

字符串截取

  1. String substring(int beginIndex,int endIndex):返回值是截取的小串,包左不包
  2. String substring(int beginIndex):截取到

字符串替换

  1. String replace(旧值,新值):返回值是替换后结果

SpringBulider

当对字符串进行修改的时候,需要使用 StringBuffer 和 StringBuilder 类。

和 String 类不同的是,StringBuffer 和 StringBuilder 类的对象能够被多次的修改,并且不产生新的未使用对象。

StringBuilder可以看做一个容器(一个动态大小的字符数组)。

StringBuilder 允许修改字符串内容,而不会产生新的字符串对象,从而提高了字符串操作的效率。

构造方法

方法名 说明
public StringBuilder() 才能构建一个空白可变字符的对象,不含有任何内容
public StringBuilder(String str) 根据字符串内容,来创建可变字符串对象
StringBuilder(int capacity) 创建一个具有指定初始容量的StringBuilder对象。

常用方法

方法名 说明
public StringBuilder append(任意类型) 添加数据,返回对象本身
public StringBuilder reverse() 翻转容器中的内容
public int length() 返回长度
public Sting toString() 通过该方法实现把StringBuilder转换为String

链式编程

链式编程是一种编程风格,它允许在同一个对象上通过多个方法的调用链实现一系列操作。

从而简化代码,提高可读性,和代码的可维护性。

这有一个反转字符串的示例,使用了链式编程

package com.feng;

import java.util.Scanner;

public class ReverseString {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String str = sc.next();
        StringBuilder sb = new StringBuilder();

        String ret = sb.append(str).reverse().toString();

        System.out.println(ret);

    }
}

StringJoiner

使用 StringJoiner 可以指定分隔符,并向其中添加多个字符串,最后得到一个拼接好的字符串。它的构造方法可以接受分隔符、前缀和后缀作为参数,用于指定拼接的格式。

构造方法

方法名 说明
StringJoiner(分隔符号) 创建一个StringJoiner对象,使用指定间隔符号
StringJoiner(分隔符号,开始符号,结束符号) 创建一个StringJoiner对象,使用指定间隔符号,开始符号,结束符号

成员方法

方法名 说明
public StringJoiner add(添加内容) 添加数据,返回对象本身
public int length() 返回长度
public String toString() 获取拼接器中的字符串表示,包括前缀、元素和后缀

字符串原理

拼接

如果没有变量参与,都是字符串直接相加,编译之后就是拼接之后的结果,会复用串池中的字符串。

如果有变量

JDK8以前:系统底层会自动创建一个StringBuilder对象,然后再调用其append方法完成拼接。
拼接后,再调用其toString方法转换为String类型,而toString方法的底层是直接new了一个字符串对象
JDK8版本:系统会预估要字符串拼接之后的总大小,把要拼接的内容都放在数组中,此时也是产生一个新的字符串。

StringBuilder源码分析

  • 默认创建一个长度为16的字节数组

  • 添加的内容长度小于16,直接存

    添加的内容大于16会扩容(原来的容量 * 2 + 2)

  • 如果扩容之后还不够,以实际长度为准

有效地减少频繁扩容带来的性能开销,并且在大部分情况下能够保证足够的容量来存储字符串内容