字符串,是我们最常用的类型,每个用双引号来表示的串都是一个字符串。Java中的字符串是一个预定义的类,跟C++ 一样叫String,而不是Char数组。至于什么叫做类,暂时不做过多介绍,在之后的篇章中会有关于类的详细介绍,在这里,只需要将类理解为一个模具,就像做月饼那样,想要什么外观的月饼,就选用相应的模具一压,再往烤箱里一放,便能得到我们想要的月饼。用同一个模具所做出来的月饼基本是一样的。当然,这个比喻并不十分恰当,不过就目前而已,它是有效的。声明一个String类型的变量之后,这个变量便是String类型的一个实例,就好比模具做出来的月饼,而且能使用String类型的所有方法,也具有了String的所有属性。
String这个类有一些基本的方法,如取子串,拼接,检测是否相等 等一些常用的API。字符串处理将是我们经常用到的,所以String的熟练使用将是不可或缺的。话不多说,我们直接上代码实操。
新建项目的方法,我就不再多说了。代码如下:
1 package pers.frank.test;
2
3 public class Test {
4 public static void main(String[] args){
5 String str = "我爱Java!!!";
6 String str1 = str.substring(0,4);
7 System.out.println("str1:"+str1);
8
9 String str2 = str + "但我也爱C++。";
10 System.out.println("str2:"+str2);
11
12 String str3 = "我爱Java!!!";
13 System.out.println(str3.equals(str));
14 System.out.println(str == str3);
15 System.out.println(str.length());
16 System.out.println(str.charAt(0));
17 System.out.println(str.charAt(2));
18 System.out.println(str.charAt(4));
19
20 String str4 = "我爱JavaScript!!!";
21 System.out.println(str4.substring(0,4) == str1);
22 }
23 }
第5行定义了一个字符串变量str,并给它初始化赋值。第六行,调用了String的substring方法,取了前四个字符,这个方法一共两个参数,第一个参数代表想要取的第一个字符的位置,从0开始,第二个字符代表第一个不想取的字符的位置。所以str.substring(0,4)即取字符串str的前四个字符。
第9行定义了str2,初始化的时候将str与字符串“但我也爱C++。”用“+”号拼接了起来,组成了新的字符串。
第12行定义了str3,同样初始化赋值为“我爱Java!!!”,String的equals方法用于判断两个字符串的内容是否相同,因为调用str3.equals(str)时,会返回true,注意,判断两个字符串是否相同时不要使用“==”,虽然在某些情况下,使用等号判断可以顺利执行,但并非所有情况都如此。使用“==”号判断时,判断的是两个字符串变量是否同时指向同一个字符串常量,而不是比较它们的内容。String在这里更像是char*,字符串变量并没有真正存储字符串的内容,而是存储它们在内存中的位置,就像户口登记簿上写的是你家的地址,而不是把你家搬到登记簿里面去。用等号判断的时候,比较的是登记薄上记载的内容是否相同,而用equals方法比较的是两个地址指向的房子是否相同(可以不是同一栋房子)。在Java中,字符串常量都是被单独存放在内存空间的,在声明str和str2的时候,会新建两个字符串常量并存储在内存空间,然后把它们在内存空间的地址赋值给这两个变量。在声明str3的时候,并没有新建新的字符串常量,因为Java编译器会让字符串常量共享,所以实际上str3跟str指向的是同一个地址。这时使用等号来判断两者是否相等时可以得到正确的结果。但并不适用所有情况,如果再声明一个字符串变量str4,赋值为“我爱JavaScript!!!”,再调用substring方法跟str1用等号进行比较时,就不能得到正确的结果了。
第15行调用的是length方法,返回字符串的长度。
第16-18行调用charAt方法,返回的是第几个位置上的字符。以下是运行结果:
因为java中的字符串都是Unicode字符,所以这里的字符概念跟某语言中的字符概念不太一样,既然说到了这里,那就顺便再详细的说明一下相关的概念。
字符是抽象的最小文本单位。它没有固定的形状(可能是一个字形),而且没有值。“A”是一个字符,“€”(德国、法国和许多其他欧洲国家通用货币的标志)也是一个字符。
字符集是字符的集合。例如,汉字字符是中国人最先发明的字符,在中文、日文、韩文和越南文的书写中使用。
编码字符集是一个字符集,它为每一个字符分配一个唯一数字。Unicode 标准的核心是一个编码字符集,字母“A”的编码为 004116 和字符“€”的编码为20AC16.Unicode 标准始终使用十六进制数字,而且在书写时在前面加上前缀“U+”,所以“A”的编码书写为“U+0041”。
代码点是指可用于编码字符集的数字。编码字符集定义一个有效的代码点范围,但是并不一定将字符分配给所有这些代码点。有效的 Unicode 代码点范围是 U+0000 至 U+10FFFF.Unicode 4.0 将字符分配给一百多万个代码点中的 96382 代码点。
再细说可能就要说到具体的编码上来了,由于不是本篇重点,所以还是不做过多介绍了,之后会有文章专门介绍。
关于String的方法很多,但常用的并不多,这里不全部介绍,想要了解的话可以在这里查看:http://www.runoob.com/java/java-string.html
暂时不需要全部记住,只要知道有那么个函数,就可以实现那样的功能就好了,以后的多码代码自然能够记住了。
最后,再介绍一个叫做StringBuilder的类。这个类是干嘛用的呢?主要用于多字符串的拼接和处理。那你可能会问了,既然用“+”会把两个字符串拼接起来,为啥还要这个类呢?事实上,每次声明一个新字符串变量并赋上初值的时候,如果该字符串常量不存在,则会新建一个字符串常量并存储,就像上面声明str2的时候,会新建一个字符串对象“我爱Java!!!但我也爱C++。”而不是简单的将“但我也爱C++。”加在str后面,而且如果有多次拼接,特别是在循环中使用的时候,这种方式无疑会浪费很多空间,我们需要的只是最后的字符串,而不是过程中间的产生的字符串,所以过程中生成的字符串对象并没有存储的必要,对程序而言便是存储上的浪费,这个时候StringBuilder就产生了,可以调用它的append方法来拼接字符串,这样可以节省很多不必要浪费的空间。
事实上,如果你有了解过C或者C++的话,对char[]应该比较熟悉,StringBuilder内部便是有一个自己维护的char数组,通过动态申请内存方式进行拼接和处理。
StringBuilder常用的方法如下:
同样不需要全部死记硬背,在之后的练习中多加使用便能熟练掌握。
至此,字符串的讲解告一段落,欢迎大家继续关注!
真正重要的东西,用眼睛是看不见的。