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输出也可
}
}