字符串相关的类

目录

String类:

String的特性:

字符串的创建方式:

创建字符串最简单的方式如下:

用构造函数创建字符串:

常量池:

对象中的字符串是怎么储存的:

String使用陷阱:

String常用方法:

练习1:

练习二:

练习三:

String相关算法题与面试题:

StringBuffer与StringBuilder:

StringBuffer:

联系

面试题:对比String、StringBuffer、StringBuilder

注意:

面试题:

引用:


String类:

String的特性:

  1. String类:代表字符串。Java 程序中的所有字符串字面值(如 "abc" )都作为此类的实例实现。
  2. String是一个final类,代表不可继承。
  3. 字符串是常量,用双引号引起来表示。String的值在创建之后不能更改。
  4. String对象的字符内容是存储在一个字符数组value[]中的。注意char数组是final的,不可更改
    1. 不可更改体现:如果字符串初始化后,再次赋值,会重新new一个Sting,变相用一个不同的char数组来存储新的值
public final class Stringimplements java.io.Serializable, Comparable, CharSequence {
    /** The value is used for character storage. */
    private final char value[];
    /** Cache the hash code for the string */
    private int hash; // Default to 0

字符串的创建方式:

创建字符串最简单的方式如下:

String str = "Runoob";

在代码中遇到字符串常量时,这里的值是 "Runoob",编译器会使用该值创建一个 String 对象。

和其它对象一样,可以使用关键字和构造方法来创建 String 对象。

用构造函数创建字符串:

String str2=new String("Runoob");

String 创建的字符串存储在公共池中,而 new 创建的字符串对象在堆上:

String s1 = "Runoob";              // String 直接创建
String s2 = "Runoob";              // String 直接创建
String s3 = s1;                    // 相同引用
String s4 = new String("Runoob");   // String 对象创建
String s5 = new String("Runoob");   // String 对象创建

字符串相关的类_第1张图片

常量池:

字符串用等号赋值时,会在常量池中生成(编译时就已经确定)。此时存在方法区中。

字符串相关的类_第2张图片

比如上图

  1. String s1 = "abc"; 将s1指向方法区常量池的"abc"常量
  2. String s2 = "abc"; 将s2指向方法区常量池的"abc"常量(同一个常量)
  3. s1 = "hello"; 此时字符串用等号赋值发生了改变,s1不在指向“abc”,而是指向另一个常量

对象中的字符串是怎么储存的:

class Person {
    String name;
    int age;
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
}
public class Main {
    public static void main(String[] args) {
        Person p1 = new Person("Tom",18);
        Person p2 = new Person("Tom",18);
        System.out.println(p1==p2);//false
        System.out.println(p1.name == p2.name);//true;
    }
}

字符串相关的类_第3张图片

String使用陷阱:

String s1 = "a";

说明:在字符串常量池中创建了一个字面量为"a"的字符串。

s1 = s1 + "b";

说明:s1是变量,只有全是常量的赋值,才会在存储常量池中。实际上原来的“a”字符串对象已经丢弃了,现在在堆空间中产生了一个字符串s1+"b"(也就是"ab")。如果多次执行这些改变串内容的操作,会导致大量副本字符串对象存留在内存中,降低效率。如果这样的操作放到循环中,会极大影响程序的性能。

String s2 = "ab";

说明:直接在字符串常量池中创建一个字面量为"ab"的字符串。

String s3 = "a" + "b";

说明:s3指向字符串常量池中已经创建的"ab"的字符串。

String s4 = s1.intern();

说明:堆空间的s1对象在调用intern()之后,会将常量池中已经存在的"ab"字符串赋值给s4。

字符串相关的类_第4张图片

字符串相关的类_第5张图片

String常用方法:

SN(序号)

方法描述

1

char charAt(int index)

返回指定索引处的 char 值。

2

int compareTo(Object o)

把这个字符串和另一个对象比较。

3

int compareTo(String anotherString)

按字典顺序比较两个字符串。

4

int compareToIgnoreCase(String str)

按字典顺序比较两个字符串,不考虑大小写。

5

String concat(String str)

将指定字符串连接到此字符串的结尾。

6

boolean contentEquals(StringBuffer sb)

当且仅当字符串与指定的StringBuffer有相同顺序的字符时候返回真。

7

static String copyValueOf(char[] data)

返回指定数组中表示该字符序列的 String。

8

static String copyValueOf(char[] data, int offset, int count)

返回指定数组中表示该字符序列的 String。

9

boolean endsWith(String suffix)

测试此字符串是否以指定的后缀结束。

10

boolean equals(Object anObject)

将此字符串与指定的对象比较。

11

boolean equalsIgnoreCase(String anotherString)

将此 String 与另一个 String 比较,不考虑大小写。

12

byte[] getBytes()

 使用平台的默认字符集将此 String 编码为 byte 序列,并将结果存储到一个新的 byte 数组中。

13

byte[] getBytes(String charsetName)

使用指定的字符集将此 String 编码为 byte 序列,并将结果存储到一个新的 byte 数组中。

14

void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin)

将字符从此字符串复制到目标字符数组。

15

int hashCode()

返回此字符串的哈希码。

16

int indexOf(int ch)

返回指定字符在此字符串中第一次出现处的索引。

17

int indexOf(int ch, int fromIndex)

返回在此字符串中第一次出现指定字符处的索引,从指定的索引开始搜索。

18

int indexOf(String str)

 返回指定子字符串在此字符串中第一次出现处的索引。

19

int indexOf(String str, int fromIndex)

返回指定子字符串在此字符串中第一次出现处的索引,从指定的索引开始。

20

String intern()

 返回字符串对象的规范化表示形式。

21

int lastIndexOf(int ch)

 返回指定字符在此字符串中最后一次出现处的索引。

22

int lastIndexOf(int ch, int fromIndex)

返回指定字符在此字符串中最后一次出现处的索引,从指定的索引处开始进行反向搜索。

23

int lastIndexOf(String str)

返回指定子字符串在此字符串中最右边出现处的索引。

24

int lastIndexOf(String str, int fromIndex)

 返回指定子字符串在此字符串中最后一次出现处的索引,从指定的索引开始反向搜索。

25

int length()

返回此字符串的长度。

26

boolean matches(String regex)

告知此字符串是否匹配给定的正则表达式。

27

boolean regionMatches(boolean ignoreCase, int toffset, String other, int ooffset, int len)

测试两个字符串区域是否相等。

28

boolean regionMatches(int toffset, String other, int ooffset, int len)

测试两个字符串区域是否相等。

29

String replace(char oldChar, char newChar)

返回一个新的字符串,它是通过用 newChar 替换此字符串中出现的所有 oldChar 得到的。

30

String replaceAll(String regex, String replacement)

使用给定的 replacement 替换此字符串所有匹配给定的正则表达式的子字符串。

31

String replaceFirst(String regex, String replacement)

 使用给定的 replacement 替换此字符串匹配给定的正则表达式的第一个子字符串。

32

String[] split(String regex)

根据给定正则表达式的匹配拆分此字符串。

33

String[] split(String regex, int limit)

根据匹配给定的正则表达式来拆分此字符串。

34

boolean startsWith(String prefix)

测试此字符串是否以指定的前缀开始。

35

boolean startsWith(String prefix, int toffset)

测试此字符串从指定索引开始的子字符串是否以指定前缀开始。

36

CharSequence subSequence(int beginIndex, int endIndex)

 返回一个新的字符序列,它是此序列的一个子序列。

37

String substring(int beginIndex)

返回一个新的字符串,它是此字符串的一个子字符串。

38

String substring(int beginIndex, int endIndex)

返回一个新字符串,它是此字符串的一个子字符串。

39

char[] toCharArray()

将此字符串转换为一个新的字符数组。

40

String toLowerCase()

使用默认语言环境的规则将此 String 中的所有字符都转换为小写。

41

String toLowerCase(Locale locale)

 使用给定 Locale 的规则将此 String 中的所有字符都转换为小写。

42

String toString()

 返回此对象本身(它已经是一个字符串!)。

43

String toUpperCase()

使用默认语言环境的规则将此 String 中的所有字符都转换为大写。

44

String toUpperCase(Locale locale)

使用给定 Locale 的规则将此 String 中的所有字符都转换为大写。

45

String trim()

返回字符串的副本,忽略前导空白和尾部空白。

46

static String valueOf(primitive data type x)

返回给定data type类型x参数的字符串表示形式。

47

contains(CharSequence chars)

判断是否包含指定的字符系列。

48

isEmpty()

判断字符串是否为空。

练习1:

String str = "12hello34world5java7891mysql456";
//把字符串中的数字替换成,,如果结果中开头和结尾有,的话去掉
String string = str.replaceAll("\\d+", ",").replaceAll("^,|,$", "");
System.out.println(string);

正则表达式

练习二:

String str = "12345";
//判断str字符串中是否全部有数字组成,即有1-n个数字组成
boolean matches = str.matches("\\d+");
System.out.println(matches);
String tel = "0571-4534289";
//判断这是否是一个杭州的固定电话
boolean result = tel.matches("0571-\\d{7,8}");
System.out.println(result);

练习三:

String str = "中";
System.out.println(str.getBytes("ISO8859-1").length);// -128~127
System.out.println(str.getBytes("GBK").length);
System.out.println(str.getBytes("UTF-8").length);
System.out.println(new String(str.getBytes("ISO8859-1"), "ISO8859-1"));// 乱码,表示不了中文
System.out.println(new String(str.getBytes("GBK"), "GBK"));
System.out.println(new String(str.getBytes("UTF-8"), "UTF-8"));

String相关算法题与面试题:

String经典算法题与面试题

StringBuffer与StringBuilder:

StringBuffer:

特点:

  1. java.lang.StringBuffer代表可变的字符序列,JDK1.0中声明,可以对字符串内容进行增删,此时不会产生新的对象。
  2. 很多方法与String相同。
  3. 作为参数传递时,方法内部可以改变值。
abstract class AbstractstringBuilder implements Appendable,charSequence {
        /*The value is used for character storage.*/
        char[ ] value;//value没有final声明,value可以不断扩容。
        /*The count is the number of characters used.*/
        int count;//count记录有效字符的个数。

构造:

StringBuffer类不同于String,其对象必须使用构造器生成。有三个构造器:

    1. StringBuffer():初始容量为16的字符串缓冲区
    2. StringBuffer(int size):构造指定容量的字符串缓冲区
    3. StringBuffer(String str):将内容初始化为指定字符串内容

String s = new String("我喜欢学习"); StringBuffer buffer = new StringBuffer("我喜欢学习"); buffer.append("数学");、

字符串相关的类_第6张图片

常用方法:

StringBuffer append(xxx):提供了很多的append()方法,用于进行字符串拼接

StringBuffer delete(int start,int end):删除指定位置的内容

StringBuffer replace(int start, int end, String str):把[start,end)位置替换为str

StringBuffer insert(int offset, xxx):在指定位置插入xxxStringBuffer reverse() :把当前字符序列逆转

public int indexOf(String str)

public String substring(int start,int end)

public int length()

public char charAt(int n )

public void setCharAt(int n ,char ch)

StringBuilder:

联系

StringBuilder 和 StringBuffer 非常类似,均代表可变的字符序列,而且提供相关功能的方法也一样

面试题:对比String、StringBuffer、StringBuilder

String(JDK1.0):不可变字符序列

StringBuffer(JDK1.0):可变字符序列、效率低、线程安全

StringBuilder(JDK 5.0):可变字符序列、效率高、线程不安全

注意:

作为参数传递的话,方法内部String不会改变其值,StringBuffer和StringBuilder会改变其值。

面试题:

String str = null; StringBuffer sb = new StringBuffer(); sb.append(str); System.out.println(sb.length());// System.out.println(sb);// StringBuffer sb1 = new StringBuffer(str); System.out.println(sb1);//

append方法有保护机制,先判断是不是null,如果是则append("null")

具体参考这篇csdn博客

String str = null; System.out.println("null"+" "+str);

变量相加也会创建一个StringBuilder对象,调用append方法。所以输出

null null


引用:

菜鸟教程:

Java String 类 | 菜鸟教程 (runoob.com)

csdn博主andyonlines的博客:(13条消息) 2. 关于StringBuffer 创建对象和append函数传入null对象的情况_andyonlines的博客-CSDN博客

你可能感兴趣的:(java,java,算法,面试)