2018-05-13
字符串
一、字符串的概述和分类
字符序列:把多个字符按照一定的顺序排列起来。
字符串:把多个字符串联起来。(好比羊肉串)
字符串的分类:
1)不可变的字符串:String类,当前对象创建完毕之后,该对象的内容(字符序列)是不能改变的,一旦内容改变就是一个新的对象。
2)可变的字符串:StringBuilder类、StringBuffer类,当前对象创建完毕之后,该对象的内容(字符序列)可以发生改变的,对象保持不变。
----------------------------------------------------------------------------------------------------
String类:表示不可变字符串,当前对象创建完毕之后,该对象的内容(字符序列)是不能改变的,一旦内容改变就是一个新的对象。
String对象的创建:(两种方式)
1)直接赋值(赋一个字面量): String str1 = "ABCD";
2)通过构造器创建: String str2 = new String("ABCD");
String对象的空值:
1)表示引用为空(null):String str1 = null; 没有初始化,没有内存空间
2)表示内容(字符序列)为空:String str2 = ""; 已经初始化,分配了内存空间,但是没有内容
判断字符串为非空:
1)引用不能为空(null):
2)内容不能为空('' ''):
字符串的比较操作:
1)使用“==”:比较的是引用的地址是否相同,即是否指向同一个对象。
2)使用equals方法:比较字符串的内容是否相同。
例如String a = "abc";
String b = "abc";
a == b返回true,a.equals(b)同样返回true,这是为什么呢?
原来程序在运行时有一个字符串池,创建字符串时会先查找池中是否有相应的字符串,如果已经存在的话只需把引用指向它即可,如果没有则新建一个。
上例中创建a时,会在字符串池中首先创建一个"abc",然后a指向它;创建b时,由于"abc"已经存在,b直接指向它即可。
若改为:String a = "abc";
String b = new String("abc");
则a == b返回false,a.equals(b)返回true。因为创建b时不管"abc"是否存在都会new一个新的"abc",从而a和b指向的字符创对象是不同的,因此返回false。
------------------------------------------------------------------------------
二、String面试题
常量池:专门存储常量的地方,指的方法区中。
编译常量池:把内存加在进JVM的时候,存储的是字节码相关信息(不研究)
运行常量池:存储常量数据(我们研究这个)
面试题1:
下列代码分别创建了几个对象?
String str1 = "ABCD" :先判断常量池中是否存在“ABCD”,如果存在则直接引用,此时不创建String对象;
如果不存在则在常量池中先创建一个“ABCD”内存空间,再引用。
所以最少不创建String对象,最多创建一个String对象。
String str2 = new String("ABCD"):new关键字会在堆空间创建内存空间,所以至少创建一个String对象。同时如果这个字符串再 java String池里不存在,会在java池里创建这个String对象“ABC”
所以最多创建2个String对象,最少创建一个String对象。
参考:https://www.cnblogs.com/coding-wtf/p/6413206.html
------------------------------------------------------------------------------
面试题2:
-
-
使用字符串常量拼接,由于表达式先计算右值,因此相当于将String指向一个新拼接好的字符串常量。同样会在字符串常量池中查找,如果有就直接指向它;没有则 在字符串常量池中创建该常量,然后String指向该常量。但是如果拼接中存在使用new生成的字符串,则新的字符串就等价于使用new在堆中创建的一样。
-
修改String的值,只能改变String的指向,不会改变String指向的对象本身。如果非要改变指向的对象本身,可以使用反射。
-
如果是数组,由于它是对象,那么equals只比较其数组指针地址,并不会去比较其中的元素是否相等。
- 通过变量、调用方法去连接字符串,都只能在运行时期才能确定变量的值和方法的返回值,不存在编译优化操作。
-
参考:https://blog.csdn.net/chy555chy/article/details/52795984
三、String类中的方法
常用方法:
1)String的创建和转换: