4.字符串
字符
char
无需多言,单引号。
String类
基本操作
String
类的访问不能通过数组访问,只能通过API,并且只能访问不能修改,如:
String a = "hello";
for(int i = 0; i < a.length(); i ++)
{//注意:只能访问不能修改System.out.println(a.charAt(i));//这是错的:a.charAt(i) = 'a';
}
一些基本操作如下代码所示:
package org.example;public class Main{public static void main(String[] args) throws Exception{String a = "hello world";String b = "my name is ";String x = b; //String是对象,字符串其实是指向了同一个地址String c = b + 18; //(基本类型)18被隐式转化为字符串String d = b + "xjf";System.out.printf("%s\n", c);System.out.println(d);//格式化字符串String name = String.format("My name is %d", 18);System.out.println(name);//字符串转化为基本类型String money = "123.45";String money_int = "123";double dm = Double.parseDouble(money);System.out.println(dm);int im = Integer.parseInt(money_int);System.out.println(im);//基本类型转化为字符串:空字符串+基本类型即可int test = 123;String test_str = "" + 123;System.out.println(test_str);}
}
注意:
java
里面的String
类与C++不一样,如果修改其值,会构造全新的字符串,不在原来的地址了。
常用API
还有一些常用的API,如下所示:
涉及到串的变化不会修改原字符串的值,会重新建立一个新的字符串。
length()
:返回长度,注意这是一个函数,不是数组里面的属性。split(String regex)
:分割字符串indexOf(char c)
、indexOf(String str)
、lastIndexOf(char c)
、lastIndexOf(String str)
:字符或字符串第一次、最后一次出现的下标equals()
:比较两个字符串是否相等,如下:
String a = "hello world";
String b = "hello world";
System.out.println(a.equals(b));
-
compareTo()
:判断两个字符串的字典序大小,负数表示小于,0表示相等,正数表示大于 -
startsWith()
:判断是否以某个前缀开头 -
endsWith()
:判断是否以某个后缀结尾 -
trim()
:去掉首尾的空白字符 -
toLowerCase()
:全部用小写字符 -
toUpperCase()
:全部用大写字符 -
replace(char oldchar, char newchar)
:替换字符 -
replace(String oldstr, String newstr)
:替换字符串,例如:
String a = "hello world ";
System.out.println(a.replace("h", "p"));
substring(int beginIndex, int endIndex)
:返回[beginIndex, endIndex)
中的子串
String str = "hello";
String strs = str.substring(0, 2);
System.out.println(strs); //返回:he
toCharArray()
:字符串转化为字符数组
注意:比较字符串不能使用
==
进行比较,只能使用equals()
。这是因为,==
比较的是两个字符串的地址而非其实际的内容。
StringBuilder等
注:
String
不支持修改,那么:String a = "a"; a += "b"; //先复制"a",再添加"b"
如果大量使用插入,则插入 N N N个元素的时间复杂度为 O ( N 2 ) O(N^2) O(N2),太慢了。
若打算修改字符串,可以采用:StringBuilder
、StringBuffer
。
StringBuilder
:线程安全,但速度较慢;StringBuffer
:线程不安全,但速度较快。不支持多线程。
public class Main{public static void main(String[] args) throws Exception{StringBuilder sb = new StringBuilder("hello");//拼接,与python一样sb.append(" world");System.out.println(sb);//翻转字符串sb.reverse();System.out.println(sb);//修改for(int i = 0; i < sb.length(); i ++){sb.setCharAt(i, (char)(sb.charAt(i) + 1));}System.out.println(sb);}
}
如果想将
StringBuilder
、StringBuffer
转化为String
,调用toString()
函数即可。
输入与输出
package org.example;
import java.util.Scanner;public class Main{public static void main(String[] args) throws Exception{Scanner sc = new Scanner(System.in);String a = sc.next(); //遇到空格、回车、制表符等就停止String b = sc.nextLine(); //读取一整行字符串,遇到回车才停止System.out.println(a);System.out.printf("%s", b); //%s输出也可}
}