String的使用细则
简介
String类是我们在我们java的开发的过程中,使用到接触到最多的一个类,比如,用户名,所有的软件系统都是给人用的,系统会记录出用户名,密码等,都是用String类来存储的,(实际用的是它的兄弟类StringBuilder和StringBuffer),还有一个最主要的用途就是传输对象,
-
实体类实现序列化
建立一个类Student时候,这个类将会实现的是Serializable
(接口-序列化),相当于压缩成一个具体的字符串序列, -
传输
将数据经过json数据,具体的url的形式(路径),传输
-
反序列化
反序列化显示出本来的对象信息,可能包含年龄、姓名等
String的考点一:
-
认识String
首先是一个字符串,存在于一个java.lang包中的(JDK自带的)
-
String的组成:
String底层是由数组实现的: (话不多说,上源码)
这个value就是所谓的底层创建的数组
这里将是重点:
String的底层是由char类型的数组实现的,并且这个类,
不能被继承—>final
也不能改变,(重新赋值后会变成新的对象)—>private(私有的)
String的底层源码构造:
/** The value is used for character storage. */
private final char value[];
- 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类型
示例:
String s1="hellojava";
没有new–对象存储在常量池中一份:
有new—对象存储在堆中一份—并且指向常量池
(他们的内存地址是一样的;==true)
这里小知识点:
我这里的笔记都是以JDK 1.8为例的;
JDK1.9之前是char[]数组
JDK1.9以后是byte[]的数组;