String
java.lang.String
String
类代表字符串。 Java程序中的所有字符串文字(例如"abc"
)都被实现为此类的实例。
字符串的内容永不变; 它们的值在创建后不能被更改。
因为String对象是不可变的,所以它们可以被共享。
字符串效果上相当于是char[]字符数组,但是底层原理是byte[]字节数组。
创建字符串常见的3+1种方式
创建一个空白字符串,不含任何内容
public String()
根据字符数组的内容,创建对应的字符串
public String(char[] array)
根据字节数组的内容,创建对应的字符串
public String(byte[] array)
一种直接创建
String s = "Hello";
示例代码
public static void main(String[] args) {
String s1 = new String();
System.out.println("第一个字符串:"+s1);
char[] charArray = {'A','B','C'};
String s2 = new String(charArray);
System.out.println("第二个字符串:"+s2);
byte[] byteArray = {97,98,99};
String s3 = new String(byteArray);
System.out.println("第三个字符串:"+s3);
String s4 = "hello";
System.out.println("第四个字符串:"+s4);
}
字符串的常量池
public class demo001 {
public static void main(String[] args) {
String s1 = "abc";
String s2 = "abc";
char[] charArray = {'a','b','c'};
String s3 = new String(charArray);
System.out.println(s1 == s2); //true
System.out.println(s1 == s3); //false
System.out.println(s2 == s3); //false
}
}
原理
- 对于引用类型,==进行的是地址值的比较
- 双引号直接写的字符串在常量池当中,new的不在常量池中
字符串内容的比较方法
==是进行对象的地址值比较,如果确实需要字符串的内容比较,可以使用两个方法:
第一个
//参数可以是任何对象,只有参数是一个字符串并且内容相同的才会给true,否则返回false
public boolean equals(Object obj);
备注
-
任何对象都能用object进行接收。
-
equals方法据有对称性,也就是a.equals(b)和b.equals(a)效果一样
-
如果比较双方一个常量一个变量,推荐把常量字符串写在前面,比如:“abc”.equals(s3)
public class demo001 {
public static void main(String[] args) {
String s1 = "abc";
String s2 = "abc";
char[] charArray = {'a','b','c'};
String s3 = new String(charArray);
System.out.println(s1.equals(s2)); //true
System.out.println(s2.equals(s3)); //true
System.out.println(s3.equals("abc")); //true
System.out.println("abc".equals(s3)); //true
}
}
第二个
//忽略大小写,进行内容比较
public boolean equalsIgnoreCase(String str)
public class demo001 {
public static void main(String[] args) {
String s1 = "abc123C d";
String s2 = "ABC123c D";
System.out.println(s1.equalsIgnoreCase(s2)); //true
System.out.println("ABC123c D".equalsIgnoreCase(s1)); //true
}
}
字符串的获取方法相关
public int length(); //获取字符串长度
public String concat(String str); //将当前字符串和参数字符串拼接成为返回值的新字符串
public char charAt(int index); //获取索引位置的单个字符,索引从0开始
public int indexOf(String str); //查找参数字符串在本字符串中首次出现的索引位置,如果没有返回-1值
public class demo001 {
public static void main(String[] args) {
String s1 = "hello hello hello ";
String s2 = "world";
System.out.println(s1.length());
System.out.println(s1.concat(s2));
System.out.println(s1.charAt(2));
System.out.println(s1.indexOf("llo"));
System.out.println(s1.indexOf("wor"));
}
}
字符串截取
//截取从参数位置一直到字符串末尾,返回新字符串
public String substring(int index);
//截取从begin开始,一直到end结束,中间的字符串,不包含begin和end
public String substring(int begin, int end)
public class demo001 {
public static void main(String[] args) {
String s1 = "hello world";
System.out.println(s1); //hello world
String s2 = s1.substring(5);
System.out.println(s2); //world
String s3 = s1.substring(5,8);
System.out.println(s3); //wo
}
}
字符串转换相关常用方法
//将当前字符串拆分成为字符数组作为返回值
public char[] toCharArray()
//获得当前字符串底层的字节数组
public byte[] getBytes()
//将所有出现的老字符串替换成为新的字符串,返回替换后的结果新字符串
//CharSequence意思就是说可以接收字符串类型
public String replace(CharSequence oldString, CharSequence newString)
public class demo001 {
public static void main(String[] args) {
char[] chars = "Hello".toCharArray();
System.out.println(chars[0]); //chars可以作为数组来使用,否则String无法这样用
byte[] bytes = "abc".getBytes(); //转换成字节数组来使用
for (int i = 0; i < bytes.length; i++) {
System.out.println(bytes[i]); //97 98 99
}
String s1 = "How do you do?";
String s2 = s1.replace("o","*");
System.out.println(s2); //H*w d* y*u d*?
}
}
字符串分割
//按照参数规则,将字符串切分为若干部分
public String[] split(String regex)
注意
参数regex
是正则表达式,所以如果按照点号.
切割,必须转译,比如这样"\\."
public class demo001 {
public static void main(String[] args) {
String ip = "192.168.172.55";
String[] ips = ip.split("\\.");
for(String i: ips){
System.out.println(i);
}
}
}
练习题
题目1
定义一个方法,把数组{1,2,3}按照指定格式拼接成一个字符串,格式如下:[word1#word2#word3]
public class demo001 {
public static void main(String[] args) {
String[] arr1 = {"user","password","token"};
int[] arr2 = {192,168,1,10};
String r1 = fromArrayToString(arr1);
String r2 = fromArrayToString(arr2);
System.out.println(r1);
System.out.println(r2);
}
public static String fromArrayToString(String[] arr) {
String result = "[";
for (int i = 0; i < arr.length; i++) {
if (i==arr.length-1){
result += arr[i] + "]";
}else {
result += arr[i] + "#";
}
}
return result;
}
//重载方法,支持int型数组入参
public static String fromArrayToString(int[] arr) {
String result = "[";
for (int i = 0; i < arr.length; i++) {
if (i==arr.length-1){
result += arr[i] + "]";
}else {
result += arr[i] + "#";
}
}
return result;
}
}
题目2
键盘输入一个字符串,并且统计其中各种字符出现的次数。
种类有:大写字母、小写字母、数字、其他
import java.util.Scanner;
public class demo001 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个字符串");
int counterUpper = 0; //大写字母
int counterLower = 0; //小写字母
int counterNumber = 0; //数字
int counterOther = 0; //其他
if(sc.hasNextLine()){
String input = sc.nextLine();
char[] chars = input.toCharArray();
for (int i = 0; i < chars.length; i++) {
char ch = chars[i];
if ('A' <= ch && ch <= 'Z'){
counterUpper++;
}else if('a' <= ch && ch <= 'z'){
counterLower++;
}else if('0' <= ch && ch <= '9'){
counterNumber++;
}else {
counterOther++;
}
}
}
sc.close();
System.out.println("大写字母出现次数统计结果:" + counterUpper);
System.out.println("小写字母出现次数统计结果:" + counterLower);
System.out.println("数字出现次数统计结果:" + counterNumber);
System.out.println("其他字符出现次数统计结果:" + counterOther);
}
}
next() 与 nextLine() 区别
next():
- 1、一定要读取到有效字符后才可以结束输入。
- 2、对输入有效字符之前遇到的空白,next() 方法会自动将其去掉。
- 3、只有输入有效字符后才将其后面输入的空白作为分隔符或者结束符。
- next() 不能得到带有空格的字符串。
nextLine():
- 1、以Enter为结束符,也就是说 nextLine()方法返回的是输入回车之前的所有字符。
- 2、可以获得空白。
注意:在读取前我们一般需要 使用 hasNext 与 hasNextLine 判断是否还有输入的数据
import java.util.Scanner;
public class ScannerDemo {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
// 从键盘接收数据
// nextLine方式接收字符串
System.out.println("nextLine方式接收:");
// 判断是否还有输入
if (scan.hasNextLine()) {
//String str2 = scan.next();
String str2 = scan.nextLine();
System.out.println("输入的数据为:" + str2);
}
scan.close();
}
}