Java 中 String 类的前世今生
String 的使用细则
简介 String 类是我们在我们 java 的开发的过程中,使用到接触到最多的一个类,比如,用户名,所有的软件系统都是给人用的,系统会记录出用户名,密码等,都是用 String 类来==存储==的,(实际用的是它的兄弟类 StringBuilder 和 StringBuffer),还有一个最主要的用途就是传输对象,
实体类实现序列化
建立一个类 Student 时候,这个类将会实现的是 Serializable(接口-序列化),相当于压缩成一个具体的==字符串序列==,
传输
将数据经过 json 数据,具体的 url 的形式(路径),传输
反序列化
反序列化显示出本来的对象信息,可能包含年龄、姓名等
String 的考点一:
认识 String
首先是一个字符串,存在于一个 java.lang 包中的(JDK 自带的)
String 的组成:
String 底层是由数组实现的: (话不多说,上源码)
这个 value 就是所谓的底层创建的数组
==这里将是重点==:
String 的底层是由 char 类型的==数组==实现的,并且这个类,不能被继承--->==final==也不能改变,(重新赋值后会变成新的对象)--->==private==(私有的)
String 的创建上述说 String 不能被改变,那岂不是有很多的 String 的对象啦,一个个创建,效率不高,会对内存和性能有很大的要求,
这里我们有几个概念型的名词:
常量池:因为 String 的不可改变的特性,不就和我们常遇见的圆周率都是固定的常量(const)数了吗
池---鱼缸的意思,我们将鱼缸里一般放的是相同类型的鱼,所以常量池里面:就是解决字符串冗余而形成的;(我们创建一个 String 的实例,就会去常量池里面找一个,如果存在,就会用常量池中存在的----也就是说会用同样的对象-->地址和值都相等,免去了重复创建,耗损内存,影响性能的作用)
字符串常量池在哪里 Orac1e 官方虚拟机 HotSpot( 1 ) JDK1.6 以及之前: 方法区( 2 ) JDK1.7 : 挪到堆中, 即在堆中单独划分了一块来存字符串常量( 3 )JDK1.8 :挪到一个“ 元空间 meta spacet', 即类似于方法区
因为常量池存储的常量多---单独的元空间
String 的考点二:
1.Sting hello="Helloword"的创建过程 (字面量)
上述有 String 的构造器--利用的是无参构造器,去实例对象,这个对象 hello 会在堆内存中存储一份,
三个问题:1. 创建的 String 的对象有几个,2.分别存储在哪里,3.存储的类型是什么
解答一:创建对象,要是单纯的字面量的 String 类型示例:
没有 new--对象存储在常量池中一份:
有 new---对象存储在堆中一份---并且指向常量池(他们的内存地址是一样的;==true)
这里小知识点:我这里的笔记都是以 JDK 1.8 为例的;JDK1.9 之前是 char[]数组 JDK1.9 以后是 byte[]的数组;
版权声明: 本文为 InfoQ 作者【卢卡多多】的原创文章。
原文链接:【http://xie.infoq.cn/article/b67211cc038de677b3f12ee5e】。文章转载请联系作者。
评论