String类型的创建机制

String类型的创建机制

  由于是第一篇博客,首先介绍一下自己吧,博主是某高校研究生,方向是医疗软件开发(本科是生物方向),刚开始学编程半年,一直想写博客却又怕才疏学浅,迟迟未敢动笔,但是丑媳妇总要见公婆,今天终于狠狠心写了第一篇博客,如有错误希望大家多多指正。

基本类型和引用类型

  首先科普一下JAVA类型的有关知识,JAVA中类型可以分为两大类,基本类型和引用类型,基本类型有9大类:

基本类型大小最小值最大值包装器类型
boolean---Boolean
char16 bitUnicode 0Unicode 2^16-1Character
byte8 bits-128(-2^7)127(2^7-1)Byte
short16 bits-2^152^15-1Short
int32 bits-2^312^31-1Integer
long64 bits-2^632^63-1Long
float32 bits-有效数字6位Float
double64 bits-有效数字15位Double
void---Void

  除了这9个基本类型之外则都是引用类型,基本类型和引用类型的变量都存储于栈上,那么基本类型跟引用类型的区别是什么呢?区别在于基本类型的数据(值)也存储于栈上,基本类型的变量直接存储值;而引用类型的数据(对象)存储于堆上,引用类型的变量存储的是数据的地址;所以基本变量是值传递,引用变量是地址传递(实际上也是值的传递,不过是地址值),这也是为什么基本类型可以直接用“==“比较,而类一般要根据需要重写equals方法来进行的比较。

String类型的创建机制

  基本类型并不包括String,说明String是一个引用类型,但是为什么网上有那么多对String类型的争论呢?首先看下面一段代码:

    public static void main(String[] args) {
        String A = "hello";
        String B = "hello";
        System.out.println(A==B);//true
        B = A;
        B ="world";
        System.out.println(A);//"hello"

  很奇怪是不是?String的表现完全像一个基本类型,这是为什么呢?
  首先介绍String对象的两种创建方法:1,String A = “hello
                           2,String A = new String(“hello”)
   那么这两种方法有什么区别呢?方法1要调用字符串常量池,而方法2会忽略掉字符串常量池。
  字符串常量池位于堆上,当使用方法1时,当需要创建一个新的字符串的时候(不用new),会自动去常量池找是否有相同的字符串,如果有就直接引用,没有就重新创建一个对象并放入池中。
  当创建A时,字符串常量池中没有“hello”,所以就创建了一个字符串对象”hello”;

图片名称


当创建B时,字符串常量池中有“hello”,所以就直接把B指向字符串对象“hello”;
   此时A和B都指向同一个”hello”(即引用变量A,B储存的都是字符串对象”hello”的地址),故A==B为true;

图片名称


   B = A,确保B和A共同引用一个对象;B=“world”,常量池中无“world”字符串对象,重新创建,并将B指向“world”字符串对象。所以A自然还是指向“hello”,如图所示。

图片名称

  那么且看下面一段代码:

        String A = new String("hello");
        String B = "hello";
        System.out.println(A==B);//false

  你看,A和B是不是都指向“hello”对象,但是他们却并不是指向同一个“hello”对象,原因就是用了new,new略过了字符串常量池,直接创建“hello”字符串对象,导致B在字符串常量池中没有找到“hello”对象,重新创建了一个,所以A和B并不是指向同一个对象。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值