ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

【巩固Java基础】String、StringBuffer、StringBuilder

2021-10-27 16:32:50  阅读:183  来源: 互联网

标签:abc Java String 对象 StringBuilder str StringBuffer 字符串


文章目录

String类

包位置:String位于java.lang包下

说明:所有字符串的字面值,都是此类的实例(也就是说,带双引号的,就是String类的对象 ☆)

字符串特点:☆

字符串的内容永不可变

String s = "abc";
s = s + "123";
// 那么为什么可以拼接字符串123呢?
//1、String直接定义的字符串在常量池中,如果重新给s给值其实是常量池中重新开辟了一个空间给abc123,原来的abc不会变 会变成垃圾。

双引号直接写的字符串是共享的 (字符串常量池)

字符串在效果上,相当于是char[]字符数组,但是底层原理是byte[]字节数组 ☆

在这里插入图片描述

在这里插入图片描述

字符串常量池在堆中(池:pool)

结论:程序中,直接写上的双引号字符串,就在字符串常量池中 ☆(自己new的不在池里)

例题:

在这里插入图片描述

重要说明:

对于基本类型来说,==是进行数值的比较

对于引用类型来说,==是进行地址值的比较(注意:字符串无法打印地址值 )

如果字符串想要对比数值,则可以用equals() ☆

  • “equals”对于复合数据类型比较的也是它的堆内存地址(不能作用于基本数据类型的变量)。

但在实际项目中常用来比较String字符串的内容相等是为什么呢?

那是因为对于String(还有Date,Integer)类型重写了equals方法,使其比较的是存储对象的内容是否相等,而不是堆内存地址。

在这里插入图片描述

  • 比较对象

==和equal比较的都是内存地址,因为equal没有被重写,没有被重写的equal都是object的equal方法

下面Demo02类就是重写了equals和hashCode方法  所以不是比较的内存地址,而是比较的属性等

在这里插入图片描述

在这里插入图片描述

String类自动重写了hashCode和equals方法

在这里插入图片描述

在这里插入图片描述

String是一个特殊的包装类数据。可以用: 
String str = new String("abc"); 
String str = "abc"; 
两种的形式来创建,第一种是用new()来新建对象的,它会在存放于堆中。每调用一次就会创建一个新的对象。 
而第二种是先在栈中创建一个对String类的对象引用变量str,然后查找栈中(字符串池)有没有存放"abc",
如果没有,则将"abc"存放进栈,并令str指向”abc”,
如果已经有”abc” 则直接令str指向“abc”。 

用new的方式是生成不同的对象。每一次生成一个。 
因此用第二种方式创建多个”abc”字符串,在内存中其实只存在一个对象而已. 这种写法有利与节省内存空间.
同时它可以在一定程度上提高程序的运行速度,因为JVM会自动根据栈中数据的实际情况来决定是否有必要创建新对象。
而对于String str = new String("abc");的代码,则一概在堆中创建新对象,而不管其字符串值是否相等,是否有必要创建新对象,
从而加重了程序的负担。 
另一方面, 要注意: 我们在使用诸如String str = "abc";的格式定义类时,总是想当然地认为,创建了String类的对象str。
担心陷阱!对象可能并没有被创建!而可能只是指向一个先前已经创建的对象。只有通过new()方法才能保证每次都创建一个新的对象。
由于String类的immutable(不变)性质,当String变量需要经常变换其值时,应该考虑使用StringBuffer类,以提高程序效率。
        

内存图说明:

在这里插入图片描述

StringStringBuffer类:字符串缓冲区

说明:字符串是常量,不可改变(底层是byte[]数组,被final修饰)

在这里插入图片描述

解决方式:字符串缓冲区可以改变,可以增强字符串操作的效率

缓冲区原理:底层也是一个数组,但没有被final修饰,就是一个数组,这个数组的初始容量为16,如果超过16,会自动扩充为32,成倍扩充 ☆

在这里插入图片描述

StringBuffer主要是继承的AbstractStringBuilder

在这里插入图片描述

常用方法:

①append():追加

在这里插入图片描述

②toString():转成普通字符串

String与StringBuffer可以相互转换 ☆

String -> StringBuffer 是正常使用StringBuilder有参构造方法

StringBuffer->String 是调用toString()方法

在这里插入图片描述

  • String : 具有不变性, 指的是一旦声明不可改变, 如果进行拼接会开辟新的内存空间, 如果在循环中或拼接次数比较多

    效率极低, String为什么要设计成不变性的特点: 字面池(字符串池), 声明变量及使用 性能好

  • StringBuffer: 拼接性能好,不会像String一样 开辟新的内存空间, 线程安全 源码中加了锁

在这里插入图片描述

  • StringBuilder与StringBuffer 一样,最大的区别 ,不是 线程安全
    在这里插入图片描述

标签:abc,Java,String,对象,StringBuilder,str,StringBuffer,字符串
来源: https://blog.csdn.net/qq_51998352/article/details/120995309

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有