JavaEE-12-Java中的String类
String类代表字符串
所有字符串文字都被实现为此类的实例。
字符串的值在创建后不能被修改,因此,它们可以被共享。
String类主要有6个构造函数:
1.空构造
String s = new String();
2.使用指定的字节数组构造字符串
byte[] bys = {97,98,99,100,101};
String s = new String(bys);
3.使用指定字节数组的一部分构造字符串
String s = new String(bys,1,3); //截取从字节数组中索引为1的字节开始后的3个字节组成字符串
4.使用指定的字符数组构造字符串
char[] chs = {'a','b','c','d','e','爱','y','y'};
String s = new String(chs);
5.使用指定字符数组的一部分构造字符串
String s = new String(chs,5,3);
6.将字符串常量的值转换为字符串
String s = new String("abcde");
也可以写作:String s = "abcde";
String类中==和equals的区别:
请先看以下代码,能否全部理解:
1 public class StringDemo2 { 2 public static void main(String[] args) { 3 String s="hello"; 4 String s1=new String("hello"); 5 String s2="world"; 6 String s3="helloworld"; 7 8 System.out.println(s==s1); 9 System.out.println(s.equals(s1)); 10 System.out.println(s3==s1+s2); 11 System.out.println(s3.equals(s1+s2)); 12 System.out.println(s3=="hello"+"world"); 13 System.out.println(s3.equals("hello"+"world")); 14 } 15 }
通过上面的代码,应该可以发现:
==对比的是栈内的地址值,而equals对比的是方法区中的字符串常量值。
因此,eauals比较好理解,常量值即字面值,一眼就能看出来是否相等,难的是地址值的比较。
首先,我们要理解常量值转换为了字符串的两种方式有什么区别?
String s = "hello"; 实际只有栈中创建了一个对象s,该对象直接指向方法区中的字符串常量池。
String s1 = new String("hello");除了在栈中创建了一个对象s1,还在堆中new了一个对象,
s1先是指向new对象的地址值,new对象的地址值再指向方法区中的字符串常量池。
由此可见,s和s1的地址值是不同的,但字符串常量值都是方法区中的同一个。
其次,字符串的拼接如何去理解?
如果两个字符串是变量相加,那么需要先开空间,再拼接,这个新开的空间就相当于是一个新的地址。
比如s3 == s1+s2,新开空间的地址与s3的地址肯定不相等。
如果两个字符串是常量相加,那么常量值直接拼接,再去常量池中找对应的值,如果有就直接返回,否则就创建。
比如s3 == "hello" + "world",两个常量值拼接后就等于s3的常量池,所以两者相等。
String类的常见功能
一.判断功能
这是String类最常见的功能,比如软件的登录框就需要判断用户名和密码是否正确。
常用方法:
boolean equals(Object obj):比较字符串内容是否相同(区分大小写)
boolean equalsIgnoreCase(String str):比较字符串内容是否相同(忽略大小写)
boolean contains(String str):判断大字符串中是否包含小字符串
boolean startsWith(String str):判断字符串是否以某个指定的字符串开头
boolean endsWith(String str):判断字符串是否以某个指定的字符串结尾
boolean isEmpty():判断字符串是否为空
注意:
String s = ""; //内容为空
String s = null; //对象为空(当对象为空时,方法都无法调用)
练习:写一个在控制台上的登录功能程序。
要求:1.建一个测试类,在控制台上模拟登录功能,给3次机会,并提示还有几次机会;
2.建一个猜数字功能类,登录成功后即可进行猜数字游戏。
代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 package cn.itcast_03; 2 3 import java.util.Scanner; 4 5 /* 6 * 模拟登录,给三次机会,并提示还有几次 7 * 登录成功,即可以玩猜数字游戏 8 */ 9 public class StringTest2 { 10 public static void main(String[] args) { 11 // 定义用户名和密码 12 String username = "admin"; 13 String password = "admin"; 14 for (int x = 0; x < 3; x++) { 15 // 键盘录入用户名和密码 16 Scanner sc = new Scanner(System.in); 17 System.out.println("请输入用户名:"); 18 String name = sc.nextLine(); 19 System.out.println("请输入密码:"); 20 String pwd = sc.nextLine(); 21 // 比较用户和密码 22 if (name.equals(username) && pwd.equals(password)) { 23 System.out.println("登录成功,开始玩游戏!"); 24 //调用功能类GuessNumberGame 25 GuessNumberGame.start(); 26 break; 27 } else { 28 if ((2 - x) == 0) { 29 System.out.println("你的机会已用完,系统已锁定!"); 30 } else { 31 System.out.println("用户名或密码错误,请重新输入!你还有" + (2 - x) + "次机会"); 32 } 33 } 34 } 35 } 36 }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 package cn.itcast_03; 2 3 import java.util.Scanner; 4 5 public class GuessNumberGame { 6 private GuessNumberGame() { 7 8 } 9 10 public static void start() { 11 int number = (int) (Math.random() * 100 + 1); 12 13 while (true) { 14 Scanner sc = new Scanner(System.in); 15 System.out.println("请输入你要猜的数据(1-100):"); 16 int guessNumber = sc.nextInt(); 17 18 if (guessNumber > number) { 19 System.out.println("你猜的数据" + guessNumber + "大了"); 20 } else if (guessNumber < number) { 21 System.out.println("你猜的数据" + guessNumber + "小了"); 22 } else { 23 System.out.println("恭喜你,猜中了!"); 24 break; 25 } 26 } 27 } 28 }
二.获取功能
常用方法:
int length():获取字符串的长度
char charAt(int index):获取指定索引位置的字符
int indexOf(int ch):返回指定字符第一次出现的位置索引
int indexOf(String str):返回指定字符串第一次出现位置的索引
int indexOf(int ch,int fromIndex):返回指定字符在指定位置后第一次出现的位置的索引
int indexOf(String str,int fromIndex):返回指定字符串在指定位置后第一次出现的位置的索引
String substring(int start):从指定位置开始截取字符串,默认到末尾(结果包含start这个位置的值)
String substring(int start,int end):从指定位置开始,到指定位置结束截取字符串(结果包含start但不包含end位置的值)
练习:写一个程序,统计指定字符串中大写字母、小写字母、数字的数量分别是多少
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 package cn.itcast_04; 2 3 /* 4 * 需求:统计一个字符串中大写字母字符,小写字母字符,数字字符出现的次数(不考虑其他字符) 5 */ 6 public class StringTest2 { 7 public static void main(String[] args) { 8 String s = "Hello124World"; 9 10 int bigCount = 0; 11 int smallCount = 0; 12 int numberCount = 0; 13 for (int x = 0; x < s.length(); x++) { 14 char ch=s.charAt(x);//选 遍历再判断 15 if(ch>='a'&&ch<='z') { 16 smallCount++; 17 }else if(ch>='A'&&ch<='Z') { 18 bigCount++; 19 }else if(ch>='0'&&ch<='9') { 20 numberCount++; 21 } 22 } 23 System.out.println("大小字母数:" + bigCount + ",小写字母数:" + smallCount + ",数字数:" + numberCount); 24 } 25 }
三.转换功能
常用方法:
byte[] getBytes():把字符串转换为字符数组
char[] toCharArray():把字符串转换为字符数组
static String valueOf(char[] chs):把字符数组转成字符串
static String valueOf(int i):把Int类型的值转成字符串(valueOf可以把任意类型的数据转成字符串)
String toLowerCase():把字符串转成小写(产生一个新的字符串,原来的不会变)
String toUpperCase():把字符串转成大写(产生一个新的字符串,原来的不会变)
String concat(String str):把字符串拼接
练习:将一个字符串的首字母转换成大写,其余为小写。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 package cn.itcast_05; 2 3 /* 4 * 首字母转成大写,其余为小写 5 */ 6 public class StringTest { 7 public static void main(String[] args) { 8 String s = "helloworld"; 9 10 String s1 = s.substring(0, 1).toUpperCase(); 11 String s2 = s.substring(1).toLowerCase(); 12 String ss = s1.concat(s2); 13 System.out.println(ss); 14 } 15 }
四.其它功能
1.替换功能
String replace(char old,char new):用新的字符替换旧的字符。
String replace(String old,String new):用新的字符串替换旧的字符串。
2.去除字符段的两空格
String trim():去掉字符串前后两端的空格。(中间的空格不会去掉)
3.按字典顺序比较两个字符串
int compareTo(String str):从首字母开始进行对比,如果第一个字母相同,就继续比第二个字母。
int compareToIgnoreCase(String str):忽略大小写进行对比。
练习:将键盘输入的字符串进行反转。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 package cn.itcast_07; 2 3 import java.util.Scanner; 4 5 /* 6 * 字符串反转 7 */ 8 public class StringDemo3 { 9 public static void main(String[] args) { 10 Scanner sc = new Scanner(System.in); 11 System.out.println("请输入一个字符串:"); 12 String line = sc.nextLine(); 13 System.out.println(reverse(line)); 14 System.out.println(reverse2(line)); 15 } 16 //方法一 17 public static String reverse(String str) { 18 String result=""; 19 for(int x=str.length()-1;x>=0;x--) { 20 result+=str.charAt(x); 21 } 22 return result; 23 } 24 //方法二:将字符串转成字符数组后再遍历 25 public static String reverse2(String str) { 26 String result=""; 27 char[] chs=str.toCharArray(); 28 for(int x=chs.length-1;x>=0;x--) { 29 result+=chs[x]; 30 } 31 return result; 32 } 33 }