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

      

  • 相关阅读:
    CDQ分治
    K-th Number POJ
    A * B Problem Plus HDU
    Prime Test POJ
    数据结构
    FFT
    mysql查询出相同数据出现的次数,统计相同值的数量
    Laravel 清空配置缓存
    php7 数据导出Excel office 2011中文乱码问题
    PHP file_put_contents函数数据导出csv文件,屏幕字符串逗号分隔符
  • 原文地址:https://www.cnblogs.com/sunNoI/p/9034920.html
Copyright © 2020-2023  润新知