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.建一个猜数字功能类,登录成功后即可进行猜数字游戏。

    代码:     

 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 }
View Code
 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 }
View Code

  二.获取功能

     常用方法:

      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位置的值)

    练习:写一个程序,统计指定字符串中大写字母、小写字母、数字的数量分别是多少     

 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 }
number

 

  三.转换功能

    常用方法:

      byte[] getBytes():把字符串转换为字符数组

      char[] toCharArray():把字符串转换为字符数组

      static String valueOf(char[] chs):把字符数组转成字符串

      static String valueOf(int i):把Int类型的值转成字符串(valueOf可以把任意类型的数据转成字符串)

      String toLowerCase():把字符串转成小写(产生一个新的字符串,原来的不会变)

      String toUpperCase():把字符串转成大写(产生一个新的字符串,原来的不会变)

      String concat(String str):把字符串拼接

     练习:将一个字符串的首字母转换成大写,其余为小写。  

 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 }
Translate

  四.其它功能

    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):忽略大小写进行对比。

  练习:将键盘输入的字符串进行反转。 

 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 }
reverse         
posted @ 2020-08-22 16:20  benon  阅读(212)  评论(0编辑  收藏  举报