String类常用操作及问题
使用API文档
在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 。
- 作用:当且仅当此字符串包含指定的str时,返回 true。
常见获取方法
-
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开始一直到最后的内容。
- 作用:返回一个子字符串,从beginIndex开始截取字符串到字符串结尾。
-
public String substring (int beginIndex, int endIndex) :
- 作用:返回一个子字符串,从beginIndex到endIndex截取字符串。含beginIndex,不含endIndex。
举例:s1.substring(5,10) 截取 s1字符串从索引5开始一直到索引10之间的内容(包含5,不包含10)。
- 作用:返回一个子字符串,从beginIndex到endIndex截取字符串。含beginIndex,不含endIndex。
常见转换方法
-
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"。
- 作用:字符串中的所有的oldStr替换成newStr。
-
public String[] split(String regex):
- 作用:将此字符串按照给定的regex(规则)拆分为字符串数组。
举例:"a,b,c,d".split(",") 把"a,b,c,d"按照逗号切割,将切割后的多个子字符串存入String[] 中。
- 作用:将此字符串按照给定的regex(规则)拆分为字符串数组。
常见面试题
创建字符串对象两种方式的区别
-
通过构造方法创建:通过 new 创建的字符串对象,每一次 new 都会申请一个内存空间,虽然内容相同,但是地址值不同
-
直接赋值方式创建:以
String s3 = "abc";
方式给出的字符串,只要字符序列相同(顺序和大小写),无论在程序代码中出现几次,JVM 都只会建立一个 String 对象,并在字符串池中维护
==和equals区别:
- ==比较基本数据类型:比较的是具体的值
- ==比较引用数据类型:比较的是对象地址值
- equals比较String类型: 比较的是对象的内容是否相同
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
}
}
本文来自博客园,作者:KMP,转载请注明原文链接:https://www.cnblogs.com/touchTomorrow/p/16506168.html