Java基础-字符串(String)常用方法

                                作者:尹正杰

版权声明:原创作品,谢绝转载!否则将追究法律责任。

 

 

 

 

一.java的API概念

  Java的API(API:Application(应用) Programming(程序) Interface(接口))就是JDK中提供给我们的类,这些类将底层的代码封装了起来 ,我们不需要关心这些类是如何实现的,只需要学习这些类如何使用即可。

  在JDK安装目录下有个src.zip文件,这个文件解压缩后里面的内容是所有java类的源文件,可以在其中查看相应类的源码。我们每次查看类中的方法时,都打开源代码进行查看,这种方式过于麻烦。其实,我们可以通过查帮助文档的方式,来了解Java提供的API如何使用。如下图操作(我们以查看String类为例):

 Java基础-字符串(String)常用方法

  如何查看类中的方法,我们需要选择相应的方法按钮即可:

Java基础-字符串(String)常用方法

  如果想要查看文件当的详细信息,可以按照如下的操作进行:

Java基础-字符串(String)常用方法

  查看方法的详细信息:

Java基础-字符串(String)常用方法

  想要知道该方法的效果是咋样的吗?很简单的啊,在IDE体会一下不就OK了吗?

 1 /*
 2 @author :yinzhengjie
 3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
 4 EMAIL:y1053419035@qq.com
 5 */
 6 
 7 package cn.org.yinzhengjie.test01;
 8 
 9 public class StringDemo {
10     public static void main(String[] args) {
11         String Name = "yinzhengjie";
12         System.out.println(Name.charAt(5));        //查看下标索引为6的字符。
13     }
14 }
15 
16 
17 /*
18  * 以上代码执行结果如下:
19  * e
20  */

 

二.Object类

  在以前的学习过程中,我们都在学习对象基本特征,对象的使用以及对象的关系。接下来我们开始使用对象做事情,那么在使用对象做事情之前,我们要学习一些API中提供的常用对象。首先来学习API中的Object这个类。

1>.Object类概述

  object类是Java语言中的根类,即所有类的父类。它中描述的所有方法子类都可以使用。所有类在创建对象的时候,最终找的父类就是Object。在Object类众多方法中,我们先学习equals方法和toString方法,其它的我会陆续给大家分享。

2>.equals方法比较内存地址

    指示其他某个对象是否与此对象“相等”。

Java基础-字符串(String)常用方法

   既然Object是所有类的祖宗,相当于女娲娘娘~那么女娲娘娘的一些特性自然会被其子类继承,也就是说我们之前定义的每一个类中都自动继承了Object的所有方法属性。比如我们定义一个Person类,并生成2个我们自定义的类,让新生成的两个类进行比较。

 1 /*
 2 @author :yinzhengjie
 3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
 4 EMAIL:y1053419035@qq.com
 5 */
 6 
 7 package cn.org.yinzhengjie.test01;
 8 
 9 class Person{
10     private String Name;
11     private int Age;
12     
13     public Person(String name, int age) {
14         Name = name;
15         Age = age;
16     }
17     
18     public Person() {}
19     
20     public String getName() {
21         return Name;
22     }
23     public void setName(String name) {
24         Name = name;
25     }
26     public int getAge() {
27         return Age;
28     }
29     public void setAge(int age) {
30         Age = age;
31     }
32     
33     /*
34      * 将父类的equals方法歇过来,重写父类的方法,但是不改变方法的源代码,方法equals比较两个对象的内存地址。
35      */
36     public boolean equals(Object obj) {
37         return this == obj;
38     }
39 }
40 
41 
42 public class PersonDemo {
43 
44     public static void main(String[] args) {
45         //Person类继承Object类,继承下来了父类的方法equals。
46         Person p1 = new Person("尹正杰",18);
47         Person p2 = new Person("yinzhengjie",18);
48         
49         //Person对象p1,调用父类的方法equals,进行对象的比较。
50         boolean b = p1.equals(p2);
51         System.out.println(b);
52     }
53 }
54 
55 
56 
57 
58 /*
59  * 以上代码执行结果如下:
60  * false
61  * */

   为什么我们看到的是一个布尔值呢?其实这都是equals方法在搞鬼。在equals的方法中只有一个返回值“this == obj;”,看起来很简单不是吗?this关键字指的是调用者自己,很明显我们上面的代码调用者就是p1这个对象。那obj又是谁呢?当然是传递的参数对象啦,也就是我们代码中的P2,引用数据类型的比较当然是比较的是对象内存的地址,很显然p1和p2都是在堆内存中new出来的2个不同的内存地址,因此返回的值为false。

3>.重写equals方法

  两个对象比较地址是没有任何意义的,因为内存的地址就没有可比性,就好比现实生活中我家地址在北京朝阳区,你家地址在北京海淀区,这有什么可比较性呢?地址自然是不一一的!而内存地址主要的作用是存储数据的。因此比较数据的内存地址是无意义的,而我们比较两个对象的成员变量还是有实际意义的。

  我们可以把上面的代码进行改写,我们可以比较两个人的年龄是否相同,如果想用就返回true,如果不想同就返回false。

 1 /*
 2 @author :yinzhengjie
 3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
 4 EMAIL:y1053419035@qq.com
 5 */
 6 
 7 package cn.org.yinzhengjie.test01;
 8 
 9 class Person{
10     private String Name;
11     private int Age;
12     public Person(String name, int age) {
13         Name = name;
14         Age = age;
15     }    
16     public Person() {}
17     
18     public String getName() {
19         return Name;
20     }
21     public void setName(String name) {
22         Name = name;
23     }
24     public int getAge() {
25         return Age;
26     }
27     public void setAge(int age) {
28         Age = age;
29     }
30     /*
31      * 复写父类的equals方法,实现自己的比较方式,注意传入的obj其类型指向的是Object,用到的就是多态特性!
32      */
33     public boolean equals(Object obj) {
34         //1>.判断当前调用者equals方法的对象和传递进来的对象是否是同一个。
35         if(this == obj) {
36             return true;
37         }
38         //2>.判断传递进来的对象是否是Person类型
39         if(!(obj instanceof Person)) {
40             return false;
41         }
42         //3>.将obj向下转型,访问其属性
43         Person p = (Person)obj;
44         return this.Age == p.Age;
45         
46     }
47 }
48 
49 
50 public class PersonDemo {
51 
52     public static void main(String[] args) {
53         //Person类继承Object类,继承下来了父类的方法equals。
54         Person p1 = new Person("尹正杰",18);
55         Person p2 = new Person("yinzhengjie",18);
56         
57         //Person对象p1,调用重写后的equals方法。比较的是两个人的连年龄。
58         boolean b = p1.equals(p2);
59         System.out.println(b);
60     }
61 }
62 
63 
64 
65 
66 /*
67  * 以上代码执行结果如下:
68  * true
69  * */

4>.重写toString方法

 1 /*
 2 @author :yinzhengjie
 3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
 4 EMAIL:y1053419035@qq.com
 5 */
 6 
 7 package cn.org.yinzhengjie.test01;
 8 
 9 class Person{
10     private String Name;
11     private int Age;
12     public Person(String name, int age) {
13         Name = name;
14         Age = age;
15     }    
16     public Person() {}
17     
18     public String getName() {
19         return Name;
20     }
21     public void setName(String name) {
22         Name = name;
23     }
24     public int getAge() {
25         return Age;
26     }
27     public void setAge(int age) {
28         Age = age;
29     }
30     //toString()方法是输出语句默认调用方法。
31     public String toString() {
32         return Name + Age;
33     }
34 }
35 
36 
37 public class PersonDemo {
38 
39     public static void main(String[] args) {
40         
41         Person p1 = new Person("尹正杰",18);
42         
43         //调用Person类的方法toString(),很显然,在输出语句中,写的一个对象,默认调用的toString方法。
44         System.out.println(p1);
45         System.out.println(p1.toString());
46         
47     }
48 }
49 
50 
51 
52 
53 /*
54  * 以上代码执行结果如下:
55  * true
56  * */

 

三.String类

1>.String类的概述

  参考Java的API文档,发现String 类代表字符串。Java 程序中的所有字符串字面值(如 "abc" )都作为此类的实例实现。 字符串是常量;它们的值在创建之后不能更改(换句话说,字符串是一个常量,一旦创建String 对象就不能改变)。字符串缓冲区支持可变的字符串。我们可以理解只要用双引号(" ")引起来的都是字符串。

 1 /*
 2 @author :yinzhengjie
 3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
 4 EMAIL:y1053419035@qq.com
 5 */
 6 
 7 package cn.org.yinzhengjie.demo;
 8 
 9 public class StringDemo1 {
10     public static void main(String[] args) {
11         String Name = "yinzhengjie";
12         System.out.println(Name);
13         Name = "尹正杰";
14         System.out.println(Name);
15     }
16 }
17 
18 
19 /*
20  * 以上代码执行结果如下:
21  * yinzhengjie
22  * 尹正杰
23  * 
24  */

  我们所说的对象不变指的是字符串本身,要知道字符串本身就是一个对象,运行的时候,字符串对象在堆内存中。以上程序中引用变量“Name”指向内存地址发生变化啦,但是定义好的字符串对象("yinzhengjie","尹正杰")是不变的哟,我们可以来画一张图来帮助理解。如下:

Java基础-字符串(String)常用方法

2>.String特征之一不可变性

Java基础-字符串(String)常用方法

  字符串的本质就是一个字符数组,不信你可以查看源码, 下图是我在java9.0版本的源码查看到的相关代码。

Java基础-字符串(String)常用方法

3>.String类创建方式和比较

   字符串有大量的重载的构造方法,通过String类的构造方法可以完成字符串对象的创建,那么,通过使用双引号的方式创建对象与new的方式创建对象,有上面不同呢?

 1 /*
 2 @author :yinzhengjie
 3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
 4 EMAIL:y1053419035@qq.com
 5 */
 6 
 7 package cn.org.yinzhengjie.demo;
 8 
 9 public class StringDemo1 {
10     public static void main(String[] args) {
11         String Name1 = new String("尹正杰");
12         System.out.println(Name1);
13         String Name2 = "尹正杰";
14         System.out.println(Name2);
15         
16         //引用数据类型,比较对象的地址
17         System.out.println(Name1 == Name2);        //false    
18         //String类继承了Object,重写了父类的方法equals,建立了字符串自己的比较方式,字符串中的每个字符是否相同。
19         System.out.println(Name1.equals(Name2));//ture
20     }
21 }
22 
23 
24 /*
25  *以上代码执行结果如下:
26  *尹正杰
27  *尹正杰
28  *false
29  *true
30  */

  以上代码判断“Name1”和"Name2"的内存地址是否相同,答案是否定的,因为,用new关键字创建字符串时,会自动在堆内存开辟一块单独的内存空间,我们可以简单的画图如下:

Java基础-字符串(String)常用方法

  而后面又比较了"Name1"与"Name2"的值是否相同,我们用肉眼就已经看出来了,答案是肯定的,没错,Java源代码设计也是这样的(他们比较的是对象中存储的value是否都相同,如果相同则返回ture.),具体代码如下:

Java基础-字符串(String)常用方法

4>.String类构造方法

 a>.传递字节数组("String(byte[] bytes);")

  通过使用平台(操作系统)的默认字符集(操作系统的默认编码表,如Windows默认字符编码是GBK,Linux默认编码是UTF-8等,不过不管你是那种默认编码都是兼容了ACSSI编码表的哟!)解码指定的byte数组,构造一个新的String。换句话说,该方法是将字节数中的每个字节,查询了编码表,得到的结果。字节是负数,汉字的字节编码就是负数,默认编码表,一个汉字采用2个字节表示。具体代码如下:

 1 /*
 2 @author :yinzhengjie
 3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
 4 EMAIL:y1053419035@qq.com
 5 */
 6 
 7 package cn.org.yinzhengjie.demo;
 8 
 9 public class StringDemo1 {
10     public static void main(String[] args) {
11         function();
12     }
13     
14     public static void function() {
15         byte[] bytes = {97,98,99,100};
16         //调用String类的构造方法,传递字节数组。
17         String s1 = new String(bytes);
18         System.out.println(s1);
19         
20         //如果你的操作系统是中文版本的Windows的话,字节数组中的成员尽量成对(GBK默认是以2个字节进行编码)出现,或是偶数长度即可
21         byte[] bytes2 = {-60,-61,-62,-63,-64,-65};
22         String s2 = new String(bytes2);
23         System.out.println(s2);
24     }
25 }
26 
27 
28 /*
29  * 以上代码执行结果如下:
30  * abcd
31  * 拿铝揽
32  */
String(byte[] bytes); 用法展示

相关文章:

  • 2022-12-23
  • 2021-04-20
  • 2022-12-23
  • 2022-12-23
  • 2021-11-17
  • 2021-11-27
  • 2021-11-05
猜你喜欢
  • 2022-12-23
  • 2021-09-18
  • 2022-12-23
  • 2021-06-10
  • 2021-12-15
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案