这是对于String类的一些总结,我将会从几个方面并且结合着字符串池等相关知识进行总结

进程如下:                1.对于String类基本知识的一些总结

2.简要介绍字符串池

3.分析字符串池在内存中所起到的作用以及其在内存中的使用方式

4.对于两种实例化对象方式的不同进行描述

开始:

1.对于String类基本知识的一些总结。

首先我们清楚String类对象的值一经确认便是无法改变的            具体原因如下(我们通过查看String源码的方式来说明问题)

  1. public final class String
  2. implements java.io.Serializable, Comparable<String>, CharSequence {
  3. private final char value[]; // 请注意此处,String类对象是以数组的形式进行存储的,value数组便是其存储场所而该数组是以final修饰的
  4. 所以属于常量无法被改变
  5. private int hash;
  6.  
  7. private static final long serialVersionUID = -6849794470754667710L;
  8.  
  9. private static final ObjectStreamField[] serialPersistentFields =
  10. new ObjectStreamField[0];
  11. }

其次字符串是引用性数据类型,并不属于基本数据类型(老生常谈了)

2.简要介绍字符串池(String  pool)

在工作中,String类是我们使用频率非常高的一种对象类型。JVM为了提升性能和减少内存开销,避免字符串的重复创建,其维护了一块特殊的内存空间。字符串池由String类私有的维护。

3.分析字符串池在内存中所起的作用以及其作用方式

上文提到了,字符串池是一块特殊的内存空间,并且他是存在DataSegument中的(这里我也是现查的,对于DataSegument也并不是很理解),而我们所·实例化的对象都是存在于堆内存中,那么他们之间的关系又如何那?

其实我们都知道要给一个String类对象赋值我们有两种方式,一种是通过直接赋值即:

String    a="顶天立地";

另一种是以new对象的方式赋值:    String   a=new   String("哈哈哈");

对于这两种方式具体的区别,我们在下面会详细解释的,这里引用他们只是为了说明无论是何种方式,只要我们想给对象以字符串的形式赋值,那么就必须通过字符串池的确定才可以,如果字符串池中有的话,没问题可以继续往下操作了(下文会详细描述下面的操作是啥滴。。。。);如果没有的话,则会在字符串池中创建一个该字符串并且将地址给我们所要实例化的那个对象,当然啦,有的话也会给地址的。

4.通过两种实例化方式的不同进行比较

在此我会通过比较,画图等方式来加深理解

下面我会用到equals方法,我们应该知道String类中的equals方法是经过重写的所以他比较的      不再是两个对象的地址       而是字符串内容是否相等

首先我们对直接赋值的方式进行分析

  1. String s="haha";
  2. String a="haha";
  3. System.out.print(s.equals(a));
  4. System.out.println(a==s);

返回值为   true   true

分析下其过程吧   首先“哈哈”(我们应该知道一个字符串也是相当于一个对象的)进入字符串池字符串池发现他没有所以新建了一个并且把“哈哈”在内存中的地址交给了s

所以说s存的其实是地址    然后当另一个“哈哈”进入字符串池时,因为已经存在了一个“哈哈”,所以字符串池本着节省资源的原则索性把上一个“哈哈”的地址给了a

所以他们不仅内容一样,而且地址还一样,当然这里并不是那么的难以理解所以就不画图了

其次我们对通过new的方式赋值的情况进行分析:

  1. String s=new String("haha");
  2. String a=new String("haha");
  3. System.out.print(s.equals(a));
  4. System.out.println(a==s);

返回结果:     true    false

第一个结果我想我们基本都可以预料到,但是为啥第二个会是false那?

上面我们已经了解过了,a==s相当于是比较地址了,那么地址是在哪一步发生了改变那?

对  还有一个点:  我们以new的方式进行赋值相当于实例化了两个对象

为什么这样说   我们以前也学过有new必有对象的生成,那么上文也说了“哈哈”这种字符串也是相当于一个对象的。

好,下面通过画图的方式来说明

从图中可以看出是我们所new的对象地址不同导致结果为false。

浅析String类的更多相关文章

  1. String类的实现(4)写时拷贝浅析

    由于释放内存空间,开辟内存空间时花费时间,因此,在我们在不需要写,只是读的时候就可以不用新开辟内存空间,就用浅拷贝的方式创建对象,当我们需要写的时候才去新开辟内存空间.这种方法就是写时拷贝.这也是一种 ...

  2. Java中是否可以继承String类,为什么

    Java中,是否可以继承String类?为什么? 答案: 不可以,因为String类有final修饰符,而final修饰的类是不能被继承的,实现细节不允许改变. public final class ...

  3. String类无子类

    1. 关于final修饰符 参考文章: 浅析Java中的final关键字 根据程序上下文环境,Java关键字final有“这是无法改变的”或者“终态的”含义,它可以修饰非抽象类.非抽象类成员方法和变量 ...

  4. 标准库String类

    下面的程序并没有把String类的所有成员方法实现,只参考教程写了大部分重要的成员函数. [cpp] view plain copy #include<iostream> #include ...

  5. 自己实现简单的string类

    1.前言 最近看了下<C++Primer>,觉得受益匪浅.不过纸上得来终觉浅,觉知此事须躬行.今天看了类类型,书中简单实现了String类,自己以前也学过C++,不过说来惭愧,以前都是用C ...

  6. 浅析String不可变性

    在所有编程语言领域,我想字符串应该是地球上最常用的表达手段了吧. 在java的世界里,String是作为类出现的,核心的一个域就是一个char数组,内部就是通过维护一个不可变的char数组,来向外部输 ...

  7. C++ string类的实现

    c++中string类的实现 今天面试被考到了, 全给忘记了!!!   //string类的实现 #include <iostream> #include <string.h> ...

  8. String类的功能

    String类              标红的为较少出现的 1.判断功能 boolean equals(Object obj) :比较字符串内容是否相同,区分大小写 boolean equalsIg ...

  9. java基础复习:final,static,以及String类

    2.final 1)为啥String是final修饰的呢? 自己答: 答案: 主要是为了“效率” 和 “安全性” 的缘故.若 String允许被继承, 由于它的高度被使用率, 可能会降低程序的性能,所 ...

随机推荐

  1. EF架构~mysql中时间戳字段被认为是主键自增

    回到目录 如果在mysql中添加了自增字段,用来维护行的版本,那么在EF中会有一个问题,会把它当成是数据表主键,当你的真正主键是自曾时,就会把默认值0拼到生成的SQL语句里,导致你的insert出错, ...

  2. 决策树 Decision Tree

    决策树是一个类似于流程图的树结构:其中,每个内部结点表示在一个属性上的测试,每个分支代表一个属性输出,而每个树叶结点代表类或类分布.树的最顶层是根结点.  决策树的构建 想要构建一个决策树,那么咱们 ...

  3. 可视化面板LogDashboard使用log4net源

    logdashboard现已支持log4net文件源,本示例源码在 https://github.com/liangshiw/LogDashboard/tree/master/samples/UseL ...

  4. 翻译 异步I/O不会创建新的线程

    异步I/O不会创建新的线程 本文翻译自 Stephen Cleary 的 [There is No Thread] 原文地址 https://blog.stephencleary.com/2013/1 ...

  5. 【java 多线程】多线程并发同步问题及解决方法

    一.线程并发同步概念 线程同步其核心就在于一个“同”.所谓“同”就是协同.协助.配合,“同步”就是协同步调昨,也就是按照预定的先后顺序进行运行,即“你先,我等, 你做完,我再做”. 线程同步,就是当线 ...

  6. jmeter 压测常见的几种报错

    一. socket closed 问题原因:在JMeter下,发送http 请求时,一般都是默认选择了use keepAlive,这个是连接协议,JMeter坑就在这里,默认勾选了这个(如果不勾选的话 ...

  7. Maven教程(4)--Maven管理Oracle驱动包

    由于Oracle授权问题,Maven3不提供Oracle JDBC driver,为了在Maven项目中应用Oracle JDBC driver,必须手动添加到本地仓库. 手动添加到本地仓库需要本地有 ...

  8. SDWebImage源码解析

    但凡经过几年移动开发经验的人去大公司面试,都会有公司问到,使用过哪些第三方,看过他们的源码嘛?而SDWebImage就是经常被面试官和应聘者的提到的.下面将讲述SDWebImage的源码解析以及实现原 ...

  9. NLP入门(六)pyltp的介绍与使用

    pyltp的简介   语言技术平台(LTP)经过哈工大社会计算与信息检索研究中心 11 年的持续研发和推广, 是国内外最具影响力的中文处理基础平台.它提供的功能包括中文分词.词性标注.命名实体识别.依 ...

  10. JavaScript 中,定义函数时用 var foo = function () {} 和 function foo() {}有什么区别?

    对于新手来说(本人也是新手-_-!),好像var foo = function () {} 和 function foo(){}并没有什么区别,意识里可能就认为就是两种不同的写法而已.但是,通过网上查 ...