前言
对于刚学过C语言的小伙伴来说,String类可能比较陌生。在C语言中我们可以用指针来表示一串字符 如 char* p = "abcd" ,而在Java中我们可以用String类来直接表示 String p = "abcd"。
是不是方便许多,同时String类还具有很多实用的方法,现在让我们开始String类的学习吧!
1.字符串构造
String 类提供的构造方式非常多,常用的有以下三种
public static void main(String[] args) { //使用常量串构造 String s1 = "你好!"; //直接 newString 对象 String s2 = new String("我是"); //使用字符数组进行构造 char[] array ={'S','t','r','i','n','g','类'}; String s3 = new String(array); //打印 System.out.println(s1); System.out.println(s2); System.out.println(s3); }
如果想了解更多方法,可以参考Java在线文档
【注意】
① String是引用类型,内部并不存储字符串本身,这点我们可以从原码看出,其内部分为两部分 分别为 value 【存储数组】和 hash【默认为0】
public static void main(String[] args) { // s1 和 s2引用的是不同对象 s1 和 s3引用的是同一对象 String s1 = new String("hello"); String s2 = new String("world"); String s3 = s1;
② 在Java中 "" 引起来的也是String类型对象
1. // 打印"hello"字符串(String对象)的长度 2. System.out.println("hello".length());
2.String 对象的比较
字符串比较是常见的操作之一,比如:字符串排序。Java中总共提供4中方式:
ⅰ ==比较是否引用同一个对象
注意:对于内置类型,==比较的是变量中的值;对于引用类型==比较的是引用中的地址
public static void main(String[] args) { //对于引用类型==比较的是引用中的地址 String s1 = new String("hello"); String s2 = new String("hello"); String s3 = new String("world"); String s4 =s1; System.out.println(s1 == s2);//false System.out.println(s2 == s3);//false System.out.println(s1 == s4);//true
ⅱ equals方法比较
equals是Object中的方法,但是String类中重写了该方法,用于比较String类中引用内容是否相同 用法如下
public static void main(String[] args) { //对于引用类型==比较的是引用中的地址 String s1 = new String("hello"); String s2 = new String("hello"); String s3 = new String("world"); //equals比较: String对象中的逐个字符 //虽然s1和s2引用的不是同一个对象,但是两个对象中放置的内容相同,因此输出true //s2和s3引用的不是同一个对象,而且两个对象中内容也不相同,因此输出true System.out.println(s1.equals(s2)); System.out.println(s2.equals(s3));
关于equals更多细节可以参考:equals() 方法详解
ⅲ compareTo(String s) 方法:按照字典序进行比较
字典序:字符串大小的顺序
与equals不同的是,equals返回的是boolean类型,而compareTo返回的是int类型。具体比较方式:
先按照字典序大小比较,如果出现不等的字符,直接返回这连个字符的大小差值
如果前k个字符相等,返回两个字符串的差值
public static void main(String[] args) { String s1 = new String("abc"); String s2 = new String("ac"); String s3 = new String("abc"); String s4 = new String("abcdefg"); String s5 = new String("ABC"); System.out.println(s1.compareTo(s2));//不同输出字符差值-1 System.out.println(s1.compareTo(s3));//相同输出0 System.out.println(s1.compareTo(s4));//前k个字符完全相同,输出长度差值-4 System.out.println(s1.compareTo(s5));//大写和小写判定为两个字符串
ⅳ compareToIgnoreCase(String str) 方法:与 compareTo 方式相同,但是忽略大小写比较
public static void main(String[] args) { String s1 = new String("abc"); String s2 = new String("aBc"); String s3 = new String("ABc"); String s4 = new String("abcdefg"); String s5 = new String("ABC"); System.out.println(s1.compareToIgnoreCase(s2)); System.out.println(s1.compareToIgnoreCase(s3)); System.out.println(s1.compareToIgnoreCase(s4)); System.out.println(s1.compareToIgnoreCase(s5)); }
3.字符串查找
字符串查找也是字符串中常见的操作,String类提供了常用查找方法:
方法 | 功能 |
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 |
public static void main(String[] args) { String str = "abc abc abc defg abc cba"; System.out.println(str.length());//24 System.out.println(str.charAt(2));//c System.out.println(str.indexOf('e'));//13 System.out.println(str.indexOf('a',7));//8 System.out.println(str.indexOf("abc"));//返回首字母a位置的值 0 System.out.println(str.indexOf("abc",3));//4 System.out.println(str.lastIndexOf('c'));//21 System.out.println(str.lastIndexOf('c',20));//17 System.out.println(str.lastIndexOf("abc"));//返回首字母a位置的值 17 System.out.println(str.lastIndexOf("abc",16));//8 }
注意:上述方法都是实例方法
4.转化
1. 数值、对象、布尔值转化为字符串
一般情况下数值、对象或布尔值是不行转化成字符串的,但是String类提供了一个valueOf方法可以把这些转化成字符串
具体操作如下
public static void main(String[] args) { String str1 = String.valueOf(123); String str2 = String.valueOf(6.6); String str3 = String.valueOf(true); System.out.println(str1); System.out.println(str2); System.out.println(str3); }
而对象转化成字符串有点复杂,如果该对象类型没有重写toString方法的话,valueOf就会调用Object类中的toString方法,最后字符串中存放的是该对象的hash值
public static void main(String[] args) { String str = String.valueOf(new Student(10)); System.out.println(str);
如果该类重写了toString方法,那就存放是toString方法中的内容
class Student{ int age; public Student(int age) { this.age = age; } @Override public String toString() { return "Student{" + "age=" + age + '}'; } } public class Test { public static void main(String[] args) { String str = String.valueOf(new Student(10)); System.out.println(str); } }
2.大小写转化
String类中也提供了大小写转换的方法
小写转大写:toUpperCase()
大写转小写:toLowerCAse()
当上述两个方法只会对英文转换,对中文无效,同时改变大小写,并不是把当前字符串的值改变,而是产生新的字符串!
public static void main(String[] args) { String s1 = "hello"; String s2 = "HELLO"; //小写转大写 String ret = s1.toUpperCase(); System.out.println(ret+" s1->"+s1); //大写转小写 ret = s2.toLowerCase(); System.out.println(ret+" s2->"+s2); }
3.字符串转数组
String类中还提供了一个toCharArray方法,可以把字符串有引用的数据提取出来转换为数组
public static void main(String[] args) { String s = "hello"; //字符串数组 char[] ch = s.toCharArray(); for (int i = 0; i < ch.length; i++) { System.out.println(ch[i]); } System.out.println(); //数组转字符串 String s2 = new String(ch); System.out.println(s2); }
4.格式化
public static void main(String[] args) { String s = String.format("%d-%d-%d", 2019, 9,14); System.out.println(s); }