持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第25天,点击查看活动详情
String类
String类概述
在前面学习常量的时候介绍过Java中的所有常量:
整数、小数、字符、字符串、null、真假值true false
字符串常量,它在Java中不属于基本数据类型, 而是引用类型。Java中使用String这个类描述字符串这种常量数据。
API中对java.lang.String类的描述:
java.lang.String 类代表字符串。Java程序中所有的字符串文字(例如"abc" )都可以被看作是实现此类的实例。
String描述的字符串,所有在Java程序中使用双引号引用起来的数据都是一个对象。
使用步骤
-
查看类
java.lang.String:此类不需要导入。
-
查看构造方法
- String() 创建一个空的字符串对象
- String(String original) 根据字符串来创建一个字符串对象
- String(char[] value) 通过字符数组来创建字符串对象
- String(byte[] bytes) 通过字节数组来构造新的字符串对象
- String(byte[] bytes, int offset, int length) 通过字节数组一部分来构造新的字符串对象
-
构造举例,代码如下:
public static void main(String[] args) {
// 1.String() 创建一个空的字符串对象
String str1 = new String();
System.out.println("str1:" + str1);
// 2.String(String original) 根据字符串来创建一个字符串对象
String str2 = new String("abc");
System.out.println("str2:" + str2);
// 3.String(char[] value) 通过字符数组来创建字符串对象
char[] chs = {'A', 'B', 'C', 'D', 'E'};
String str5 = new String(chs);
System.out.println("str5:" + str5);
// 4.String(byte[] bytes) 通过字节数组来构造新的字符串对象
byte[] bytes = {97, 98, 99, 100, 101}; // a, b, c, d, e
String str3 = new String(bytes);
System.out.println("str3:" + str3);
// 5.String(byte[] bytes, int offset, int length) 通过字节数组一部分来构造新的字符串对象
String str4 = new String(bytes, 1, 2);
System.out.println("str4:" + str4);
String str6 = "abcde";
System.out.println("str6:" + str6);
}
创建字符串对象两种方式的区别
-
字符串不变:字符串的值在创建后不能被更改。
说明:只要使用双引号表示的字符串都存储在字符串常量池中。
String s1 = "abc";
s1 += "d";
System.out.println(s1); // "abcd"
// 内存中有"abc","abcd"两个对象,s1从指向"abc",改变指向,指向了"abcd"。
- 因为String对象是不可变的,所以它们可以被共享。
String s1 = "abc";
String s2 = "abc";
// 内存中只有一个"abc"对象被创建,同时被s1和s2共享。
-
通过构造方法创建
通过 new 创建的字符串对象,每一次 new 都会申请一个内存空间,虽然内容相同,但是地址值不同
-
直接赋值方式创建
以“”方式给出的字符串,只要字符序列相同(顺序和大小写),无论在程序代码中出现几次,JVM 都只会建立一个 String 对象,并在字符串池中维护
常用方法
判断功能的方法
-
public boolean equals (Object anObject):将此字符串与指定对象进行比较。 -
public boolean equalsIgnoreCase (String anotherString):将此字符串与指定对象进行比较,忽略大小写。 -
public boolean contains (CharSequence s):判断参数字符串在当前字符串中是否存在(区分大小写)。存在,返回true,否则,返回false。 -
public boolean endsWith(String suffix):测试此字符串是否以指定的后缀结尾(区分大小写)。 -
public boolean startsWith(String prefix):测试此字符串是否以指定的前缀开始(区分大小写)方法演示,代码如下:
public class String_Demo01 { public static void main(String[] args) { // 创建字符串对象 String s1 = "hello"; String s2 = "hello"; String s3 = "HELLO"; // boolean equals(Object obj):比较字符串的内容是否相同 System.out.println(s1.equals(s2)); // true System.out.println(s1.equals(s3)); // false System.out.println("-----------"); //boolean equalsIgnoreCase(String str):比较字符串的内容是否相同,忽略大小写 System.out.println(s1.equalsIgnoreCase(s2)); // true System.out.println(s1.equalsIgnoreCase(s3)); // true System.out.println("-----------"); String s = "我爱Java,我爱学习!"; System.out.println("字符串中是否包含Java:" + s.contains("Java"));//true System.out.println("字符串中是否包含java:" + s.contains("JAVA"))//false String name = "Test.java"; System.out.println("判断name是否以java结尾:" + name.endsWith("java"));//true System.out.println("判断name是否以Java结尾:" + name.endsWith("JAVA"));//false String name = "我爱Java"; System.out.println("字符串是否以‘我’开头:" + name.startsWith("我"));//true } }
Object 是” 对象”的意思,也是一种引用类型。作为参数类型,表示任意对 象都可以传递到方法中。
获取功能的方法
public int length ():返回此字符串的长度。public String concat (String str):将指定的字符串连接到该字符串的末尾。public char charAt (int index):返回指定索引处的 char值。public int indexOf (String str):返回指定子字符串第一次出现在该字符串内的索引。public int lastIndexOf(String str):返回指定子字符串最后一次出现的字符串中的索引。 如果不包含,则返回-1。public String substring (int beginIndex):返回一个子字符串,从beginIndex开始截取字符串到字符串结尾。public String substring (int beginIndex, int endIndex):返回一个子字符串,从beginIndex到endIndex截取字符串。含beginIndex,不含endIndex。包头不包尾
方法演示,代码如下:
public class String_Demo02 {
public static void main(String[] args) {
//创建字符串对象
String s = "helloworld";
// int length():获取字符串的长度,其实也就是字符个数
System.out.println(s.length());
System.out.println("--------");
// String concat (String str):将将指定的字符串连接到该字符串的末尾.
String s = "helloworld";
String s2 = s.concat("**hello itheima");
System.out.println(s2);// helloworld**hello itheima
// char charAt(int index):获取指定索引处的字符
System.out.println(s.charAt(0));
System.out.println(s.charAt(1));
System.out.println("--------");
// int indexOf(String str):获取str在字符串对象中第一次出现的索引,没有返回-1
System.out.println(s.indexOf("l"));
System.out.println(s.indexOf("owo"));
System.out.println(s.indexOf("ak"));
System.out.println("--------");
// int lastIndexOf(String str):获取str在字符串对象中最后一次出现的索引,没有返回-1
System.out.println(s.lastIndexOf("l"));
System.out.println(s.lastIndexOf("owo"));
System.out.println(s.lastIndexOf("ak"));
System.out.println("--------");
// String substring(int start):从start开始截取字符串到字符串结尾
System.out.println(s.substring(0));
System.out.println(s.substring(5));
System.out.println("--------");
// String substring(int start,int end):从start到end截取字符串。含start,不含end。
System.out.println(s.substring(0, s.length()));
System.out.println(s.substring(3,8));
}
}
转换功能的方法
public char[] toCharArray ():将此字符串转换为新的字符数组。public byte[] getBytes ():使用平台的默认字符集将该 String编码转换为新的字节数组。public String toLowerCase():使用默认语言环境的规则将此 String所有字符转换为小写。public String toUpperCase():将此 String所有字符转换为大写,使用默认语言环境的规则。public String replace (CharSequence target, CharSequence replacement):将与target匹配的字符串使用replacement字符串替换。
方法演示,代码如下:
public class String_Demo03 {
public static void main(String[] args) {
//创建字符串对象
String s = "abcde";
// char[] toCharArray():把字符串转换为字符数组
char[] chs = s.toCharArray();
for(int x = 0; x < chs.length; x++) {
System.out.println(chs[x]);
}
System.out.println("-----------");
// byte[] getBytes ():把字符串转换为字节数组
byte[] bytes = s.getBytes();
for(int x = 0; x < bytes.length; x++) {
System.out.println(bytes[x]);
}
System.out.println("-----------");
// 替换字母it为大写IT
String str = "itcast itheima";
String replace = str.replace("it", "IT");
System.out.println(replace); // ITcast ITheima
System.out.println("-----------");
}
}
CharSequence 是一个接口,也是一种引用类型。作为参数类型,可以把String对象传递到方法中。
分割功能的方法
public String[] split(String regex):将此字符串按照给定的regex(规则)拆分为字符串数组。public String trim():去掉当前字符串的前后空格,并返回一个新字符串,原字符串不变。
方法演示,代码如下:
public class String_Demo03 {
public static void main(String[] args) {
//创建字符串对象
String s = "aa,bb,cc";
String[] strArray = s.split(","); // ["aa","bb","cc"]
for(int x = 0; x < strArray.length; x++) {
System.out.println(strArray[x]); // aa bb cc
}
String str = " ad min ";
System.out.println("去掉前后空格后|" + str.trim() + "|");//去掉前后空格后|ad min|
System.out.println("原字符串|" + str + "|");//原字符串| ad min |
}
}
小结:
1.字符串的【所有方法】几乎都是有返回值的,调用方法后请操作返回值
比如:
String ss = "abcde";
ss.substring(3,5); //没有接受返回值,也没有打印返回值
System.out.println(ss);
打印的结果ss还是“abcde”,而不是“de”因为方法没有操作返回值。。。
2.String类常用方法如下:
| 方法 | 说明 |
|---|---|
| int length() | 获取字符串的长度 |
| char charAt(int index) | 获取指定索引处的字符 |
| boolean equals(Object obj) | 判断两个对象的内容是否相同 |
| String concat(String str) | 拼接两个字符串 |
| boolean contains() | 判断字符串中是否包含小字符串 |
| boolean endsWith(String suffix) | 判断字符串是否以指定字符串结尾 |
| boolean startsWith(String prefix) | 判断字符串是否以指定字符串开头 |
| int indexOf(String str) | 获取一个字符串第一次出现的索引 |
| int lastIndexOf(String str) | 获取一个字符串最后一次出现的索引 |
| String replace(CharSequence target, CharSequence replacement) | 将目标字符串target变为新的字符串replacement |
| String substring(int beginIndex,int endIndex) | 截取字符串的一部分,包含头不包含尾 |
| substring(int beginIndex) | 截取字符串的一部分,截取到最后 |
| char[] toCharArray() | 把字符串转成字符数组 |
| byte[] getBytes() | 把字符串转成字节数组 |
| String toLowerCase() | 把字符串的所有字母转成小写 |
| String toUpperCase() | 把字符串的所有字母转成大写 |
| String trim() | 去除字符串两端的空白 |
| String[] split(String regex) | 按照指定格式切割字符串 |
| boolean equalsIgnoreCase() | 忽略大小写判断两个字符串是否相同 |
String类的练习
统计字符个数
键盘录入一个字符串,统计字符串中大小写字母及数字字符个数
public class StringTest2 {
public static void main(String[] args) {
//键盘录入一个字符串数据
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个字符串数据:");
String s = sc.nextLine();
//定义三个统计变量,初始化值都是0
int bigCount = 0;
int smallCount = 0;
int numberCount = 0;
//遍历字符串,得到每一个字符
for(int x=0; x<s.length(); x++) {
char ch = s.charAt(x);
//拿字符进行判断
if(ch>='A'&&ch<='Z') {
bigCount++;
}else if(ch>='a'&&ch<='z') {
smallCount++;
}else if(ch>='0'&&ch<='9') {
numberCount++;
}else {
System.out.println("该字符"+ch+"非法");
}
}
//输出结果
System.out.println("大写字符:"+bigCount+"个");
System.out.println("小写字符:"+smallCount+"个");
System.out.println("数字字符:"+numberCount+"个");
}
}