浅析String

String的设计结构:

首先我们看一下

String的源码

public final class String
    implements java.io.Serializable,
Comparable<String>, CharSequence {
    /** The value is used for character
storage. */
    private final char value[];

}

源码特点:

1,String是一个对象

2,String被final修饰,

3,String内部维护的是final
char[]

1,2构建String的基本特点,只能被初始化一次

3的特点防止了通过String的引用修改String的内部实际值.

这三个特点构建了String对象的基本特点.,这样设计的特点保证了Stirng的唯一性.

为什么String需要唯一性不可变性呢?

因为安全和高效,可以在多线程中共享时而不要任何的同步处理,更因其不可变性而显的更加高效.

不可变性的另一个问题:占用空间

String的使用率非常之高,但是String是不可变的,代表着每次创建一个String都会new一个新的对象,当需要大量的String时候,就会占用很大的内存空间,消耗应用性能.

Java是如何解决String这种不可变性的问题

这也是我写这篇文章的重点,理解了Java是如何解决String这种不可变性的问题,也就理解的String.

其实理解这个问题也很简单,我们只需要理解常量池的概念就就行了:

 

每次我们使用String常量时,实际上jvm会到String常量池中找到对应的常量,如果有就返回对应的引用,如果没有就创建出一个新的常量并将其引用返回.

我们来看一个例子:

由上图可以看出,这样的设计解决了大部分的内存空间以及性能的消耗.

另一用优化的策略(预处理):

java文件在编译期间不仅会把final基本数据的类型表达式运算成一个值,同时也会把使用+拼接的字符串最终也会拼接成一个字符串

以上情况指向了同一个地址值,下面我们来看一下,地址值不同的案例:

第一种:通过new Stirng()的方式主动分配新地址:

name2通过new一定会创建一个新的引用,但是其内部还是引用常量池中的”Alan”,所以这里有两个对象引用:new String()的和”Alan”

第二种:编译期间无法确定值

一下也是编译时期无法确定的组合:

String name3 = “Al”+name2;

String name3 = “Al”+new String(“an”);

总结:

/**
 * Author:Alan
 *
 * @Date: 2018-04-26  20:51:40
 */
public class Main {
 
    static String name = "Alan";
    public static void main(String[] args){
        String name0 = "Alan";
        String name1 = "Al";
        String name2 = "an";
        String name3 = name1 + name2;
 
        System.out.println(name0 == name3);//false
        System.out.println(name0 == "Al"+name2);//false
        System.out.println(name == name0);//true
        System.out.println(name0 == "Alan");//true
        System.out.println(name0 == "Al"+"an");//true
    }
}
 

浅析String的更多相关文章

  1. 浅析String、StringBuilder、StringBuffer

    谈谈我对 String.StringBuilder.StringBuffer 的理解 StringBuilder.StringBuffer 和 String 一样,都是用于存储字符串的. 1.那既然有 ...

  2. 浅析String不可变性

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

  3. 浅析String、StringBuffer、StringBuilder的区别以及性能区别

    前奏: 比较三者之间的区别在与区别他们做相同的事情的时候的区别,那就是在我们常见的拼接字符串的时候,StringBuffer.StringBuilder调用的是appende()方法,而String很 ...

  4. 浅析String类

    这是对于String类的一些总结,我将会从几个方面并且结合着字符串池等相关知识进行总结 进程如下:                1.对于String类基本知识的一些总结 2.简要介绍字符串池 3.分 ...

  5. 浅析String.intern()方法

    1.String类型“==”比较样例代码如下:package com.luna.test;public class StringTest { public static void main(Strin ...

  6. 201621123050 《Java程序设计》第2周学习总结

    1.本周学习总结 java的数据类型 基本数据类型:介绍了java特有的boolean 引用数据类型 String:不变性:需要频繁修改时使用StringBuilder 包装类:自动拆.装箱 数组 一 ...

  7. hashMap 底层原理+LinkedHashMap 底层原理+常见面试题

    1.源码 java1.7    hashMap 底层实现是数组+链表 java1.8 对上面进行优化  数组+链表+红黑树 2.hashmap  是怎么保存数据的. 在hashmap 中有这样一个结构 ...

  8. 我对java String的理解 及 源码浅析

    摘要: 摘要: 原创出处: http://www.cnblogs.com/Alandre/ 泥沙砖瓦浆木匠 希望转载,保留摘要,谢谢! 每天起床告诉自己,自己的目标是 ”技术 + 英语 还有生活“! ...

  9. String 源码浅析————终结篇

    写在前面 说说这几天看源码的感受吧,其实 jdk 中的源码设计是最值得进阶学习的地方.我们在对 api 较为熟悉之后,完全可以去尝试阅读一些 jdk 源码,打开 jdk 源码后,如果你英文能力稍微过得 ...

随机推荐

  1. Chrome浏览器V43版本号不支持silverlight 5.0的解决的方法

    场景: 浏览器:chrome V43 插件:silverlight 5.0 操作系统:xp 问题: 自己开发silverlight站点在IE7和firefox中能正常打开,但在chrome中打开失败. ...

  2. DRF 之 版本控制

    1.版本控制是干什么用的,为什么要有版本? 我们都知道每一个程序都是有版本的.而且版本也会升级从v1升级到v2.v3.v4·····,但是我们不可能因为新版本出现旧版本就不去维护,因为用户有权选择不更 ...

  3. https://bitbucket.org/ariya/phantomjs/downloads/phantomjs-2.1.1-linux-x86_64.tar.bz2

    https://bitbucket.org/ariya/phantomjs/downloads/phantomjs-2.1.1-linux-x86_64.tar.bz2

  4. 20170224 SE11删除数据

    目的,批量删除错误条目.1.SE11 通过条件找到目标数据,并选中: 2./H 进入debug,回车,更改值 OK_CODE  =  DEL5 F8 运行则出现删除框,

  5. Qt & opencv 学习(二)

    例子:打开图片并显示.打开图片利用Qt的标准文件对话框,第一步是利用OpenCV创建窗口并显示. 添加一个Button,转到信号槽添加代码: using namespace cv; Mat image ...

  6. window.name应用于浏览器端数据存储

    本代码简单地分享利用window.name实现浏览器端数据存储: 1.在同一个页面一个地方设置window.name = "abc",另外一个地方读取window.name,自然能 ...

  7. Python机器视觉编程常用数据结构与示例

    本文总结了使用Python进行机器视觉(图像处理)编程时常用的数据结构,主要包括以下内容: 数据结构 通用序列操作:索引(indexing).分片(slicing).加(adding).乘(multi ...

  8. MultiAutoCompleteTextView

    Activity_mian.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android&qu ...

  9. 聊聊Spring中的工厂

    BeanFactory是Spring IOC容器的根接口,定义了Bean工厂的最基础的功能特性,比如根据name获取指定bean等,根据不同用途它的子接口又对它的功能进行细化,比如是否是可列表的,是否 ...

  10. bzoj 2836 魔法树 —— 树链剖分

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2836 树链剖分裸题: 写码五分钟,调码两小时,RE不断,狂交二十五遍,终于找到一处小细节—— ...