什么是字符串
java. lang. String类代表字符串。
API当中说: Java 程序中的所有字符串字面值(如"abc" )都作为此类的实例实现。
其实就是说:程序当中所有的双引号字符串,都是String类的对象。(就算没有new, 也照样是。)
字符串的特点:
1.字符串的内容永不可变。[重点]
2.正是因为字符串不可改变,所以字符串是可以共享使用的。
3.字符串效果上相当于是char[字符数组,但是底层原理是byte[字节数组。
创建字符串的常见3+1种方式。.
三种构造方法:
public String(): 创建一个空白字符串, 不含有任何内容。
public String(char[] array): 根据字符数组的内容,来创建对应的字符串。
public String(byte[] array): 根据字节数组的内容,来创建对应的字符串。
一种直接创建:
String str = “Hello”; //右边直接用双引号
注意:直接写上双引号,就是字符串对象。
代码:
public class DemoString {
public static void main(String[] args) {
//使用空参构造
String str1=new String();
System.out.println("第一个字符串是:"+str1);
//根据字符数组创建字符串
char[] charArray ={'A','B','C'};
String str2=new String(charArray);
System.out.println("第二个字符串是:"+str2);
//根据字节数组创建字符串
byte[] byteArray ={97,98,99};
String str3=new String(byteArray);
System.out.println("第三个字符串是:"+str3);
//直接构造
String str4 = "Hello";
System.out.println("第四个字符串是:"+str4);
}
}
字符串常量池:
程序中直接写上的双引号字符串,就在字符串常量池中。new创建的不在池当中。
对于基本类型来说,=是进行数值的比较。
对于引用类型来说,==是进行[地址值]的比较。
public class DemoStringPool {
public static void main(String[] args) {
String str1="abc";//在常量池中创建了abc
String str2="abc";//常量池中已经有了abc,就直接使用,不会重新创建
char[] charArray={'a','b','c'};
String str3=new String(charArray);
System.out.println(str1==str2);//true(即地址值相同)
System.out.println(str1==str3);//false
System.out.println(str2==str3);//false
}
}
字符串常量池原理(以上述代码为例)
字符串中的常用方法
一、字符串的内容比较:
1.public boolean equals(Object obj)
参数可以是任何对象, 只有参数是一个字符串并且内容相同才会返回true,否真返回false。
备注:
1).任何对象都能用object进行接收
2).equals()方法具有对称性。即a.equals(b) 和 b.equals(a) 效果一样。
3).如果比较双方一个是常量,一个是变量,建议将常量字符串放在前面
(如果变量为空,则会发生空指针异常)。
推荐:“abc”.equals(str) 不推荐 str.equals(“abc”)
- public boolean equalsIgnoreCase(String[] str):
忽略大小写经行内容的比较
public class DemoStringEquals {
public static void main(String[] args) {
String str1="Hello";
String str2="Hello";
char[] charArray={'H','e','l','l','o'};
String str3=new String(charArray);
System.out.println(str1.equals(str2));//true
System.out.println(str1.equals(str3));//true
System.out.println(str2.equals(str3));//true
System.out.println("Hello".equals(str3));//true
System.out.println("===================");
String str4="hello";
System.out.println(str1.equals(str4));//false
System.out.println("===================");
String str5=null;
System.out.println("abc".equals(str5));//false
// System.out.println(str5.equals("abc"));//空指针异常
System.out.println("===================");
String strA="Java";
String strB="java";
System.out.println(strA.equals(strB));//false
System.out.println(strA.equalsIgnoreCase(strB));//true
}
}
结果:
二、String中和获取有关的常用方法有:
1.public int length()
获取字符串中含有的字符个数,拿到字符串的长度
2.public String concat(String str):
将当前字符串和参数字符串拼接成为返回值新的字符串。
3.public char charAt(int index):
获取指定索引位置的单个字符串(索引从0开始)。
4.public int indexOf(String str)
查找参数字符串在本字符串中首次出现的索引位置,如果没有返回-1。
代码:
public class DemoStringGet {
public static void main(String[] args) {
//获取字符串长度
int length="anasicnosnslnslknvscvknsipn".length();
System.out.println("该字符串的长度是:"+length);
System.out.println("==================");
//拼接字符串
String str1="Hello";
String str2="World";
String str3=str1.concat(str2);
System.out.println(str1);//Hello
System.out.println(str2);//World
System.out.println(str3);//HelloWorld
System.out.println("==================");
//获取指定索引的单个字符串
char ch="World".charAt(2);
System.out.println("在2号索引位置的字符串是"+ch);
System.out.println("==================");
//查找字符串在本来字符串当中首次出现的索引位置
//如果没有,返回-1;
String original ="HelloWorld";
int index= original.indexOf("llo");
int index1=original.indexOf("rd");
System.out.println("llo的第一次索引值是"+index);
System.out.println("rd的第一次索引值是"+index1);
}
}
结果:
三、字符串的截取方法:
1.public String substring(int index):
截取从参数位置一直到字符串末尾,返回新的字符串。
2.public String substring(int begin,int end):
截取从begin开始,到end结束,中间的字符串。[begin,end)
代码:
public class DemoSubstring {
public static void main(String[] args) {
String str1="HelloWorld";
String str2=str1.substring(5);
System.out.println(str1); //HelloWorld
System.out.println(str2); //World
System.out.println("==============");
String str3=str1.substring(4,7);
System.out.println(str3); //oWo
}
}
结果:
四、字符串当中与转换相关的方法
1.public char[] toCharArray():
将当前字符串拆分成字符数组作为返回值
2.public byte[] getBytes():
获得当前字符串底层的字节数组。
3.public String replace(CharSequence oldString,CharSequence newString)
将所用出现的老字符串替换成新的字符串,返回替换后的字符串。
代码:
public class DemoStringConvert {
public static void main(String[] args) {
char[] chars="Hello".toCharArray();
System.out.println(chars[0]);
System.out.println(chars.length);
System.out.println("==============");
//转换成字节数组
byte[] bytes= "abc".getBytes();
for (int i = 0; i < bytes.length; i++) {
System.out.println(bytes[i]);
}
System.out.println("==============");
String str1 ="how do you do?";
String str2=str1.replace("o","*");
System.out.println(str1);
System.out.println(str2);
}
}
结果:
五、分割字符串的方法
1.public String[] split(String regex):
按照参数的规则,将字符串切分成若干份
注意:
split方法的参数其实是一个正则表达式,如果要按照".“进行切割,则参数需要这样写:”\."。
代码:
public class DemoStringSplit {
public static void main(String[] args) {
//以","进行切割
String str1="aaa,bbb,ccc,d,e";
String[] array1= str1.split(",");
System.out.println("字符串array1的长度是"+array1.length);
for (int i = 0; i < array1.length; i++) {
System.out.print(array1[i]+" ");
}
System.out.println("======================");
//以" "进行切割
String str2="aaa bbb ccc d e";
String[] array2= str2.split(" ");
System.out.println("字符串array2的长度是"+array2.length);
for (int i = 0; i < array2.length; i++) {
System.out.print(array2[i]+" ");
}
System.out.println("======================");
//以"."进行切割的错误写法
String str3="aaa.bbb.ccc.d.e";
String[] array3= str3.split(".");
System.out.println("字符串array3的长度是"+array3.length);
for (int i = 0; i < array3.length; i++) {
System.out.print(array3[i]+" ");
}
System.out.println("======================");
//以"."进行切割的正确写法
String str4="aaa.bbb.ccc.d.e";
String[] array4= str4.split("\\.");
System.out.println("字符串array4的长度是"+array4.length);
for (int i = 0; i < array4.length; i++) {
System.out.print(array4[i]+" ");
}
}
}
结果:
和String相关的简单练习
1.定义一个方法,把数组{1,2,3}按照指定格式拼接成一个字符串。 格式参照如下: [word1 #word2#word3]。
分析:
1.首先准备一个int[]数组,内容是: 1、2、3
2.定义一个方法,用来将数组变成字符串
三要素:
返回值类型: String
方法名称: fromArrayToString
参数列表: int[]
3.格式: [word1#word2#word3]
用到: for循环、字符串拼接、每个数组元素之前都有一个word字样、分隔使用的是#、区分一下是不是最后一个
4.调用方法,得到返回值,并打印结果字符串
代码:
public class DemoStringPractice {
public static void main(String[] args) {
//准备一个int[]数组,内容是: 1、2、3
int[] Array={1,2,3};
String result =forArrayToString(Array);
System.out.println(result);
}
//定义一个方法,用来将数组变成字符串
public static String forArrayToString(int[] Array){
String str="[";
for (int i = 0; i < Array.length; i++) {
//区分是不是最后一个
if (i<Array.length-1)
{
str += "word"+Array[i]+"#";
}
else{
str += "word"+Array[i]+"]";
}
}
return str;
}
}
结果:
2.键盘输入一个字符串,并且统计其中各种字符出现的次数。种类有:大写字母、写字母、数字、其他。
思路:
1.既然用到键盘输入,肯定是Scanner
2.键盘输入的是字符串,那么: String, str = sc.next();
3.义四个变量,分别代表四种字符各自的出现次数。
4.需要对字符串一个字、一个字检查,String–>char[], 方法就是toCharArray()
5.遍历char[字符数组,对当前字符的种类进行判断,并且用四个变量进行++动作。
6.打印输出四个变量, 分别代表四种字符出现次数。
代码:
import java.util.Scanner;
public class DemoStringPracticeCount {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
String input=sc.next();
int num=input.length();
System.out.println("总字符串有"+num+"个字符");
int countUpper=0;//大写字母
int countLower=0;//小写字母
int countNumber=0;//数字
int countOther=0;//其他
//将输入的字符串转换成单个字符
char[] charArray= input.toCharArray();
//遍历字符数组
for (int i = 0; i < charArray.length; i++) {
char ch=charArray[i];//获取当前单个字符
if('A' <= ch && ch <= 'Z'){ //判断大写字母
countUpper++;
}
else if('a' <= ch && ch <= 'z'){ //判断小写字母
countLower++;
}
else if('0' <= ch && ch <= '9'){ //判断数字
countNumber++;
}
else{ //判断其他
countOther++;
}
}
System.out.println("大写字母有:"+countUpper);
System.out.println("小写字母有:"+countLower);
System.out.println("数字有:"+countNumber);
System.out.println("其他有:"+countOther);
}
}
结果: