三、Java基础工具(1)_常用类——字符串

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的创建和转换:

  

原文地址:https://www.cnblogs.com/sunNoI/p/9034920.html