java学习--字符串讲解
一、概述
java.lang.String代表字符串。
API中说:String类代表字符串。 Java程序中的所有字符串文字(例如"abc" )都被实现为此类的实例
其实就是说:程序当中的双引号字符串,都是String类的对象。(就算没有new,也照样是)
字符串特点:
1、字符串的内容永不改变,是一个常量 【重点】
2、字符串不可改变,所以字符串是可以共享使用
3、字符串效果上相当于是char[]字符数组,但是底层原理是byte[]字节数组
创建字符串的3+1种方式
三种构造方法:
public String():创建一个空白数组,不含任何内容;
public String(char[] array):根据字符数组的内容,创建对应的字符串;
public String(byte[] array):根据字节数组的内容,来创建对应的字符串
一种直接创建
String str = ""; // 右边直接双引号
注意:直接写上双引号,就是字符串对象;
public class Demo01String {
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 static void main(String[] args) {
String str1 = "abc";
String str2 = "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"),因为如果变量str为null时,程序报错空指针异常NUllPointerException
2、public boolean equalsIgnoreCase(String str):忽略大小写,进行内容比较。
注意:
只有英文字母忽略大小写,其他不区分大小写
public static void main(String[] args) {
String str1 = "abc";
String str2 = "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
System.out.println("================================");
System.out.println(str1.equals(str2)); // true
System.out.println(str2.equals(str3)); // true
System.out.println(str3.equals("abc")); // true 不推荐,因为如果变量str3为null时,程序报错空指针异常NUllPointerException
System.out.println("abc".equals(str1)); // true 推荐
String str4 = "Abc";
System.out.println(str1.equals(str4)); // false
System.out.println("================================");
String strA = "Java";
String strB = "java";
System.out.println(strA.equals(strB)); // false,严格区分大小写
System.out.println(strA.equalsIgnoreCase(strB)); // true ,忽略大小写
System.out.println("abc一123".equalsIgnoreCase("abc壹123")); // false
}
四、字符串的获取
public int length() : 获取字符串当中含有的字符串支付个数,拿到字符串长度;
public String concat(String str):将当前字符串和参数字符串拼接,返回新的字符串
public char charAt(int index):获取指定索引位置的单个字符,索引从0开始;
public int indexOf(String str):查找参数字符串在本字符串当中首次出现的位置索引,如果没有返回-1值
String strC = "msuahbfcbgeunjdwunan";
//获取长度
int length = strC.length();
System.out.println("字符串长度:" + length);
//拼接字符串
String strD = "57621964324";
String strE = strC.concat(strD);
System.out.println("拼接字符串:" + strE);
//获取指定索引位置的单个字符
char ch = strE.charAt(1);
System.out.println("在1号索引位置的字符是:" + ch); //S
// 查找参数字符串在本字符串当中首次出现的位置索引,如果没有返回-1值
int index = strE.indexOf("hbf");
System.out.println("第一次索引值是:" + index); // 4
System.out.println(strE.indexOf("cdn")); // -1
五、字符串的截取
public String substring(int index):截取从参数位置一直到字符串末尾,[index, ∞),返回新的字符串。
public String substring(int begin, int end):截取从begin开始,一直到end结束,中间的字符串
注意事项:
[begin, end) 左闭右开,包含左边,不包含右边。
String strF = strE.substring(5); String strG = strE.substring(5, 8); System.out.println(strF); System.out.println(strG);
六、字符串变量地址值变换
//下面这种写法,字符串的内容仍然没有改变
//下面有两个字符串:"hello","java"
//strA当中保存的是地址值。
//本来地址值是hello的0x666,
//后来地址值变成java的0x999
String strA = "hello"; System.out.println(strA); // hello strA = "java"; System.out.println(strA); // java
七、字符串的转换
常用方法
public char[] toCharArray() : 将当前字符串拆分成字符数组作为返回值;
public byte[] getBytes() : 获取当前字符串底层的字节数组;
public String replace(CharSequence oldString, CharSequence newString):将所有出现的老字符串替换成新字符串,返回替换后的新字符串
// 转换成字符数组
char[] chars = strH.toCharArray();
System.out.println(chars[2]); // v
System.out.println(chars.length); // 4
// 转换成字节数组
byte[] bytes = strH.getBytes();
for (int i = 0; i < bytes.length; i++) {
System.out.println(bytes[i]);
}
// 替换
String strJ = "会不会玩啊,你大爷的!你大爷的!你大爷的!";
String strK = strJ.replace("你大爷的", "****");
System.out.println(strJ);
System.out.println(strK);
八、分隔字符串
public String[] split(String regex) :按照参数的规则,将字符串切分成若干部分
注意事项:
split方法的参数是一个正则表达式
// 切割字符串
String strL = "aaa,bbb,ccc,d";
String[] array1 = strL.split(",");
System.out.println(array1);
for (int i = 0; i < array1.length; i++) {
System.out.println(array1[i]);
}
String strM = "XXX.YYY.ZZZ";
String[] array2 = strM.split("\\.");
System.out.println(array2);
for (int i = 0; i < array2.length; i++) {
System.out.println(array2[i]);
}
九、练习
1、指定整数数组格式{1,2,3},拼接字符串[word1#word2#word3]
int[] numArray = {1,2,3};
String result1 = fromArrayToString(numArray);
System.out.println(result1);
public static String fromArrayToString(int[] array)
{
String str = "[";
for (int i = 0; i < array.length; i++) {
str += "word" + array[i];
if (i < array.length - 1) {
str += "#";
}
}
str = str.concat("]");
return str;
}
2、统计输入字符串各种字符的个数
// 练习:统计输入的字符串各种字符的个数
System.out.println("请输入字符串");
Scanner sc = new Scanner(System.in);
String strN = sc.next();
System.out.println("你输入的是:" + strN);
String strO = getStringCount(strN);
System.out.println(strO);
public static String getStringCount(String str)
{
int countUpper = 0;
int countLower = 0;
int countNumber = 0;
int countOther = 0;
char[] chars = str.toCharArray();
for (int i = 0; i < chars.length; i++) {
if ('A' <= chars[i] && chars[i] <= 'Z') {
countUpper++;
} else if ('a' <= chars[i] && chars[i] <= 'z') {
countLower++;
} else if ('0' <= chars[i] && chars[i] <= '9') {
countNumber++;
} else {
countOther++;
}
}
String result = "大写字母有:" + countUpper + "个;" + "小写字母有:" + countLower + "个;" + "数字有:" + countNumber + "个;" + "其他字符有:" + countOther + "个;";
return result;
}

浙公网安备 33010602011771号