String类常用操作及问题

使用API文档

image-20220722095501713

在java.lang包下,String表字符类型,字符串是常量(保存在常量池),它们的值在创建之后不能更改【也就是说如果对字符串进行操作必须赋值给自身值才会发生变化】,但它们可以被共享。

String s1 = "abc"; 
String s2 = "abc"; 
// 内存中只有一个"abc"对象被创建,同时被s1和s2共享。
s1.content(s2);
System.out.println(s1)//输出abc
  • String在jdk8及以前内部使用的就是字符数组jdk9及以后内部使用的就是字节数组

    String str = "abc";
    相当于:
    char data[] = {'a', 'b', 'c'};
    String str = new String(data);
    // String底层是靠字符数组实现的。

字符数组和字节数组区别

String.getBytes()是将字符串转化为一个字节数组,而String.toCharArray()是将一个字符串转化为一个字符数组。

【例如】

​ 字节:byte bys[] =“国庆60周年”.getBytes();

​ 字符:char chs[]=“国庆60周年”.toCharArray();

【那么字节数组和字符数组有什么区别呢?】

字节(Byte)是计量单位,表示数据量多少,是计算机信息技术用于计量存储容量的一种计量单位,通常情况下1个字节等于8位二进制。

字符(Character)计算机中使用的字母、数字、字和符号,比如'A'、'B'、'$'、'&'等。一般在英文状态下一个字母或字符占用一个字节,一个汉字用两个字节表示。

  • ASCII 码中,一个英文字母(不分大小写)为一个字节,一个中文汉字为两个字节。
  • UTF-8 编码中,一个英文字为一个字节,一个中文为三个字节。
  • Unicode 编码中,一个英文为一个字节,一个中文为两个字节。
  • 符号:英文标点为一个字节,中文标点为两个字节

常见构造方法

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

String常用方法

常见判断方法

  • public boolean equals(Object anObject) :

    • 作用: 将此字符串(调用分的对象)与指定对象(传递给方法的参数)进行比较内容是否相同, 区分大小写。
      举例:s1.equals(s2),比较s1和s2的内容是否相同,相同返回true,否则返回false。
  • public boolean equalsIgnoreCase (String anotherString):

    • 作用:将此字符串与指定对象进 行比较内容是否相同,忽略大小写
      举例:s1.equalsIgnoreCase(s2),比较s1和s2的内容是否相同,不区分大小写。
  • public boolean contains(String str) :

    • 作用:当且仅当此字符串包含指定的str时,返回 true。
      举例:s1.contains(s2),s1中包含s2,返回true,不包含返回false 。

常见获取方法

  • public int length () :返回此字符串的长度
    举例:s.length() 获取s中的字符的数量。

  • public String concat (String str):将指定的字符串连接到该字符串的末尾。
    举例:s1.concat(s2) 把s2连接到s1的末尾 等价于 s1 += s2

  • public char charAt (int index) : 返回指定索引处的 char值。
    举例:s1.charAt(5) 获取s1中索引为5的字符。

    遍历:

    for(int i=0; i<s.length(); i++) {
      s.charAt(i);  // 就是指定索引处的字符值
    }
    
  • public int indexOf (String str): 返回指定子字符串第一次出现在该字符串内的索引。
    举例:s1.indexOf(s2) 查找s2在s1中第一次出现的位置,如果不存在,返回-1。

  • public String substring (int beginIndex) :

    • 作用:返回一个子字符串,从beginIndex开始截取字符串到字符串结尾。
      举例:s1.substring(5) 截取s1字符串从索引5开始一直到最后的内容。
  • public String substring (int beginIndex, int endIndex) :

    • 作用:返回一个子字符串,从beginIndex到endIndex截取字符串。含beginIndex,不含endIndex。
      举例:s1.substring(5,10) 截取 s1字符串从索引5开始一直到索引10之间的内容(包含5,不包含10)。

常见转换方法

  • public char[] toCharArray ():

    • 作用:字符串 ===>字符数组。
      举例:s1.toCharArray() 把s1变成字符数组。
  • public byte[] getBytes ():

    • 作用:字符串===>字节数组。
      举例:s1.getBytes() 把s1变成字节数组。
  • public String replace (String oldStr, String newStr) :

    • 作用:字符串中的所有的oldStr替换成newStr。
      举例:s1.replace("a","A") 把s1中的所有的"a"替换成"A"。
  • public String[] split(String regex):

    • 作用:将此字符串按照给定的regex(规则)拆分为字符串数组。
      举例:"a,b,c,d".split(",") 把"a,b,c,d"按照逗号切割,将切割后的多个子字符串存入String[] 中。

常见面试题

创建字符串对象两种方式的区别

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

  • 直接赋值方式创建:以String s3 = "abc";方式给出的字符串,只要字符序列相同(顺序和大小写),无论在程序代码中出现几次,JVM 都只会建立一个 String 对象,并在字符串池中维护

==和equals区别:

  • ==比较基本数据类型:比较的是具体的值
  • ==比较引用数据类型:比较的是对象地址值
  • equals比较String类型: 比较的是对象的内容是否相同

image-20220722155924593

cpublic class FacialObject {
    public static void main(String[] args) {
		char[] chs = {'a','b','c'};
        String s1 = new String(chs);
        String s2 = new String(chs);
        String s3 = "abc";
        String s4 = "abc";					//my	//正确答案
        System.out.println(s1 == s2);		//F		//F
        System.out.println(s1 == s3);		//T		//F	
        System.out.println(s3 == s4);		//T		//T
        System.out.println(s1.equals(s2));	//F		//T
        System.out.println(s1.equals(s3));	//F		//T
        System.out.println(s3.equals(s4));	//T		//T
        
         /*
            此处+左右两边都是字符串常量对象,
            在编译期间JVM就能计算出结果字符串"Hello World",
            而该字符串"Hello World"在常量池空间中已经有了,
            不会再重新创建新的字符串处理对象"Hello World"了
         */
        s5="Helloword";
        s6="Hello"+"word";
        System.out.println(s5 == s6);		//T
        System.out.println(s5.equals(s6));	//T
        
        /*
            s8是变量,JVM在编译期间无法确定最终的结果的,【如果在s8前添加final关键字,则结果为TT】
            简单理解: 在使用+进行字符串拼接时,只要+左右两边出现了字符串变量,
            那就相当于new
            +中有字符串变量进行拼接时,内部使用StringBuilder完成字符串拼接后,
            再把StringBuilder通过new String的方法,转换成String对象
         */
        s7="Helloword";
        s8="Hello";
        s9=s8+"word";
        System.out.println(s7 == s9);		//F	
        System.out.println(s7.equals(s9));	//T
	}
}
posted @ 2022-07-22 16:17  KMP  阅读(52)  评论(0编辑  收藏  举报