目录
一、String的重要性
二、String的常用方法
2.1. 字符串构造
2.2. String对象的比较
2.3. 字符串查找
2.4. 转化
2.4. 字符串替换
2.5. 字符串拆分
2.6. 字符串截取
一、String的重要性
在C语言中已经涉及到字符串了,但是在C语言中要表示字符串只能使用字符数组或者字符指针,可以使用标准库提供的字符串系列函数完成大部分操作,但是这种将数据和操作数据方法分离开的方式不符合面相对象的思想,而字 符串应用又非常广泛,因此Java语言专门提供了String类。
二、String的常用方法
2.1. 字符串构造
要想了解一个新的类型,我们首先要了解它的源码。同样是双击shift,勾选上“include non-project items”,在框里面输入String java.lang,点击第一个,就可以看到String的源码。然后点击右侧的Structure,就可以看到String的构造方法(图中划线的表示已经弃用了)。
下面我们将介绍几个比较重要的构造方法。String的构造方法输出的为什么回事字符串而不是地址呢?首先我们要知道,String是引用类型,内部并不存储字符串本身。
String str1 = new String("abcd");String str2 = "hello";char[] arrays = {'w','o','r','l','d'};String str3 = new String(arrays);System.out.println(str1);System.out.println(str2);System.out.println(str3);
我们可以看一下println的源码,再看一下valueOf的源码。很明显看到调用toString方法时,字符串在走else这条语句,然后在返回obj.toString。
public void println(String x) { if (getClass() == PrintStream.class) { writeln(String.valueOf(x)); } else { synchronized (this) { print(x); newLine(); } }}
public static String valueOf(Object obj) { return (obj == null) ? "null" : obj.toString();}
下面我们看下一段代码, 我们来打一个断点来进行一个简单的调试。调试了之后,我们可以看到value、coder、hash、hashiszero等属性,我们这里重点看一下value。str1和str2这些值被拿到以后,把每一个字符串存放在字节数组里面并进行赋值。倍双引号引起来的是字符串,放在一个字符串池中。
public class Main { public static void main(String[] args) { String str1 = new String("abcde"); String str2 = new String("hello"); System.out.println(str1); System.out.println(str2); }}
字符串长度的打印:
String str1 = new String("abcd");String str2 = new String("hello");System.out.println(str1.length());System.out.println(str2.length());
2.2. String对象的比较
(1) ==比较是否引用同一个对象。对于引用类型==比较的是引用中的地址。
String str1 = new String("abcd");String str2 = new String("hello");String str3 = str1;System.out.println(str1 == str2);System.out.println(str1 == str3);
(2)使用equals方法,比较两个引用变量字符串的内容是否相等
String str1 = new String("abcd");String str2 = new String("hello");String str3 = new String("hello");System.out.println(str1.equals(str3));System.out.println(str2.equals(str3));
(3) int compareTo(String s)方法: 按照字典序进行比较
与equals不同的是,equals返回的是boolean类型,而compareTo返回的是int类型。具体比较方式: 1. 先按照字典次序大小比较,如果出现不等的字符,直接返回这两个字符的大小差值 2. 如果前k个字符相等(k为两个字符长度最小值),返回值两个字符串长度差值。
String str1 = new String("abc");String str2 = new String("ac");String str3 = new String("abc");String str4 = new String("abcdef");System.out.println(str1.compareTo(str2));System.out.println(str1.compareTo(str3));System.out.println(str1.compareTo(str4));
(4) int compareToIgnoreCase(String str)方法:与compareTo方式相同,但是忽略大小写比较。
2.3. 字符串查找
方法 | 功能 |
char charAt(int index) | 返回index位置上字符,如果index为负数或者越界,抛出 IndexOutOfBoundsException异常 |
int indexOf(int ch) | 返回ch第一次出现的位置,没有返回-1 |
int indexOf(int ch, int fromIndex) | 从fromIndex位置开始找ch第一次出现的位置,没有返回-1 |
int indexOf(String str) | 返回str第一次出现的位置,没有返回-1 |
int indexOf(String str, int fromIndex) | 从fromIndex位置开始找str第一次出现的位置,没有返回-1 |
int lastIndexOf(int ch) | 从后往前找,返回ch第一次出现的位置,没有返回-1 |
int lastIndexOf(int ch, int fromIndex) | 从fromIndex位置开始找,从后往前找ch第一次出现的位置,没有返 回-1 |
int lastIndexOf(String str) | 从后往前找,返回str第一次出现的位置,没有返回-1 |
int lastIndexOf(String str, int fromIndex) | 从fromIndex位置开始找,从后往前找str第一次出现的位置,没有返 回-1 |
String str = "aaabbbcccaaabbbccc";System.out.println(str.charAt(4));System.out.println(str.indexOf('c'));System.out.println(str.indexOf('b',5));System.out.println(str.indexOf("bbb"));System.out.println(str.indexOf("bbb",12));System.out.println(str.lastIndexOf('c'));System.out.println(str.lastIndexOf('c',10));System.out.println(str.lastIndexOf("bbb"));System.out.println(str.lastIndexOf("bbb",10));
2.4. 转化
(1)数值与字符串的转化
class Student{ public int age; public String name; public Student(int age, String name) { this.age = age; this.name = name; }}public class Main { public static void main(String[] args) { String s1 = String.valueOf(1234); String s2 = String.valueOf(12.34); String s3 = String.valueOf(true); String s4 = String.valueOf(new Student(19,"Thomas")); System.out.println(s1); System.out.println(s2); System.out.println(s3); System.out.println(s4); }}
如果我们再生成一个toString方法,那么打印出来的就是成员变量的值。
@Override public String toString() { return "Student{" + "age=" + age + ", name='" + name + '\'' + '}'; } System.out.println(s4);
(2)大小写的转化
String str1 = new String("hello");String str2 = new String("WORLD");String str3 = str1.toUpperCase();String str4 = str2.toLowerCase();System.out.println(str3);System.out.println(str4);
这里需要注意的是,大小写转化的时候,str1和str2的值依然不变,这个过程产生新的对象。我们从源码里面可以看到有一个new,说明要产生一个新的对象。
public static String toUpperCase(String str, byte[] value, Locale locale) { if (locale == null) { throw new NullPointerException(); }
(3)字符串转数组
public class Main { public static void main(String[] args) { String str = "hello"; char[] arrays = str.toCharArray(); for (int i = 0; i < arrays.length; i++) { System.out.print(arrays[i]+" "); } }}
(4)格式化
public class Main { public static void main(String[] args) { String s = String.format("%d-%d-%d", 2019,9,14); System.out.println(s); }}
2.4. 字符串替换
这里一共有4个方法,分别是以下四种。
第一种是替换单个字符。第二种与第四种差不多,但是第四种只能接收String类型,第二种既能接收char,也能接收String。第三种只替换第一次出现的匹配项。并且以上四种方法都会产生新的字符串
//reolaceAll与replceFirst的区别String str1 = new String("aabbccaabbde");String str2 = str1.replaceAll("aa","ff");String str3 = str1.replaceFirst("aa","ff"); System.out.println(str2);System.out.println(str3);
2.5. 字符串拆分
str1.split("&");//表示我要用这个符号去分割
我们看一下split里面的源码,被分割后的字符串要被数组去接收。
public String[] split(String regex) { return split(regex, 0); }
public class Main { public static void main(String[] args) { String str1 = new String("sdsjf&dsaw"); String[] ret = str1.split("&"); for (String x:ret){ System.out.println(x); } }}
也有一些比较特殊的字符。比如字符"|","*","+"都得加上转义字符,前面加上"\\",而如果是"\",那么就得写成"\\\\";如果一个字符串中有多个分隔符,可以用"|"作为连字符。
2.6. 字符串截取
substring都是要以String类型来接收。
public String substring(int beginIndex) { return substring(beginIndex, length()); }
public class Main { public static void main(String[] args) { String str1 = new String("abcdefgh"); String str2 = str1.substring(4); String str3 = str1.substring(4,6);//[4,6) System.out.println(str2); System.out.println(str3); }}
第一种方法是从指定索引截取到结尾;第二种方法是截取部分内容。