java基础面试必问一String类的那些事(一)(以JDK 1.8为例)

String的使用细则

在这里插入图片描述

简介
String类是我们在我们java的开发的过程中,使用到接触到最多的一个类,比如,用户名,所有的软件系统都是给人用的,系统会记录出用户名,密码等,都是用String类来存储的,(实际用的是它的兄弟类StringBuilder和StringBuffer),还有一个最主要的用途就是传输对象

  • 实体类实现序列化

    建立一个类Student时候,这个类将会实现的是Serializable
    (接口-序列化),相当于压缩成一个具体的字符串序列

  • 传输

    将数据经过json数据,具体的url的形式(路径),传输

  • 反序列化

    反序列化显示出本来的对象信息,可能包含年龄、姓名等

String的考点一:


  • 认识String

    首先是一个字符串,存在于一个java.lang包中的(JDK自带的

  • String的组成:

    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[]的数组;

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值