十三String字符串

Posted 带刺的猬

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了十三String字符串相关的知识,希望对你有一定的参考价值。

1、概述

String类在 java.lang 包下,所以使用的时候不需要导包

String类代表字符串,Java程序中的所有字符串文字(例如"abc")都被实现为此类的实例。
也就是说,Java程序中所有的双引号字符串,都是String类的对象

字符串不可变,它们的值再创建后不能在更改

2、String常见构造方法

方法名 说明
public String() 创建一个空白字符串对象,不含有任何内容
public String(char[] chs) 根据字符数组的内容,来创建字符串对象
public String(String original) 根据传入的字符串内容,来创建字符串对象
String s = "abc"; 直接赋值的方式创建字符串对象,内容就是abc

3、字符串对象对比

  • 问题:构造方法能创建对象,双引号也能创建字符串对象,有区别么?

  • 注意:==号做比较

    // 基本数据类型:比较的是具体的值
    int a = 10;
    int b = 20;
    System.out.println(a == b);
    
    //引用数据类型:比较地址值
    Student s1 = new Student(23);
    Student s2 = s1;
    System.out.println(s1 == s2);
    

3.1、“”方式的字符串

  • 以 "" 方式给出的字符串,只要字符序列相同(顺序和大小写),无论在程序代码中出现多少次,JVM都只会建立一个String对象,并在字符串常量池中维护

  • 字符串常量池:当使用双引号创建字符串对象的时候,系统会检查该字符串是否在字符串常量池中存在

    • 不存在:创建
    • 存在:不会重新创建,而是直接复用

3.2、new方式的字符串

​ 通过new 创建的字符串对象,每一次new都会申请一个内存空间,虽然内容相同,但是地址值不同

3.3、String 在 JVM中

4、String字符串的特点

  • Java程序中所有的双引号字符串,都是String类的对象
  • 字符串不可变,它们的值在创建后不能被更改
  • 虽然不能被更改,但是可以被共享

5、面试题

案例1:

public class Test(){
    public static void main(String[] args){
        String s1 = "abc";
        String s2 = "ab";
        String s3 = s2 + "c";
        String s4 = "ab" + "c";
        
        System.out.println(s1 == s3); //false
        /*
        当字符串(其中必须有个变量)之间使用 + 号拼接的时候,系统底层会自动创建一个【StringBuilder】对象。
		然后在调用其【append方法完成拼接】。
		拼接后,在调用其【toString方法转换为String类型】
		*/
        
        
        System.out.println(s1 == s4); //true
        /*
        两个 “ ” 的字符串,Java存在常量优化机制,在编译的时候,就会将 【"ab" + "c" 拼接为 "abc"】
        */
    }
}

案例2:

String s = new String("abc"); 方式创建对象,在内存中创建了几个对象?

  • 两个:一个是堆空间中new结构;一个是char[]对应的常量池中的数据 "abc"

6、字符串的比较

使用 = 做比较

  • 基本类型:比较的是数据值是否相等
  • 引用类型:比较的是地址值时候相等

字符串是对象,它比较内容是否相同,是通过一个方法来实现的,这个方法叫:equals()

  • public boolean equals(Object anObject):将此字符串与指定对象进行比较。由于我们比较的是字符串对象,所以参数直接传递一个字符串

7、String的常用方法

方法 说明
int length() 获取字符串的长度
char charAt(int index) 获取字符串索引的字符
boolean isEmpty() 字符串是否为空
String trim() 忽略字符串的前和后的空白间隔
boolean equals(Object obj) 比较字符串的内容是否相同
String concat(String str) 将指定的字符串连接到此字符串的结尾,等价于“+”
String substring(int deginIndex,intendIndex) 从第几个字符开始截取(包含),到第几个字符结束(不包含)
boolean endsWith(String suffix) 测试此字符串是否以指定的后缀结束
boolean startsWith(String prefix) 测试此字符串是否以指定的前缀开始
boolean startsWith(String prefix,int toffset) 测试此字符串从指定索引开始的子字符串是否以指定前缀开始
boolean contains(CharSequence s) 判断此字符串是否包含指定的字符串
int indexOf(String str) 返回指定字符串在此字符串中第一次出现的索引位置,没有返回-1
int indexOf(String str,int fromIndex) 从指定的索引位置开始查找, 返回指定字符串在此字符串中第一次出现的索引位置,没有返回-1
int lastIndexOf(String str) 从后往前查找, 返回指定字符串在此字符串中第一次出现的索引位置,没有返回-1
int lastIndexOf(String str,int fromIndex) 从指定的索引位置开始, 从后往前查找,返回指定字符串在此字符串中第一次出现的索引位置,没有返回-1
替换
String replace(char oldChar,char newChar) 返回一个新的字符串,newChar替换字符串中所有的oldChar
String replace(CharSequener target,CharSequence replacement) 新的字符串replacement替换旧的字符串target
String replaceAll(String regex,String replacement) 使用给定的replacement替换此字符串所有匹配给定的正则表达式的子字符串
String replaceFirst(String regex,String replacement) 使用给定的replacement替换此字符串匹配给定的正则表达式的第一个子字符串
匹配
boolean matches(String regex) 告知此字符串是否匹配给定的正则表达式
切片
String[] split(String regex) 根据给定正则表达式的匹配拆分字符串
String[] split(String regex,int limit) 根据匹配的正则表达式来拆分此字符串,最多不超过limit个,如果超过了,剩下的全部放到最后一个元素中

8、String 与 类型转换

8.1、String 与 基本数据类型、包装类之间的转换

1. 基本数据类型/包装类 ----》String类型     ***
	方式一:
		int num2 = 10;
		String str2 = num2 + "";
	方式二:
    	float f1 = 12.3f;
    	String str3 = String.valueOf(f1);
    	
    	Double d1 = new Double(12.4);
    	String str4 = String.valueOf(d1);

2. String类型 ----》  基本数据类型/包装类 。调用包装类的 parseXxx(String s)   ***
	String str1 = "123";
	Integer.parseInt(str1);

8.2、String 与 char[] 之间的转换

//String -> char[] 调用String的toCharArray方法
String s1 = "abc";
char[] charArray = s1.toCharArray();

//char[] -> String 调用String的构造器
char[] arr = new char[]{\'h\',\'e\',\'l\',\'l\',\'o\'};
String str = new String(arr)

8.3、String 与 byte[] 之间的转换

//String -> byte[] :调用 String 的 getBytes() 【编码】
String s1 = "abc";
byte[] bytes = s1.getBytes();//使用的是默认的字符集,进行转换
System.out.println(Arrays.toString(bytes));//[97,98,99]

byte[] bytes1 = s1.getBytes("gdk");//使用的是gdk字符集编码,中文字节不一样
System.out.println(Arrays.toString(bytes1));//[97,98,99]

//byte[] ->String : 调用String的构造器
String str = new String(bytes);//默认utf-8解码
String str = new String(bytes1);//如果是中文会乱码,因为编码集和解码集不一致
String str = new String(bytes1,"gdk");//正确

以上是关于十三String字符串的主要内容,如果未能解决你的问题,请参考以下文章

CSP核心代码片段记录

零基础带你学习MySQL—字符串相关的函数(十三)

《JAVA编程思想》学习笔记——第十三章 字符串

21个常用代码片段

python基础学习(十三)

PHP 代码片段