目录
一、概述
- String就是字符串类型,属于java.lang包,不需要导包
- 所有的字符串常量(“Hello World”、”abc”)都属于String类型的对象
- 字符串字面值属于常量,存储在方法区的常量池中。
- String类型在创建之后就无法更改(是一个不可变的字符序列)。
- 不可变的原因是String类型只提供了构造方法,没有提供set方法,因此只能在创建对象的时候,初始化成员变量,将来对象创建完成之后,无法通过方法来修改。
二、常量池
对程序而言,全部String字面值中往往有大量的冗余,为了使java更高效地使用内存,JVM留出一块特殊的内存区域,称为“String常量池”。当编译器遇到String字面值时,它检查该池内是否已经存在相同的String字面值。如果找到,则将新的字面值的引用指向现有的String,而不创建任何新的String字面值对象。
String str1 = "abc"; // 内存中有几个对象??? 一个——常量池中
String str2 = "abc"; // 内存中有几个对象??? 一个
String str3 = new String("abc"); //两个,一个在堆区,一个在常量池
System.out.println(str1==str2); //true
System.out.println(str1==str3); //false
三、String类常见的构造方法
1、String():创建一个空字符串
2、String(String original):创建参数字符串的一个副本(参数字符串是在常量池中,构造方法创建的字符串是在堆内存中)
3、String(byte[] arr):将一个字节数组转成一个字符串。将我们不认识的字节数组,转成了我们认识的字符串,过程叫做【解码】。查询的是当前平台默认的编码表。
4、String(byte[] arr, int offset, int length):将字节数组的一部分转成字符串
5、String(char[] arr):将字符数组转成字符串。既不是编码,也不是解码,只不过是把字符串成了串
6、String(char[] arr, int offset, int length):将字符数组的一部分转成字符串
构造字符串对象的另一种形式,最简单的一种形式:
String str = "ityouxin";
String str = new String(); // 创建了一个空串 ""
//String str = "";
System.out.println(str);
String str1 = new String(new byte[]{65,66,67,68,69});
System.out.println(str1); // ABCDE
String str2 = new String(new byte[]{65,66,67,68,69},2,3);
System.out.println(str2); // CDE
String str3 = new String(new char[]{'a','b','c','d','e'});
System.out.println(str3); // abcde
String str4 = new String(new char[]{'a','b','c','d','e'},2,3);
System.out.println(str4); // cde
四、内存图
五、String类常用的方法
(1)API
概述
API(Application Programming Interface),应用程序编程接口。
Java API是一本程序员的字典 ,是JDK中提供给我们使用的类的说明文档。这些类将底层的代码实现封装了起来,我们不需要关心这些类是如何实现的,只需要学习这些类如何使用即可。所以我们可以通过查询API的方式,来学习Java提供的类,并得知如何使用它们。
使用步骤
1.打开帮助文档。
2.点击显示,找到索引,看到输入框。
3.你要找谁?在输入框里输入,然后回车。
4.看包。java.lang下的类不需要导包,其他需要。
5.看类的解释和说明。
6.学习构造方法。
7.使用成员方法。
(2)判断功能的方法
- equals(Object obj):判断调用者和参数对象描述的字符串内容是否相同
- equalsIgnoreCase(String otherStr):忽略大小写判断两个字符串内容是否相同
- contains(String str):判断调用者是否包含了str这个子串
- startsWith(String prefix):判断调用者是否以prefix开头
- endsWith(String suffix):判断调用者是否以suffix结尾
- isEmpty():判断调用者是否是空串
String s1 = "aaa";
String s2 = new String("aaa");
System.out.println(s1.equals(s2));
//判断键盘输入的值是否为admin
Scanner sc = new Scanner(System.in);
String str = sc.nextLine();
System.out.println(str=="admin");
System.out.println("admin".equals(str)); //常量和变量使用equals比较内容时,尽量把常量写在
//前面
//equalsIgnoreCase 忽略大小写的比较
String str1 = "aaa";
String str2 = "AAA";
System.out.println(str1.equals(str2));
System.out.println(str1.equalsIgnoreCase(str2));
//contains 判断字符串是否包含某内容(子串)
String str = "abcde";
System.out.println(str.contains("ab"));
System.out.println(str.contains("cde"));
System.out.println(str.contains("ac"));
// startsWith endsWith 判断字符串是否以某个值开头,是否以某个值结尾
String str="http://www.sina.com.cn";
System.out.println(str.startsWith("h"));
System.out.println(str.startsWith("http"));
System.out.println(str.startsWith("http://www.sina.com.cn"));
System.out.println(str.startsWith("a"));
System.out.println(str.endsWith("cn"));
System.out.println(str.endsWith(".cn"));
// isEmpty 判断字符串是否 为空串
String str1 = "";
String str2 = new String();
String str3 = new String("");
String str4 = " ";
System.out.println(str1.isEmpty());
System.out.println(str2.isEmpty());
System.out.println(str3.isEmpty());
System.out.println(str4.isEmpty());
(3)获取功能的方法
1、length():获取字符串字符的个数
2、charAt(int index):返回调用者字符串中索引为index的字符(和length方法结合之后可以遍历字符串)
3、substring(int beginIndex):获取一个字符串,内容是从当前字符串的beginIndex索引开始
4、substring(int beginIndex, int endIndex):获取一个指定索引范围的子串
注意事项:1、包含头不包含尾,返回的结果中,不包含endIndex索引指向的字符;2、所有的方法都无法修改字符串对象本身,一般都是返回一个新的字符串对象
5、indexOf家族:
indexOf(int ch):返回ch字符在当前调用者字符串中,第一次出现的索引
indexOf(int ch, int fromIndex):从fromIndex索引开始寻找,找到ch字符在当前字符串中第一次出现的索引
indexOf(String str):返回的是str这个字符串在调用者字符串中第一次出现的索引
indexOf(String str, int fromIndex):从fromIndex索引开始寻找,找到str字符串在当前字符串中第一次出现的索引(注意:无论从哪个位置开始找,所有字符的索引都不会变化)
6、lastIndexOf家族:
和IndexOf基本一样,只不过是从后往前找,所有字符和字符串的索引也都不会发生变化
public static void main(String[] args) {
/*
// 1 length() 获取字符串长度(由多少个字符组成)
String str = "abc";
int x = str.length();
System.out.println(x);
*/
/*
//2 charAt 获取某个位置上的字符
String str = "abcde";
char c = str.charAt(1);
System.out.println(c);
*/
/*
//3 substring 截取子串
String str = "abcdefg";
String result = str.substring(2); //取到最后
System.out.println(result);
String result2 = str.substring(2,4); // 左闭右开
System.out.println(result2);
*/
/*
//4 indexOf 查找位置
String str = "abcdeabcd";
int idx = str.indexOf("cd");
System.out.println(idx);
int idx2 = str.indexOf("ab",3);
//int idx2 = str.indexOf("ab",-3);// 第2个参数为负数,相当于0
System.out.println(idx2);
int idx3 = str.indexOf("xy");
System.out.println(idx3); // 找不到时,返回-1
*/
/*
//5 lastIndexOf 查找位置 从后向前找
String str = "abcdeabcd";
int idx = str.lastIndexOf("cd");
System.out.println(idx);
int idx2 = str.lastIndexOf("ab",3);
System.out.println(idx2);
int idx3 = str.lastIndexOf("xy");
System.out.println(idx3); // 找不到时,返回-1
*/
}
(4)转换功能的方法
- byte[] getBytes():将当前字符串,转成字节数组
- char[] toCharArray():将当前的字符串,转成字符数组
- toUpperCase():将当前的字符串,转成全大写形式
- toLowerCase():将当前的字符串,转成全小写形式
- concat(String str):将当前调用者,和参数str进行拼接,返回拼接后的长字符串(不常用,因为更多使用的是运算符+)
- valueOf家族:可以将任意数据类型的数据,转换成字符串
public static void main(String[] args) {
/*
// 1 getBytes() 将字符串转换成字节数组
String str = "abcd";
byte[] b = str.getBytes();
for(byte bb:b){
System.out.println(bb);
}
*/
/*
// 2 toCharArray() 将字符串转成字符数组
String str = "abcd";
char[] cc = str.toCharArray();
for(char c:cc){
System.out.println(c);
}
*/
/*
// 3 toUpperCase 小写转大写
String str = "abcd";
String str2 = str.toUpperCase();
System.out.println(str2);
*/
/*
//4 toLowerCase 大写转小写
String str = "AbCd";
String str2 = str.toLowerCase();
System.out.println(str2);
*/
/*
//5 concat 用来拼接字符串 和 +的作用相同 . 不同点: + 可以加任何类型 而concat只能拼接字符串
String s1 = "aaa";
String s2 = "bbb";
String s3= s1.concat(s2);
System.out.println(s3);
*/
/*
//6 valueOf 将其他类型转换成字符串 静态方法
int x = 100;
String str = String.valueOf(x);
System.out.println(str+1); // "1001"
int y = 200;
String str2 = y+""; //任何类型和字符串相加结果都是字符串
System.out.println(str2+1); //"2001"
*/
}
练习
键盘录入一个大小写混杂的纯英文字符串
将字符串转换成首字母大写,其他字母全部小写
例如,键盘录入”i lOvE jAvA”,转换成 “I love java”
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String str = sc.nextLine(); // 首字母转大写,其他小写
String s1 = str.substring(0,1); //截取首字母
String s2 = str.substring(1); //截取其他
String result = s1.toUpperCase()+s2.toLowerCase();
System.out.println(result);
}
(5)其他方法
- replace(String oldStr, String newStr):将调用者中的老串替换成新串
- trim():去掉字符串左右两边的空格、制表符
- split():字符串拆分
public static void main(String[] args) {
/*
// replace 替换 replaceAll---后面讲
String str = "www.baidu.com";
String str2 = str.replace("w", "x");
System.out.println(str2);
String str3 = str.replace("www", "x");
System.out.println(str3);
*/
/*
// trim 去首尾空格
String str = " aaa bbb ";
String str2 = str.trim();
System.out.println(str);
System.out.println(str2);
*/
/*
// split 字符串拆分 拆成数组
String str = "aaa#bbb#ccc#ddd";
String[] ss = str.split("#");
for(String s:ss){
System.out.println(s);
}
*/
String str = "aaa+bbb+ccc+ddd";
//String[] ss = str.split("+"); // 因为+是正则表达式(后面讲)的特殊字符 (+ . * ?)需要转义
String[] ss = str.split("\\+");
for(String s:ss){
System.out.println(s);
}
}