【原】Java学习笔记022 - 字符串

 1 package cn.temptation;
 2 
 3 public class Sample01 {
 4     public static void main(String[] args) {
 5         // 字符串
 6         // 定义:String 类代表字符串。由多个字符组成的一串数据(类比:羊肉串)。字符数组可以由多个字符组成(类比,整型数组由多个整型数字组成)。
 7         
 8         // 字符串的声明及赋值
 9         // 1、String类代表字符串
10         // 2、Java 程序中的所有字符串字面值(如 "abc" )都作为String类的实例实现。(对比,之前的实例实现通过new关键字进行类的实例化获得类的对象)
11         // 3、字符串(字符串字面值)是常量,它们的值在创建后不能更改
12         // 4、因为String对象是不可变得,所以可以共享("abc"这个字符串字面值可以被不同的String类型的对象拿来引用使用)
13 //        String str = "abc";
14         
15         // 字符串String类的常用构造函数:
16         // 1、String() :初始化一个新创建的 String 对象,使其表示一个空字符序列。
17         // 2、String(byte[] bytes) :通过使用平台的默认字符集解码指定的 byte 数组,构造一个新的 String。
18         // 3、String(byte[] bytes, int offset, int length) :通过使用平台的默认字符集解码指定的 byte 子数组,构造一个新的 String。
19         // 4、String(char[] value) :分配一个新的 String,使其表示字符数组参数中当前包含的字符序列。
20         // 5、String(char[] value, int offset, int count) :分配一个新的 String,它包含取自字符数组参数一个子数组的字符。
21         // 6、String(String original) :初始化一个新创建的 String 对象,使其表示一个与参数相同的字符序列;换句话说,新创建的字符串是该参数字符串的副本。
22         
23         // 字符串String类的常用成员方法:
24         // 1、int length() :返回此字符串的长度。 
25         String string1 = new String();
26         System.out.println("string1:" + string1);        // 显示为:string1:   看到显示的结果为无内容,显然String类是没有使用Object类继承而来的toString方法
27         System.out.println("string1的长度为:" + string1.length());        // 0
28         System.out.println("-------------------------------------------------------");
29         
30 //        byte[] bytes = { 65, 66, 67, 68 };
31         byte[] bytes = { 97, 98, 99, 100 };
32         String string2 = new String(bytes);
33         System.out.println("string2:" + string2);
34         System.out.println("string2的长度为:" + string2.length());        // 4
35         System.out.println("-------------------------------------------------------");
36         
37         String string3 = new String(bytes, 1, 2);
38         System.out.println("string3:" + string3);                        // bc
39         System.out.println("string3的长度为:" + string3.length());        // 2
40         
41         // offset参数 或 length参数索引超出bytes数组的范围
42         // 执行异常:java.lang.StringIndexOutOfBoundsException: String index out of range: 5
43 //        String string4 = new String(bytes, 3, 2);
44 //        System.out.println("string4:" + string4);
45 //        System.out.println("string4的长度为:" + string4.length());
46         System.out.println("-------------------------------------------------------");
47         
48         char[] chars = { 'J', 'a', 'v', 'a', '真', '简', '单' };
49         String string5 = new String(chars);
50         System.out.println("string5:" + string5);                        // Java真简单
51         System.out.println("string5的长度为:" + string5.length());        // 7
52         System.out.println("-------------------------------------------------------");
53         
54         String string6 = new String(chars, 1, 3);
55         System.out.println("string6:" + string6);                        // ava
56         System.out.println("string6的长度为:" + string6.length());        // 3
57         
58         // offset参数 或 length参数索引超出chars数组的范围
59         // 执行异常:java.lang.StringIndexOutOfBoundsException: String index out of range: 9
60 //        String string7 = new String(chars, 5, 4);
61 //        System.out.println("string7:" + string7);                        // ava
62 //        System.out.println("string7的长度为:" + string7.length());
63         System.out.println("-------------------------------------------------------");
64         
65         String string8 = new String("中华人民共和国");
66         System.out.println("string8:" + string8);                        // 中华人民共和国
67         System.out.println("string8的长度为:" + string8.length());        // 7
68         System.out.println("-------------------------------------------------------");
69         
70         String string9 = "中华人民共和国";
71         System.out.println("string9:" + string9);                        // 中华人民共和国
72         System.out.println("string9的长度为:" + string9.length());        // 7
73     }
74 }
 1 package cn.temptation;
 2 
 3 public class Sample02 {
 4     public static void main(String[] args) {
 5         // 如何理解:字符串是常量,它们的值在创建以后不能更改?
 6         // 1、使用字符串字面值时,首先到堆内存中的方法区的字符串常量池中查找该字符串字面值是否存在,如果存在则直接拿来使用;如果不存在则创建之
 7         // 2、字符串字面量的值是常量,这个值在方法区中的字符串常量池中创建后的确没有发生过改变
 8         
 9         String str = "Java";        // 首先到堆内存中的方法区的字符串常量池中查找该字符串字面值是否存在,如果存在则直接拿来使用;如果不存在则创建"Java"字面量
10         str += "真简单";                // 等价于:str = str + "真简单";
11         // 分解:str + "真简单" -----> "Java" + "真简单",因为到字符串常量池中查找"真简单"这个字符串字面值是否存在,不存在则创建"真简单"字面量
12         //        这里的加号作为字符串的连接   -----> "Java真简单",因为到字符串常量池中查找"Java真简单"这个字符串字面值是否存在,不存在则创建"Java真简单"字面量
13         System.out.println(str);    // Java真简单
14         
15         // 上述三行语句,实际上在字符串常量池中创建了3个字符串字面量
16     }
17 }
 1 package cn.temptation;
 2 
 3 public class Sample03 {
 4     public static void main(String[] args) {
 5         /*
 6          * 1、== 做比较
 7          * A:用在基本数据类型上,比较值是否相等
 8          * B:用在引用数据类型上,比较地址值是否相同
 9          * 
10          * 2、equals 做比较
11          * A:用在引用数据类型上:如果继承自Object类型的equals,还是比较的是地制值是否相同;有内容比较的要求可以通过重写equals方法来实现比较
12          */
13         
14         // 下句是将字符串字面量赋值给String类型的变量,首先去字符串常量池中查找有没有"Java真简单"字符串实例实现,没有就创建之
15         String string1 = "Java真简单";
16         // 下句是通过new关键字在堆内存中开辟一块空间存放String类型的对象,而该构造函数会使用"Java真简单"这个字符串字面量
17         // 使用这个字符串字面量还是去字符串常量池中查找有没有"Java真简单"字符串实例,这时已经存在该字面量了,就不再创建了,直接拿着用
18         String string2 = new String("Java真简单");
19         
20         // 因为string1 和 string2 都是在栈上的声明,string1引用的是字符串字面量"Java真简单"的地址,string2引用的是在堆内存中开辟的空间地址
21         // 自然不会相同,也就判断为false
22 //        System.out.println(string1 == string2);            // false
23 //        System.out.println("string1`s hashCode:" + string1.hashCode());        // string1`s hashCode:-125004366
24 //        System.out.println("string2`s hashCode:" + string2.hashCode());        // string2`s hashCode:-125004366
25 //        
26         // String类的常用成员方法:
27         // 1、boolean equals(Object anObject) :将此字符串与指定的对象比较。
28         //        将此字符串与指定的对象比较。当且仅当该参数不为 null,并且是与此对象表示相同字符序列的 String 对象时,结果才为 true。 
29         // String类的equals方法重写了继承自Object类的equals方法,比较两个字符串对象的内容
30         System.out.println(string1.equals(string2));    // true
31         
32         // instanceof的使用:判断是否为某一类型的实现
33         System.out.println(string1 instanceof String);        // true
34         System.out.println(string2 instanceof String);        // true
35     }
36 }
37 // 查看String类的equals方法的源码
38 //public boolean equals(Object anObject) {
39 //    if (this == anObject) {
40 //        return true;
41 //    }
42 //    if (anObject instanceof String) {
43 //        String anotherString = (String)anObject;
44 //        int n = value.length;
45 //        if (n == anotherString.value.length) {
46 //            char v1[] = value;
47 //            char v2[] = anotherString.value;
48 //            int i = 0;
49 //            while (n-- != 0) {
50 //                if (v1[i] != v2[i])
51 //                    return false;
52 //                i++;
53 //            }
54 //            return true;
55 //        }
56 //    }
57 //    return false;
58 //}
 1 package cn.temptation;
 2 
 3 public class Sample04 {
 4     public static void main(String[] args) {
 5 //        String string1 = new String("Java真简单");
 6 //        String string2 = new String("Java真简单");
 7 //        System.out.println(string1 == string2);            // false
 8 //        System.out.println(string1.equals(string2));    // true
 9 //        System.out.println("string1`s hashCode:" + string1.hashCode());            // string1`s hashCode:-125004366
10 //        System.out.println("string2`s hashCode:" + string2.hashCode());            // string2`s hashCode:-125004366
11 //        System.out.println("-----------------------------------------");
12 //        
13 //        String string3 = new String("Java真简单");
14 //        String string4 = "Java真简单";
15 //        System.out.println(string3 == string4);            // false
16 //        System.out.println(string3.equals(string4));    // true
17 //        System.out.println("-----------------------------------------");
18         
19         // string5引用的字符串字面量是字符串常量池中的字面量"Java真简单"(首先也是在常量池中查找是否存在)
20         String string5 = "Java真简单";
21         // string6引用的字符串字面量就是字符串常量池中的字面量"Java真简单"
22         String string6 = "Java真简单";
23         System.out.println(string5 == string6);            // true
24         System.out.println(string5.equals(string6));    // true
25     }
26 }
 1 package cn.temptation;
 2 
 3 public class Sample05 {
 4     public static void main(String[] args) {
 5         String string1 = "Java";
 6         String string2 = "真简单";
 7         String string3 = "Java真简单";
 8         
 9         System.out.println(string3 == string1 + string2);        // false
10         // 通过反编译.class文件,发现上句其实是:
11         // System.out.println(string3 == (new StringBuilder(String.valueOf(string1))).append(string2).toString());        显然地址不一致
12         
13         System.out.println(string3.equals(string1 + string2));    // true
14         // 通过反编译.class文件,发现上句其实是:
15         // System.out.println(string3.equals((new StringBuilder(String.valueOf(string1))).append(string2).toString()));        比较的是内容,显然一致
16         System.out.println("----------------------------------------");
17         
18         System.out.println(string3 == "Java" + "真简单");        // true
19         // 通过反编译.class文件,发现上句其实是:
20         // System.out.println(string3 == "Java真简单");        显然地址一致
21         
22         System.out.println(string3.equals("Java" + "真简单"));    // true
23         // 通过反编译.class文件,发现上句其实是:
24         // System.out.println(string3.equals("Java真简单"));        比较的是内容,显然一致
25         System.out.println("----------------------------------------");
26         
27         System.out.println(string3 == string1 + "真简单");        // false
28         // 通过反编译.class文件,发现上句其实是:
29         // System.out.println(string3 == (new StringBuilder(String.valueOf(string1))).append("真简单").toString());        显然地址不一致
30         
31         System.out.println(string3 == "Java" + string2);        // false
32         // 通过反编译.class文件,发现上句其实是:
33         // System.out.println(string3 == (new StringBuilder("Java")).append(string2).toString());        显然地址不一致
34         
35         System.out.println(string3.equals(string1 + "真简单"));    // true
36         // 通过反编译.class文件,发现上句其实是:
37         // System.out.println(string3.equals((new StringBuilder(String.valueOf(string1))).append("真简单").toString()));        比较的是内容,显然一致
38         
39         System.out.println(string3.equals("Java" + string2));    // true
40         // 通过反编译.class文件,发现上句其实是:
41         // System.out.println(string3.equals((new StringBuilder("Java")).append(string2).toString()));        比较的是内容,显然一致
42         
43         /*
44          * 结论:
45          * 1、字符串变量做加法(连接)时,先去做开辟空间的事情,再去做字符串的连接
46          * 2、字符串字面量(常量)做加法(连接)时,先做字符串的连接,再去常量池中查找是否存在,存在就直接使用,不存在就创建之
47          * 3、字符串变量 和 字符串字面量做加法(连接)时,先去做开辟空间的事情,再去做字符串的连接
48          */
49     }
50 }
 1 package cn.temptation;
 2 
 3 public class Sample06 {
 4     public static void main(String[] args) {
 5         /*
 6          * String类的常用成员方法:(具有判断功能)
 7          * 1、boolean equals(Object anObject) :将此字符串与指定的对象比较。
 8          * 2、boolean equalsIgnoreCase(String anotherString) :将此 String 与另一个 String 比较,不考虑大小写。
 9          * 3、boolean contains(CharSequence s) :当且仅当此字符串包含指定的 char 值序列时,返回 true。
10          * 4、boolean startsWith(String prefix) :测试此字符串是否以指定的前缀开始。 
11          * 5、boolean startsWith(String prefix, int toffset) :测试此字符串从指定索引开始的子字符串是否以指定前缀开始。 
12          * 6、boolean endsWith(String suffix) :测试此字符串是否以指定的后缀结束。  
13          * 7、boolean isEmpty() :当且仅当 length() 为 0 时返回 true。 
14          */
15         String string1 = "Java";
16         String string2 = "java";
17         String string3 = "Java";
18         
19         System.out.println(string1.equals(string2));        // false
20         System.out.println(string1.equals(string3));        // true
21         System.out.println("-----------------------------------------");
22         
23         System.out.println(string1.equalsIgnoreCase(string2));        // true
24         System.out.println(string1.equalsIgnoreCase(string3));        // true
25         System.out.println("-----------------------------------------");
26         
27         // CharSequence不是char字符,而是字符序列。
28         // String类实现了CharSequence接口
29         // 语法错误:The method contains(CharSequence) in the type String is not applicable for the arguments (char)
30 //        System.out.println(string1.contains('a'));
31         System.out.println(string1.contains("a"));        // true
32         System.out.println(string1.contains("b"));        // false
33         System.out.println(string1.contains("va"));        // true
34         System.out.println(string1.contains("sb"));        // false
35         System.out.println("-----------------------------------------");
36         
37         System.out.println(string1.startsWith("J"));        // true
38         System.out.println(string1.startsWith("J", 0));        // true
39         System.out.println(string1.startsWith("J", 1));        // false
40         System.out.println(string1.startsWith("ava", 1));    // true
41         System.out.println("-----------------------------------------");
42         
43         System.out.println(string1.endsWith("a"));            // true
44         System.out.println(string1.endsWith("va"));            // true
45         System.out.println(string1.endsWith("Java"));        // true
46         System.out.println(string1.endsWith("av"));            // false
47         System.out.println("-----------------------------------------");
48         
49         String string4 = null;        // null值
50         String string5 = "";        // 空字符串
51         String string6 = "0";        // 字符串内容为0
52         String string7 = "null";    // 字符串内容为null
53         String string8 = " ";        // 字符串内容为一个空格
54         
55         // 执行异常:java.lang.NullPointerException
56 //        System.out.println("string4 isEmpty:" + string4.isEmpty());
57         System.out.println("string5 isEmpty:" + string5.isEmpty());        // true
58         System.out.println("string6 isEmpty:" + string6.isEmpty());        // false
59         System.out.println("string7 isEmpty:" + string7.isEmpty());        // false
60         System.out.println("string8 isEmpty:" + string8.isEmpty());        // false
61     }
62 }
 1 package cn.temptation;
 2 
 3 public class Sample07 {
 4     public static void main(String[] args) {
 5         // String类的常用成员方法:
 6         // String intern() :返回字符串对象的规范化表示形式。
 7         // 一个初始为空的字符串池,它由类 String 私有地维护。 
 8         // 当调用 intern 方法时,如果池已经包含一个等于此 String 对象的字符串(用 equals(Object) 方法确定),则返回池中的字符串。
 9         // 否则,将此 String 对象添加到池中,并返回此 String 对象的引用。 
10         // 它遵循以下规则:对于任意两个字符串 s 和 t,当且仅当 s.equals(t) 为 true 时,s.intern() == t.intern() 才为 true。 
11         // 所有字面值字符串和字符串赋值常量表达式都使用 intern 方法进行操作。
12         
13         String string1 = "Java真简单";
14         String string2 = new String("Java真简单");
15         
16         System.out.println(string1 == string2);                        // false
17         System.out.println(string1 == string2.intern());            // true
18         System.out.println(string1.intern() == string2.intern());    // true
19         
20         System.out.println(string1.equals(string2.intern()));        // true
21     }
22 }
 1 package cn.temptation;
 2 
 3 public class Sample08 {
 4     public static void main(String[] args) {
 5         // String类的使用:涉及开发习惯
 6         
 7 //        String str = "java";
 8         // 变量str被赋值为null时,如下写法会产生执行异常:java.lang.NullPointerException,因为null值没有equals方法
 9         String str = null;
10         
11         // 初始写法:
12 //        if (str.equals("javatemptation")) {
13 //            System.out.println("内容一致");
14 //        } else {
15 //            System.out.println("内容不一致");
16 //        }
17         
18         // 改进写法:因为字符串字面量一定有equals方法,所以把其放在前面,而可能有null的变量作为equals方法的参数,这样就避免了空指针异常
19         if ("javatemptation".equals(str)) {
20             System.out.println("内容一致");
21         } else {
22             System.out.println("内容不一致");
23         }
24     }
25 }
 1 package cn.temptation;
 2 
 3 import java.util.Scanner;
 4 
 5 public class Sample09 {
 6     public static void main(String[] args) {
 7         // 需求:模拟用户登录,最多可以登录三次,且每次登录失败的话提示还有几次机会
 8         
 9         // 思路:
10         // 1、有设定好的帐号和密码用来进行对比是否输入正确
11         // 2、通过Scanner类的方法接收控制台的键盘录入
12         // 3、将输入的帐号和密码与设置好的帐号和密码进行对比:一致时,登录成功;不一致时(有一个不一致和两个都不一致),登录失败,提示登录失败
13         // 4、登录次数的限制为3次,且在每次失败时提示还剩的次数
14         
15         // 设置帐号和密码
16         String username_default = "admin";
17         String password_default = "123";
18         // 设置最多登录次数
19         int maxCount = 3;
20         
21         Scanner input = new Scanner(System.in);
22         
23         for (int i = 0; i < maxCount; i++) {
24             // 接收键盘录入
25             System.out.println("输入帐号:");
26             String username = input.nextLine();
27             System.out.println("输入密码:");
28             String password = input.nextLine();
29             
30             // 判断登录是否成功
31             if (username_default.equals(username) && password_default.equals(password)) {
32                 System.out.println("登录成功!");
33                 // 登录成功时,就跳出循环
34                 break;
35             } else {
36                 // 登录失败时
37                 int temp = maxCount - 1 - i;
38                 if (temp == 0) {
39                     System.out.println("登录失败,帐号已锁定!");
40                 } else {
41                     System.out.println("登录失败,还有" + temp + "次机会!");
42                 }
43             }
44         }
45         
46         input.close();
47     }
48 }
  1 package cn.temptation;
  2 
  3 import java.util.Scanner;
  4 
  5 public class Sample10 {
  6     public static void main(String[] args) {
  7         // Sample09的写法还是面向过程的写法,我们应该具备面向对象的思想
  8         // 思考在登录这个事情中,有哪些对象?对象的行为是什么?对象的特征是什么?
  9         // 分析出:有一个用户(对象),他/她有登录这个行为,会操作帐号和密码这两个特征
 10         
 11         // 因为是由系统给予用户几次登录的机会,所以登录次数不应该属于用户,而是系统的特征
 12         // 设置最多登录次数
 13         int maxCount = 3;
 14         
 15         // 静态方法的调用,注意方法中是否有成员变量,有的话,就必须设置成员变量为静态的
 16 //        test(maxCount);
 17         
 18         // 非静态方法的调用
 19         // 写法1:常规写法
 20 //        Sample10 sample10 = new Sample10();
 21 //        sample10.test(maxCount);
 22         
 23         // 写法2:匿名对象
 24         (new Sample10()).test(maxCount); 
 25     }
 26     
 27     /**
 28      * 系统给予用户登录的操作
 29      * @param maxCount
 30      */
 31 //    public static void test(int maxCount) {        // 静态写法
 32     public void test(int maxCount) {            // 非静态写法
 33         User user = new User();
 34         
 35         // 接收键盘录入
 36         Scanner input = new Scanner(System.in);
 37         
 38         for (int i = 0; i < maxCount; i++) {
 39             // 接收键盘录入
 40             System.out.println("输入帐号:");
 41             user.setUsername(input.nextLine());
 42             System.out.println("输入密码:");
 43             user.setPassword(input.nextLine());
 44             
 45             // 判断登录是否成功
 46             if (user.checkLogin(user)) {
 47                 System.out.println("登录成功!");
 48                 // 登录成功时,就跳出循环
 49                 break;
 50             } else {
 51                 // 登录失败时
 52                 int temp = maxCount - 1 - i;
 53                 if (temp == 0) {
 54                     System.out.println("登录失败,帐号已锁定!");
 55                 } else {
 56                     System.out.println("登录失败,还有" + temp + "次机会!");
 57                 }
 58             }
 59         }
 60         
 61         input.close();
 62     }
 63 }
 64 
 65 // 抽象出一个用户类
 66 class User {
 67     // 成员变量
 68     // 帐号
 69     private String username;
 70     // 密码
 71     private String password;
 72     // 正确的用户帐号
 73     private String username_default = "admin";
 74     // 正确的用户密码
 75     private String password_default = "123";
 76     
 77     // 构造函数
 78     public User() {
 79         super();
 80     }
 81     
 82     public User(String username, String password) {
 83         super();
 84         this.username = username;
 85         this.password = password;
 86     }
 87 
 88     // 成员方法
 89     public String getUsername() {
 90         return username;
 91     }
 92 
 93     public void setUsername(String username) {
 94         this.username = username;
 95     }
 96 
 97     public String getPassword() {
 98         return password;
 99     }
100 
101     public void setPassword(String password) {
102         this.password = password;
103     }
104     
105     // 自定义的成员方法
106     // 判断是否登录成功(这个成员方法功能OK,但是不够好,不够好的原因在于不够面向对象,因为这样写可能会有很长的参数列表)
107 //    public boolean checkLogin(String username, String password) {
108 //        // 判断
109 //        if (username_default.equals(username) && password_default.equals(password)) {
110 //            return true;
111 //        } else {
112 //            return false;
113 //        }
114 //    }
115     
116     // 改进写法
117     // 判断是否登录成功(传入一般类的对象,这样就可以无视参数个数了,反正都是对象的特征)
118     public boolean checkLogin(User user) {
119         if (username_default.equals(user.getUsername()) && password_default.equals(user.getPassword())) {
120             return true;
121         } else {
122             return false;
123         }
124     }
125 }
 1 package cn.temptation;
 2 
 3 public class Sample11 {
 4     public static void main(String[] args) {
 5         /*
 6          * String类的常用成员方法:(具有获取功能)
 7          * 1、int length() :返回此字符串的长度。
 8          * 2、char charAt(int index) :返回指定索引处的 char 值。
 9          * 3、int indexOf(int ch) :返回指定字符在此字符串中第一次出现处的索引。
10          * 4、int indexOf(int ch, int fromIndex) :返回在此字符串中第一次出现指定字符处的索引,从指定的索引开始搜索。
11          * 5、int indexOf(String str) :返回指定子字符串在此字符串中第一次出现处的索引。
12          * 6、int indexOf(String str, int fromIndex) :返回指定子字符串在此字符串中第一次出现处的索引,从指定的索引开始。
13          * 7、String substring(int beginIndex) :返回一个新的字符串,它是此字符串的一个子字符串。
14          * 8、String substring(int beginIndex, int endIndex) :返回一个新字符串,它是此字符串的一个子字符串。        
15          */
16         String string1 = "javatemptation";
17         System.out.println("string1`s length:" + string1.length());        // 14
18         String string2 = "";
19         System.out.println("string2`s length:" + string2.length());        // 0
20         String string3 = null;
21         // 执行产生异常:java.lang.NullPointerException        空指针异常
22 //        System.out.println("string3`s length:" + string3.length());
23         String string4 = " ";
24         System.out.println("string4`s length:" + string4.length());        // 1
25         System.out.println("-----------------------------------------------------------");
26         
27         System.out.println("string1.charAt(7):" + string1.charAt(7));    // p
28         // 执行产生异常:java.lang.StringIndexOutOfBoundsException: String index out of range: 20        索引越界异常
29 //        System.out.println("string1.charAt(20):" + string1.charAt(20));
30         System.out.println("string1.charAt(13):" + string1.charAt(13));        // n
31         System.out.println("-----------------------------------------------------------");
32         
33         System.out.println("string1.indexOf(106):" + string1.indexOf(106));        // 106表示的是j        0
34         System.out.println("string1.indexOf(97):" + string1.indexOf(97));        // 97表示的是a        1
35         // 返回:在此对象表示的字符序列中第一次出现该字符的索引;如果未出现该字符,则返回 -1。
36         System.out.println("string1.indexOf(98):" + string1.indexOf(98));        // 98表示的是b        -1
37         System.out.println("-----------------------------------------------------------");
38         
39         System.out.println("string1.indexOf(106, 0):" + string1.indexOf(106, 0));    // 106表示的是j        0
40         // 返回:在此对象表示的字符序列中第一次出现的大于或等于 fromIndex 的字符的索引;如果未出现该字符,则返回 -1。
41         System.out.println("string1.indexOf(106, 1):" + string1.indexOf(106, 1));    // j    -1
42         System.out.println("-----------------------------------------------------------");
43         
44         System.out.println("string1.indexOf(\"av\"):" + string1.indexOf("av"));        // av     1
45         // 返回:如果字符串参数作为一个子字符串在此对象中出现,则返回第一个这种子字符串的第一个字符的索引;如果它不作为一个子字符串出现,则返回 -1。
46         System.out.println("string1.indexOf(\"vb\"):" + string1.indexOf("vb"));        // vb    -1
47         System.out.println("-----------------------------------------------------------");
48         
49         // 返回:指定子字符串在此字符串中第一次出现处的索引,从指定的索引开始。
50         System.out.println("string1.indexOf(\"av\", 0):" + string1.indexOf("av", 0));    // av        1
51         System.out.println("string1.indexOf(\"av\", 1):" + string1.indexOf("av", 1));    // av        1
52         System.out.println("string1.indexOf(\"av\", 2):" + string1.indexOf("av", 2));    // av        -1
53         System.out.println("string1.indexOf(\"vb\", 0):" + string1.indexOf("vb", 0));    // vb    -1
54         System.out.println("-----------------------------------------------------------");
55         
56         // 参数:beginIndex - 起始索引(包括)。 
57         System.out.println("string1.substring(0):" + string1.substring(0));        // javatemptation
58         System.out.println("string1.substring(5):" + string1.substring(5));        // emptation
59         // 执行异常:java.lang.StringIndexOutOfBoundsException: String index out of range: -2        字符串索引越界异常
60 //        System.out.println("string1.substring(-2):" + string1.substring(-2));
61         // 执行异常:java.lang.StringIndexOutOfBoundsException: String index out of range: -6        字符串索引越界异常
62 //        System.out.println("string1.substring(20):" + string1.substring(20));
63         System.out.println("-----------------------------------------------------------");
64         
65         // 参数:beginIndex - 起始索引(包括)。        endIndex - 结束索引(不包括)。 
66         System.out.println("string1.substring(0, 1):" + string1.substring(0, 1));    // j
67         System.out.println("string1.substring(0, 13):" + string1.substring(0, 13));    // javatemptatio
68         System.out.println("string1.substring(0, 14):" + string1.substring(0, 14));    // javatemptation
69         // 执行异常:java.lang.StringIndexOutOfBoundsException: String index out of range: 20        字符串索引越界异常
70 //        System.out.println("string1.substring(0, 20):" + string1.substring(0, 20));
71         // 执行异常:java.lang.StringIndexOutOfBoundsException: String index out of range: -2        字符串索引越界异常
72 //        System.out.println("string1.substring(-2, 14):" + string1.substring(-2, 14));
73         // 执行异常:java.lang.StringIndexOutOfBoundsException: String index out of range: -2        字符串索引越界异常
74 //        System.out.println("string1.substring(10, 8):" + string1.substring(10, 8));
75         System.out.println("string1.substring(0, string1.length()):" + string1.substring(0, string1.length()));                // javatemptation
76         System.out.println("string1.substring(0, string1.length() - 1):" + string1.substring(0, string1.length() - 1));        // javatemptatio
77     }
78 }
 1 package cn.temptation;
 2 
 3 import java.util.Scanner;
 4 
 5 public class Sample12 {
 6     public static void main(String[] args) {
 7         // 需求:通过键盘录入,循环获取输入的一个字符串中的每一个字符并显示出来
 8         // 例如:输入:abc,显示出        a    b    c
 9         
10         String str = "";
11         
12         System.out.println("输入一个字符串:");
13         Scanner input = new Scanner(System.in);
14         if (input.hasNextLine()) {
15             str = input.nextLine();
16         } else {
17             System.out.println("输入的不正确!");
18         }
19         input.close();
20         
21         for (int i = 0; i < str.length(); i++) {
22             System.out.print(str.charAt(i) + "\t");
23         }
24     }
25 }
 1 package cn.temptation;
 2 
 3 import java.util.Scanner;
 4 
 5 public class Sample13 {
 6     public static void main(String[] args) {
 7         // 需求:根据键盘录入的一个字符串(仅限于有大写英文、小写英文和数字),统计一下该字符串中大写英文字符有多少个?小写英文字符有多少个?数字字符有多少个?
 8         // 例如:"Java123456":大写1个、小写3个、数字6个
 9         
10         // 思路:(人为控制输入格式的版本)
11         // 1、接收键盘录入的字符串,循环取得该字符串的每一个字符
12         // 2、判断每一个字符是大写,还是小写,还是数字
13         // 3、分类做累加
14         
15         String str = "";
16         // 大写英文字符的个数
17         int upperCount = 0;
18         // 小写英文字符的个数
19         int lowerCount = 0;
20         // 数字字符的个数
21         int numberCount = 0;
22         
23         System.out.println("输入一个字符串(仅限于有大写英文、小写英文和数字):");
24         Scanner input = new Scanner(System.in);
25         if (input.hasNextLine()) {
26             str = input.nextLine();
27         } else {
28             System.out.println("输入不正确!");
29         }
30         input.close();
31         
32         for (int i = 0; i < str.length(); i++) {
33             // 获取单个字符
34             char temp = str.charAt(i);
35             
36             // 判断写法1
37 //            if (temp >= 65 && temp <= 90) {        // 大写英文字符
38 //                upperCount++;
39 //            } else if (temp >= 97 && temp <= 122) {        // 小写英文字符
40 //                lowerCount++;
41 //            } else if(temp >= 48 && temp <= 57) {        // 数字字符
42 //                numberCount++;
43 //            }
44             
45             // 判断写法2
46             if (temp >= 'A' && temp <= 'Z') {        // 大写英文字符
47                 upperCount++;
48             } else if (temp >= 'a' && temp <= 'z') {        // 小写英文字符
49                 lowerCount++;
50             } else if(temp >= '0' && temp <= '9') {            // 数字字符
51                 numberCount++;
52             }
53         }
54         
55         System.out.println("字符串:" + str + "中,大写英文字符有:" + upperCount + "个,小写英文字符有:" 
56                 + lowerCount + "个,数字字符有:" + numberCount + "个");
57     }
58 }
 1 package cn.temptation;
 2 
 3 import java.util.Scanner;
 4 
 5 public class Sample14 {
 6     public static void main(String[] args) {
 7         // 需求:根据键盘录入的一个字符串(仅限于有大写英文、小写英文和数字),统计一下该字符串中大写英文字符有多少个?小写英文字符有多少个?数字字符有多少个?
 8         // 例如:"Java123456":大写1个、小写3个、数字6个
 9         
10         // 思路:(程序控制输入格式的版本)
11         // 1、接收键盘录入的字符串,循环取得该字符串的每一个字符
12         // 2、判断每一个字符是大写英文、还是小写英文、还是数字,如果都不是,那么就是不正确的输入,应该提示让其重新输入;否则进行统计
13         // 3、对于输入正确格式的字符串,循环获取每一个字符并进行判断统计
14         
15         Scanner input = new Scanner(System.in);
16         
17         String str = "";
18         // 大写英文字符的个数
19         int upperCount = 0;
20         // 小写英文字符的个数
21         int lowerCount = 0;
22         // 数字字符的个数
23         int numberCount = 0;
24                 
25         for(;;) {
26             // 声明统计执行判断标识
27             boolean flag = true;
28             
29             // 1、判断操作,看看输入格式是否正确
30             System.out.println("输入一个字符串(仅限于有大写英文、小写英文和数字):");
31             if (input.hasNextLine()) {
32                 str = input.nextLine();
33             } else {
34                 System.out.println("输入的内容不是字符串!");
35                 break;
36             }
37             
38             // 对输入的字符串的格式进行判断
39             for (int i = 0; i < str.length(); i++) {
40                 char temp = str.charAt(i);
41                 
42                 if (!((temp >= 'A' && temp <= 'Z') || (temp >= 'a' && temp <= 'z') || (temp >= '0' && temp <= '9'))) {
43                     // 大写英文字符、小写英文字符、数字字符之外的都是不正确的格式
44                     System.out.println("输入的字符串格式不正确,仅限有大写英文、小写英文和数字!");
45                     flag = false;
46                     // 考虑:这里使用break? 还是使用continue?
47                     // 因为只要有一个字符是不合规则的字符,就不用再判断其他字符是否符合规则了,所以使用break跳出内层for循环
48                     break;
49                 }
50             }
51             
52             // 2、统计操作
53             if (flag) {
54                 for (int i = 0; i < str.length(); i++) {
55                     // 获取单个字符
56                     char temp = str.charAt(i);
57                     
58                     // 判断写法1
59 //                    if (temp >= 65 && temp <= 90) {        // 大写英文字符
60 //                        upperCount++;
61 //                    } else if (temp >= 97 && temp <= 122) {        // 小写英文字符
62 //                        lowerCount++;
63 //                    } else if(temp >= 48 && temp <= 57) {        // 数字字符
64 //                        numberCount++;
65 //                    }
66                     
67                     // 判断写法2
68                     if (temp >= 'A' && temp <= 'Z') {        // 大写英文字符
69                         upperCount++;
70                     } else if (temp >= 'a' && temp <= 'z') {        // 小写英文字符
71                         lowerCount++;
72                     } else if(temp >= '0' && temp <= '9') {            // 数字字符
73                         numberCount++;
74                     }
75                 }
76                 
77                 System.out.println("字符串:" + str + "中,大写英文字符有:" + upperCount + "个,小写英文字符有:" 
78                         + lowerCount + "个,数字字符有:" + numberCount + "个");
79                 
80                 // 正确的格式输入后,进行统计操作,操作结束后跳出当前的外层循环(死循环)
81                 break;
82             }
83         }
84         
85         input.close();
86     }
87 }
 1 package cn.temptation;
 2 
 3 public class Sample15 {
 4     public static void main(String[] args) {
 5         /*
 6          * String类的常用成员方法:(具有转换功能)
 7          * 1、byte[] getBytes() :使用平台的默认字符集将此 String 编码为 byte 序列,并将结果存储到一个新的 byte 数组中。
 8          * 2、char[] toCharArray() :将此字符串转换为一个新的字符数组。
 9          * 3、static String valueOf(char[] data) :返回 char 数组参数的字符串表示形式。
10          * 4、static String valueOf(int i) :返回 int 参数的字符串表示形式。
11          * 5、String toLowerCase() :使用默认语言环境的规则将此 String 中的所有字符都转换为小写。
12          * 6、String toUpperCase() :使用默认语言环境的规则将此 String 中的所有字符都转换为大写。
13          * 7、String concat(String str) :将指定字符串连接到此字符串的结尾。       
14          */
15         
16         String string1 = "javatemptation";
17         
18         // 将字符串转换为byte数组
19         byte[] arrByte = string1.getBytes();
20         for (byte item : arrByte) {
21             System.out.println(item);
22         }
23         System.out.println("------------------------------------------------------");
24         
25         // 将字符串转换为char数组
26         char[] arrChar = string1.toCharArray();
27         for (char item : arrChar) {
28             System.out.println(item);
29         }
30         System.out.println("------------------------------------------------------");
31         
32         // 将字符数组转换为字符串(与上述方法是可逆操作)
33         String string2 = String.valueOf(arrChar);
34         System.out.println(string2);
35         System.out.println("------------------------------------------------------");
36         
37         int i = 97;
38         // int类型转换成字符串类型的方法1
39 //        String string3 = String.valueOf(i);
40 //        System.out.println(string3);            // 97
41 //        
42 //        String string4 = String.valueOf((char)i);
43 //        System.out.println(string4);            // a
44 //        
45 //        String string5 = String.valueOf((int)'a');
46 //        System.out.println(string5);            // 97
47         
48         //  int类型转换成字符串类型的方法2
49         System.out.println(i + "");                // 97
50         System.out.println("" + i);                // 97
51         System.out.println(" " + i);            // 空格97
52         System.out.println((String)(i + ""));    // 97
53         // 语法错误:Invalid character constant
54 //        System.out.println(i + '');
55         // 语法错误:Char cannot be resolved to a type
56 //        System.out.println((char)(i + ""));
57         System.out.println("------------------------------------------------------");
58         
59         String string6 = "JAVATEMPTATION";
60         System.out.println(string6.toLowerCase());        // javatemptation
61         System.out.println("------------------------------------------------------");
62         
63         String string7 = "javatemptation";
64         System.out.println(string7.toUpperCase());        // JAVATEMPTATION
65         System.out.println("------------------------------------------------------");
66         
67         String string8 = "offerfirstblood";
68         System.out.println(string1.concat(string8));    // javatemptationofferfirstblood
69     }
70 }
  1 package cn.temptation;
  2 
  3 import java.util.Scanner;
  4 
  5 public class Sample16 {
  6     public static void main(String[] args) {
  7         // 需求:根据键盘录入一个字符串(仅限大写英文字符和小写英文字符),显示该字符串,且转换该字符串为首字符大写,其他字符均小写,并显示转换后的字符串
  8         // 例如:"javaTEMPTATION" ------> "Javatemptation"
  9         String str = "";
 10         
 11         System.out.println("录入一个字符串(仅限大写英文字符和小写英文字符):");
 12         Scanner input = new Scanner(System.in);
 13         if (input.hasNextLine()) {
 14             str = input.nextLine();
 15         } else {
 16             System.out.println("输入的格式不正确!");
 17         }
 18         input.close();
 19         
 20         // 思路1:
 21         // 1、获取输入的字符串,循环遍历得到每一个字符
 22         // 2、判断第一个字符是否为大写字符,如果不是,转为大写
 23         // 3、判断从第二个字符到最后一个字符是否为小写字符,如果不是,转为小写
 24         // 4、将转换后的字符组成字符串输出
 25 //        char[] arrChar = new char[str.length()];
 26 //        
 27 //        for (int i = 0; i < arrChar.length; i++) {
 28 //            char temp = str.charAt(i);
 29 //            
 30 //            if (i == 0) {        // 第一个字符
 31 //                if (temp >= 'a' && temp <= 'z') {
 32 //                    // 小写字符转换为大写字符
 33 //                    temp -= 32;
 34 //                }
 35 //            } else {            // 从第二个字符到最后一个字符
 36 //                if (temp >= 'A' && temp <= 'Z') {
 37 //                    // 大写字符转换为小写字符
 38 //                    temp += 32;
 39 //                }
 40 //            }
 41 //            
 42 //            arrChar[i] = temp;
 43 //        }
 44 //        
 45 //        System.out.println("转换后的字符串为:" + String.valueOf(arrChar));
 46         
 47         // 思路2:
 48         // 1、获取输入的字符串,直接转为char数组
 49         // 2、判断第一个字符是否为大写字符,如果不是,转为大写
 50         // 3、判断从第二个字符到最后一个字符是否为小写字符,如果不是,转为小写
 51         // 4、将转换后的字符组成字符串输出
 52         
 53         // 写法2-1
 54 //        char[] arrChar = str.toCharArray();
 55 //        if (arrChar[0] >= 'a' && arrChar[0] <= 'z') {        // 第一个字符
 56 //            // 小写字符转换为大写字符
 57 //            arrChar[0] -= 32;
 58 //        }
 59 //        // 从第二个字符到最后一个字符判断
 60 //        for (int i = 1; i < arrChar.length; i++) {
 61 //            if (arrChar[i] >= 'A' && arrChar[i] <= 'Z') {
 62 //                // 大写字符转换为小写字符
 63 //                arrChar[i] += 32;
 64 //            }
 65 //        }
 66 //        
 67 //        System.out.println("转换后的字符串为:" + String.valueOf(arrChar));
 68         
 69         // 写法2-2
 70 //        char[] arrChar = str.toCharArray();
 71 //        // 重新定义一个char类型的数组来接收
 72 //        char[] arrCharEx = new char[arrChar.length];
 73 //        
 74 //        // 从第1个字符到最后一个字符(先都拿出来判断),如果是大写字符,转换为小写字符,
 75 //        // 因为拿出来的是一个一个的char类型的元素,判断后发生变化的元素自身,然后放入新的数组中
 76 //        int i = 0;
 77 //        for (char item : arrChar) {
 78 //            if (item >= 'A' && item <= 'Z') {
 79 //                // 大写字符转换为小写字符
 80 //                item += 32;
 81 //            }
 82 //            
 83 //            arrCharEx[i] = item;
 84 //            i++;
 85 //        }
 86 //        
 87 //        // 首字符判断,如果是小写字符转换为大写字符
 88 //        if (arrCharEx[0] >= 'a' && arrCharEx[0] <= 'z') {        // 首字符
 89 //            // 小写字符转换为大写字符
 90 //            arrCharEx[0] -= 32;
 91 //        }
 92 //        
 93 //        System.out.println("转换后的字符串为:" + String.valueOf(arrCharEx));
 94         
 95         // 写法2-3
 96 //        char[] arrChar = str.toCharArray();
 97 //        
 98 //        // 从第1个字符到最后一个字符(先都拿出来判断),如果是大写字符,转换为小写字符,
 99 //        // 因为拿出来的是一个一个的char类型的元素,判断后发生变化的元素自身,再放入原数组中
100 //        int i = 0;
101 //        for (char item : arrChar) {
102 //            if (item >= 'A' && item <= 'Z') {
103 //                // 大写字符转换为小写字符
104 //                item += 32;
105 //            }
106 //            
107 //            arrChar[i] = item;
108 //            i++;
109 //        }
110 //        
111 //        // 首字符判断,如果是小写字符转换为大写字符
112 //        if (arrChar[0] >= 'a' && arrChar[0] <= 'z') {        // 首字符
113 //            // 小写字符转换为大写字符
114 //            arrChar[0] -= 32;
115 //        }
116 //        
117 //        System.out.println("转换后的字符串为:" + String.valueOf(arrChar));
118         
119         // 思路3:
120         // 1、得到字符串
121         // 2、首字符----->子字符串变为大写
122         // 3、其他字符----->子字符串变为小写
123         // 4、拼接两个子字符串
124         
125 //        String string1 = str.substring(0, 1).toUpperCase();
126 //        String string2 = str.substring(1).toLowerCase();
127 //        System.out.println("转换后的字符串为:" + string1.concat(string2));
128         
129         // 思路4:(链式编程)
130         // 1、得到字符串
131         // 2、字符串全部变为小写
132         // 3、字符串首字符变成大写
133         // 下面两种写法等价
134 //        System.out.println("转换后的字符串为:" + str.substring(0, 1).toUpperCase().concat(str.substring(1).toLowerCase()));
135         System.out.println("转换后的字符串为:" + str.toLowerCase().substring(0, 1).toUpperCase().concat(str.substring(1).toLowerCase()));
136     }
137 }
 1 package cn.temptation;
 2 
 3 public class Sample17 {
 4     public static void main(String[] args) {
 5         /*
 6          * String类的常用成员方法:(具有替换功能)
 7          * 1、String replace(char oldChar, char newChar) :返回一个新的字符串,它是通过用 newChar 替换此字符串中出现的所有 oldChar 得到的。
 8          * 2、String replace(CharSequence target, CharSequence replacement) :使用指定的字面值替换序列替换此字符串所有匹配字面值目标序列的子字符串。  
 9          */
10         String string1 = "luck";
11         System.out.println(string1.replace('l', 'f'));        // fuck
12         System.out.println(string1);                        // luck
13         
14         String string2 = "feel";
15         System.out.println(string2.replace('e', 'o'));        // fool
16         
17         String string3 = "food";
18         System.out.println(string3.replace('e', 'a'));        // food
19         // 拿着第一个参数字符去查找,找到了就替换,找不到就不替换
20         System.out.println("--------------------------------------------------");
21         
22         System.out.println(string1.replace("lu", "clo"));    // clock
23         System.out.println(string1);                        // luck
24         
25         // 注意:replace(...)方法替换后得到的是一个新的字符串,原字符串不变
26     }
27 }
 1 package cn.temptation;
 2 
 3 public class Sample18 {
 4     public static void main(String[] args) {
 5         /*
 6          * String类的常用成员方法:(其他功能)
 7          * 1、String trim() :返回字符串的副本,忽略前导空白和尾部空白。 
 8          * 2、int compareTo(String anotherString) :按字典顺序比较两个字符串。
 9          * 3、int compareToIgnoreCase(String str) :按字典顺序比较两个字符串,不考虑大小写。  
10          */
11         String string1 = " java temptation ";
12         System.out.println("string1:" + string1 + ",length:" + string1.length());                            // string1: java temptation ,length:17
13         System.out.println("string1.trim():" + string1.trim() + ",length:" + string1.trim().length());        // string1.trim():java temptation,length:15
14         System.out.println(string1.trim() + " is good");        // java temptation is good
15         System.out.println("-----------------------------------------------");
16         
17         String string2 = "java";
18         String string3 = "java";
19         String string4 = "php";
20         String string5 = "japan";
21         
22         System.out.println(string2.compareTo(string3));            // 0
23         System.out.println(string2.compareTo(string4));            // -6    j - p
24         System.out.println(string2.compareTo(string5));            // 6    v - p
25         
26         String string6 = "java";
27         String string7 = "ja";
28         String string8 = "jav";
29         String string9 = "j";
30         
31         System.out.println(string6.compareTo(string7));            // 2
32         System.out.println(string6.compareTo(string8));            // 1
33         System.out.println(string6.compareTo(string9));            // 3
34         System.out.println("-----------------------------------------------");
35         
36         String string10 = "java";
37         String string11 = "javA";
38         
39         System.out.println(string10.compareTo(string11));                // 32        97 - 65
40         System.out.println(string10.compareToIgnoreCase(string11));        // 0
41     }
42 }
 1 package cn.temptation;
 2 
 3 public class Sample19 {
 4     public static void main(String[] args) {
 5         // 需求:把数组的内容按照一定的格式组成一个字符串
 6         // 例如:int[] arr = { 3, 5, 7, 9 };    ----->  字符串"[3, 5, 7, 9]"
 7         
 8         // 数组的内容(元素)的数据类型未知,考虑转换为Object类型
 9 //        int[] arr = { 3, 5, 7, 9 };
10 //        double[] arr = { 3.14, 5.26, 7.38 };
11         boolean[] arr = { true, false, false, true };
12         
13         // 转换为Object数组
14         Object[] arrObj = new Object[arr.length];
15         
16         for (int i = 0; i < arr.length; i++) {
17             arrObj[i] = arr[i];
18         }
19         
20         System.out.println(arrayToString(arrObj));
21     }
22     
23     /**
24      * 数组转字符串
25      * @param arr
26      * @return
27      */
28     public static String arrayToString(Object[] arr) {
29         String result = "[";
30         
31         for (int i = 0; i < arr.length; i++) {
32             if (i == arr.length - 1) {
33                 result += arr[i] + "]";
34             } else {
35                 result += arr[i] + ",";
36             }
37         }
38         
39         return result;
40     }
41 }
 1 package cn.temptation;
 2 
 3 import java.util.Scanner;
 4 
 5 public class Sample20 {
 6     public static void main(String[] args) {
 7         // 需求:通过键盘录入一个字符串,实现其反转
 8         // 例如:"abcd" -----> "dcba"
 9         String str = "";
10         
11         System.out.println("输入一个字符串:");
12         Scanner input = new Scanner(System.in);
13         if (input.hasNextLine()) {
14             str = input.nextLine();
15         } else {
16             System.out.println("输入的格式不正确!");
17         }
18         input.close();
19         
20         // 思路1:
21         // 1、获取录入的字符串
22         // 2、将其转换为字符数组
23         // 3、循环从字符数组的最后一个开始取出字符,再拼接为一个字符串输出
24         
25         // 写法1:
26 //        char[] arrChar = str.toCharArray();
27 //        String strTemp = "";
28 //        for (int i = arrChar.length - 1; i >= 0; i--) {
29 //            strTemp += arrChar[i];
30 //        }
31 //        System.out.println("反转后,字符串为:" + strTemp);
32         
33         // 思路2:
34         // 1、获取录入的字符串
35         // 2、通过charAt(...)取得每一个字符
36         // 3、通过反序拼接为一个字符串输出
37         
38         // 写法2:
39 //        String strTemp = "";
40 //        for (int i = str.length() - 1; i >= 0; i--) {
41 //            char temp = str.charAt(i);
42 //            strTemp = strTemp.concat(str.valueOf(temp));
43 //        }
44 //        System.out.println("反转后,字符串为:" + strTemp);
45         
46         // 思路3:
47         // 1、获取录入的字符串
48         // 2、将其转换为字符数组
49         // 3、首尾对调,第2个位置和倒数第2个位置对调,....直到中间
50         // 4、对调后的结果再转换为字符串输出
51         
52         // 写法3:
53         char[] arrChar = str.toCharArray();
54         for (int i = 0; i < str.length() / 2; i++) {
55             // 对调
56             char temp = arrChar[i];
57             arrChar[i] = arrChar[str.length() - 1 - i];
58             arrChar[str.length() - 1 - i] = temp;
59         }
60         System.out.println("反转后,字符串为:" + String.valueOf(arrChar));
61     }
62 }
  1 package cn.temptation;
  2 
  3 public class Sample21 {
  4     public static void main(String[] args) {
  5         // 需求:从字符串"javagoodjavabetterjavabestjavaamazing"中统计"java"出现的次数
  6         
  7 //        String str = "javagoodjavabetterjavabestjavaamazing";
  8 //        String str = "javajavajava";
  9 //        String strTemp = "java";
 10         
 11         String str = "lolol";
 12         String strTemp = "lol";
 13         
 14         // 声明出现次数变量
 15         int apperCount = 0;
 16         
 17         // 思路1:(反复使用indexOf方法和substring方法)
 18         // 1、对原字符串使用indexOf(子字符串):如果没有的话,返回-1
 19         // 2、第1次出现:"|java|goodjavabetterjavabestjavaamazing",根据出现的位置做截取,形成新的字符串"goodjavabetterjavabestjavaamazing"
 20         // 3、第2次出现:"good|java|betterjavabestjavaamazing",根据出现的位置做截取,形成新的字符串"betterjavabestjavaamazing"...
 21         // 4、重复上述操作,直到返回-1
 22         
 23         // 写法1:
 24 //        while (str.indexOf(strTemp) != -1) {
 25 //            // 找到一次子字符串,就自增一下
 26 //            apperCount++;
 27 //            
 28 //            // 以查找的字符串出现的索引位置 + 查找的字符串的长度 作为substring方法的beginIndex参数的值,用来做字符串的截取
 29 //            int beginIndex = str.indexOf(strTemp) + strTemp.length();
 30 //            str = str.substring(beginIndex);
 31 //        }
 32 //        
 33 //        System.out.println("原字符串中查找字符串:" + strTemp + "出现的次数为:" + apperCount);
 34         
 35         // 思路2:(反复使用charAt)
 36         // 1、反复使用charAt组合出j、a、v、a进行比较
 37         // 2、有满足条件的做累加
 38         
 39         // 写法2:
 40         for (int i = 0; i < str.length() - strTemp.length() + 1; i++) {
 41 //            if (str.charAt(i) == 'j' && str.charAt(i + 1) == 'a' && str.charAt(i + 2) == 'v' && str.charAt(i + 3) == 'a') {
 42 //                apperCount++;
 43 //            }
 44             
 45 //            if (str.charAt(i) == 'l' && str.charAt(i + 1) == 'o' && str.charAt(i + 2) == 'l') {
 46 //                apperCount++;
 47 //            }
 48             
 49             // 功能实现后,重新审视,觉得写的不太好,因为硬编码
 50             // 另外还要思考一个问题:1、"javajavajava";2、从"lolol"查找"lol"
 51             
 52             // 变形1
 53 //            if (str.charAt(i + 0) == 'j') {
 54 //                if (str.charAt(i + 1) == 'a') {
 55 //                    if (str.charAt(i + 2) == 'v') {
 56 //                        if (str.charAt(i + 3) == 'a') {
 57 //                            apperCount++;
 58 //                        }
 59 //                    }
 60 //                }
 61 //            }
 62             
 63             // 变形2
 64 //            if (str.charAt(i + 0) == strTemp.charAt(0)) {
 65 //                if (str.charAt(i + 1) == strTemp.charAt(1)) {
 66 //                    if (str.charAt(i + 2) == strTemp.charAt(2)) {
 67 //                        if (str.charAt(i + 3) == strTemp.charAt(3)) {
 68 //                            apperCount++;
 69 //                        }
 70 //                    }
 71 //                }
 72 //            }
 73             
 74             // 变形3
 75             // 声明判断标识
 76 //            boolean flag = true;
 77 //            if (str.charAt(i + 0) != strTemp.charAt(0)) {
 78 //                flag = false;
 79 //            }
 80 //            if (str.charAt(i + 1) != strTemp.charAt(1)) {
 81 //                flag = false;
 82 //            }
 83 //            if (str.charAt(i + 2) != strTemp.charAt(2)) {
 84 //                flag = false;
 85 //            }
 86 //            if (str.charAt(i + 3) != strTemp.charAt(3)) {
 87 //                flag = false;
 88 //            }
 89 //            if (flag) {
 90 //                apperCount++;
 91 //            }
 92             
 93             // 变形4
 94             boolean flag = true;
 95             for (int j = 0; j < strTemp.length(); j++) {
 96                 if (str.charAt(i + j) != strTemp.charAt(j)) {
 97                     flag = false;
 98                 }
 99             }
100             if (flag) {
101                 apperCount++;
102             }
103         }
104         
105         System.out.println("原字符串中查找字符串:" + strTemp + "出现的次数为:" + apperCount);
106     }
107 }

 

posted @ 2017-03-15 20:56  {name:"代码屠夫"}  阅读(542)  评论(0编辑  收藏  举报