• String类特点分析


    1.String两种实例化方式比较

    1、直接赋值的对象实例化模式

    String strA = "mldn";
    String strB = "mldn";
    System.out.println(strA=strB);//true
    

    主要原因在java程序的底层里面提供有一个专门的字符串池(字符串数组)。新建字符串的时候,先去池中找是否存在,存在则引用,不存在则创建,可以节约空间。

    在采用直接赋值的处理过程中,对于字符串而言可以实现池数据的自动保存,这样如果再有相同数据定义时,可以减少对象的产生,以提升操作性能;

    2.构造方法实例化String类对象

    String str = new String("mldn");
    

    "mldn"字符串一个匿名对象,会开辟一个堆内存(由匿名对象开辟的),因为关键字new也开辟了堆内存空间,且两个空间内容是一样的,引用指向new,而后只会使用一块,而两外一个由于字符串常量所定义的匿名对象将成为垃圾空间,造成了空间上的浪费。

    2.String对象(常量)池

    对象池的主要目的是实现数据的共享处理。
    但是java之中的对象池实际上可以分为两种:

    • 静态常量池:程序(*.class)在加载的时候会自动将此程序之中保存的字符串,普通的常量,类和方法等等,全部进行分配;
      例子:
    String strA = "www.mldn.cn";
    String strB ="www."+"mldn"+".cn";
    System.out.println(strA==strB);//true
    
    • 运行时常量池:当一个程序(*.class)加载之后,里面可能有一些变量.
      例子:
    String info = "mldn";
    String strA = "www.mldn.cn";
    String strB ="www."+info+".cn";
    System.out.println(strA==strB);//false
    

    这个时候之所以是false,是因为程序在加载的时候并不确定info是什么内容。因为在进行字符串连接的时候info采用的是一个变量,变量的内容是可以修改的,所以它不认为最终的strB的结果就是一个所需要的真实的最终的结果。

    3.字符串内容不可修改

    在String类之中包含的是一个数组,数组的最大缺点在于长度不可改变,当设置了一个字符串之后,会自动的进行一个数组空间的开辟,开辟的内容长度是固定的。

    String str ="www.";
    str += "mldn.";
    str = str + "cn";
    System.out.println(str);
    

    引用传递图:

    分析图2,字符串是匿名对象,就会在堆内存开辟一块空间,但"mldn"不是最终想要的,最终会再以"www.mldn"开辟一块空间,"str"的引用最终指向了"www.mldn",剩下两块空间就成了垃圾空间,等待回收。

    分析图3,字符串"cn"开辟了一块空间,最后想要的是"www.mldn.cn",且指向最后进行了重连,其它的空间指向断开,最终指向了"www.mldn.cn"。

    在整个处理过程之中,字符串常量的内容并没有发生改变,改变的只是一个String类对象的引用,并且这种改变将有可能带来大量的垃圾空间。

    String类在开发中不要进行内容的频繁修改,否则将会造成更多的垃圾空间。

    4.字符串格式化

    可以利用占位符实现数据的输出,对于占位符而言,常用的:字符串(%8)、字符(%c)、整数(%d)、小数(%f)等来描述

    方法:String format(Stirng format,各种类型... args)

    普通方法
    描述:根据指定的结构进行文本格式化显示。

    案例:

    String name = "小嘿";
    int age = 18;
    double score = 98.765321;
    String str = String.format("姓名:%s、年龄%d、成绩:%5.2f", name, age, score);
    System.out.println(str);
    

    5.字符串比较

    String类所提供的一个比较方法public boolean equals(String str);

    常见面试题:请解释String比较中==与equals()的区别?

    • ==:进行的是数值比较,如果用于对象比较上比较的是两个内存的地址数值;
    • equlas():是类所提供的一个比较方法,可以直接进行字符串内容的判断;
  • 相关阅读:
    kafka集群管理
    kafka server管理
    kafka 日志结构
    kafka消费者基本操作
    kafka 生产者基本操作
    kafka主题管理
    kafka基础知识
    centos7.0安装docker-18.06.1-ce不能启动问题
    spec 文件详解
    rpmbuild 源码打包clickhouse,附带打好的rpm包下载地址
  • 原文地址:https://www.cnblogs.com/ringbug/p/15536239.html
Copyright © 2020-2023  润新知