浅析String类
这是对于String类的一些总结,我将会从几个方面并且结合着字符串池等相关知识进行总结
进程如下: 1.对于String类基本知识的一些总结
2.简要介绍字符串池
3.分析字符串池在内存中所起到的作用以及其在内存中的使用方式
4.对于两种实例化对象方式的不同进行描述
开始:
1.对于String类基本知识的一些总结。
首先我们清楚String类对象的值一经确认便是无法改变的 具体原因如下(我们通过查看String源码的方式来说明问题)
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {
private final char value[]; // 请注意此处,String类对象是以数组的形式进行存储的,value数组便是其存储场所而该数组是以final修饰的
所以属于常量无法被改变
private int hash; private static final long serialVersionUID = -6849794470754667710L; private static final ObjectStreamField[] serialPersistentFields =
new ObjectStreamField[0];
}
其次字符串是引用性数据类型,并不属于基本数据类型(老生常谈了)
2.简要介绍字符串池(String pool)
在工作中,String类是我们使用频率非常高的一种对象类型。JVM为了提升性能和减少内存开销,避免字符串的重复创建,其维护了一块特殊的内存空间。字符串池由String类私有的维护。
3.分析字符串池在内存中所起的作用以及其作用方式
上文提到了,字符串池是一块特殊的内存空间,并且他是存在DataSegument中的(这里我也是现查的,对于DataSegument也并不是很理解),而我们所·实例化的对象都是存在于堆内存中,那么他们之间的关系又如何那?
其实我们都知道要给一个String类对象赋值我们有两种方式,一种是通过直接赋值即:
String a="顶天立地";
另一种是以new对象的方式赋值: String a=new String("哈哈哈");
对于这两种方式具体的区别,我们在下面会详细解释的,这里引用他们只是为了说明无论是何种方式,只要我们想给对象以字符串的形式赋值,那么就必须通过字符串池的确定才可以,如果字符串池中有的话,没问题可以继续往下操作了(下文会详细描述下面的操作是啥滴。。。。);如果没有的话,则会在字符串池中创建一个该字符串并且将地址给我们所要实例化的那个对象,当然啦,有的话也会给地址的。
4.通过两种实例化方式的不同进行比较
在此我会通过比较,画图等方式来加深理解
下面我会用到equals方法,我们应该知道String类中的equals方法是经过重写的所以他比较的 不再是两个对象的地址 而是字符串内容是否相等
首先我们对直接赋值的方式进行分析
String s="haha";
String a="haha";
System.out.print(s.equals(a));
System.out.println(a==s);
返回值为 true true
分析下其过程吧 首先“哈哈”(我们应该知道一个字符串也是相当于一个对象的)进入字符串池字符串池发现他没有所以新建了一个并且把“哈哈”在内存中的地址交给了s
所以说s存的其实是地址 然后当另一个“哈哈”进入字符串池时,因为已经存在了一个“哈哈”,所以字符串池本着节省资源的原则索性把上一个“哈哈”的地址给了a
所以他们不仅内容一样,而且地址还一样,当然这里并不是那么的难以理解所以就不画图了
其次我们对通过new的方式赋值的情况进行分析:
String s=new String("haha");
String a=new String("haha");
System.out.print(s.equals(a));
System.out.println(a==s);
返回结果: true false
第一个结果我想我们基本都可以预料到,但是为啥第二个会是false那?
上面我们已经了解过了,a==s相当于是比较地址了,那么地址是在哪一步发生了改变那?
对 还有一个点: 我们以new的方式进行赋值相当于实例化了两个对象
为什么这样说 我们以前也学过有new必有对象的生成,那么上文也说了“哈哈”这种字符串也是相当于一个对象的。
好,下面通过画图的方式来说明

从图中可以看出是我们所new的对象地址不同导致结果为false。
浅析String类的更多相关文章
- String类的实现(4)写时拷贝浅析
由于释放内存空间,开辟内存空间时花费时间,因此,在我们在不需要写,只是读的时候就可以不用新开辟内存空间,就用浅拷贝的方式创建对象,当我们需要写的时候才去新开辟内存空间.这种方法就是写时拷贝.这也是一种 ...
- Java中是否可以继承String类,为什么
Java中,是否可以继承String类?为什么? 答案: 不可以,因为String类有final修饰符,而final修饰的类是不能被继承的,实现细节不允许改变. public final class ...
- String类无子类
1. 关于final修饰符 参考文章: 浅析Java中的final关键字 根据程序上下文环境,Java关键字final有“这是无法改变的”或者“终态的”含义,它可以修饰非抽象类.非抽象类成员方法和变量 ...
- 标准库String类
下面的程序并没有把String类的所有成员方法实现,只参考教程写了大部分重要的成员函数. [cpp] view plain copy #include<iostream> #include ...
- 自己实现简单的string类
1.前言 最近看了下<C++Primer>,觉得受益匪浅.不过纸上得来终觉浅,觉知此事须躬行.今天看了类类型,书中简单实现了String类,自己以前也学过C++,不过说来惭愧,以前都是用C ...
- 浅析String不可变性
在所有编程语言领域,我想字符串应该是地球上最常用的表达手段了吧. 在java的世界里,String是作为类出现的,核心的一个域就是一个char数组,内部就是通过维护一个不可变的char数组,来向外部输 ...
- C++ string类的实现
c++中string类的实现 今天面试被考到了, 全给忘记了!!! //string类的实现 #include <iostream> #include <string.h> ...
- String类的功能
String类 标红的为较少出现的 1.判断功能 boolean equals(Object obj) :比较字符串内容是否相同,区分大小写 boolean equalsIg ...
- java基础复习:final,static,以及String类
2.final 1)为啥String是final修饰的呢? 自己答: 答案: 主要是为了“效率” 和 “安全性” 的缘故.若 String允许被继承, 由于它的高度被使用率, 可能会降低程序的性能,所 ...
随机推荐
- Android 开发工具类 18_NetWorkUtil
检测网络的一个工具包: 1.网络是否可用: 2.判断是否有网络连接: 3.判断 WIFI 网络是否可用: 4.判断 MOBILE 网络是否可用; 5.获取当前网络连接的类型信息: 6.获取当前的网络状 ...
- 文本主题模型之潜在语义索引(LSI)
在文本挖掘中,主题模型是比较特殊的一块,它的思想不同于我们常用的机器学习算法,因此这里我们需要专门来总结文本主题模型的算法.本文关注于潜在语义索引算法(LSI)的原理. 1. 文本主题模型的问题特点 ...
- 如何使用kafka增加topic的备份数量,让业务更上一层楼
本文由云+社区发表 一.困难点 建立topic的时候,可以通过指定参数 --replication-factor 设置备份数量.但是,一旦完成建立topic,则无法通过kafka-topic.sh 或 ...
- 痞子衡嵌入式:ARM Cortex-M内核那些事(2)- 第一款微控制器
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是第一款Cortex-M微控制器. 1.天生荣耀:ARM Cortex-M处理器由来 ARM公司自2004年推出ARMv7内核架构时,摒弃 ...
- 基于Dapper二次封装了一个易用的ORM工具类:SqlDapperUtil
基于Dapper二次封装了一个易用的ORM工具类:SqlDapperUtil,把日常能用到的各种CRUD都进行了简化封装,让普通程序员只需关注业务即可,因为非常简单,故直接贴源代码,大家若需使用可以直 ...
- 委托(3).net 2.0中的委托
由于.net 2.0引入了匿名方法,所以创建委托的方式可以更简化了. .net 2.0中的委托 有了匿名方法,上一篇的例子可以简化为: namespace DelegateDemo { //声明委托 ...
- Selenium自动化-调用Mysql数据库
上几篇博客发布了几篇Selenium入门知识和进阶, 现在附上如何 从数据库中取值 能够逐行取值,并且返回二维数组 import java.io.FileInputStream; import jav ...
- 【Dojo 1.x】笔记目录
学习笔记和教程是不同的,笔记是随心记,学到什么就写什么,我尽量按逻辑顺序写笔记. Dojo是什么? Dojo是这么一个JavaScript框架,区别于jQuery等小型类库,这个类库更合适于构建Web ...
- C#:在匿名方法中捕获外部变量
先来一段代码引入主题.如果你可以直接说出代码的输出结果,说明本文不适合你.(代码引自<深入理解C#>第三版) class Program { private delegate void T ...
- Android Fragment的用法(一)
1.碎片是什么 碎片(Fragment)是一种可以嵌入在活动当中的UI片段,它能让程序更加合理和充分地利用大屏幕的空间,因而在平板上应用的非常广泛.虽然碎片对你来说应该是个全新的概念,但我相信你学习起 ...