当前位置:
首页
文章
后端
详情

Java基础知识之字符串类型String的详细总结

相信很多人对于 String 并不陌生,都知道它可以用来声明字符串类型的变量。但是在 Java 中 String 不属于基本数据类型,而是属于引用数据类型,是一个类,也是一个对象。下面,我将为大家介绍 Java 中的字符串类型 String。

一、概念

String代表字符串,java语言中所有双引号的字符串都是String的对象,不管是否是new出来的对象。

二、特点

1.String类由于被final修饰,因此其不能被继承,注意一下哈,我开始也以为字符串不能够改变是因为其被final修饰,事实上并不是这样,String底层是用char数组保存,它被final修饰只是不能够改变地址指向,但是其内容是可以改变的。因此字符串不能改变和其是否被final修饰没有关系。

2.字符串由于不能被改变,因此其能共享使用。

3.字符串底层使用char[]数组存储。

三、三种构造方式:

1.public String():创建空字符串对象

2.public String(char[] array):使用char数组创建字符串

3.public String(byte[] array):使用byte数组创建字符串,这种方式将对应数字按照ASCII码转成字符,如97代表字符a
一种直接创建:String str = “abc”

四、字符串常量池

在jdk1.6及之前,字符串常量池是在方法区内,jdk1.7及之后字符串常量池从方法区分离出来,存储在堆中。

jdk1.6和jdk1.7的相同点:

1.用双引号创建字符串在JVM运行时都直接在字符串常量池中创建字符串对象,但是不会在堆中创建对象;

2.new一个字符串对象(String s = new String(“abc”)),这里面涉及两个对象的创建,一个是堆对象,一个是字符串常量池中的对象(“abc”是用双引号的),如果字符串常量池存在与该字符串相同的对象(这里是指内容相同,而不是地址)则只需要创建一个堆对象,如果字符串常量池没有相同的对象,那么需要在字符串常量池和堆内都要创建对象,注意一点:这两个对象之间不存在引用,即其中一个对象保存的值是另一个对象的地址。

String test1 = "test";
        String test3 = "test";
        String test2 = new String("test");
    
        System.out.println(test1 == test2);//false
        System.out.println(test1 == test3);//true

第一个输出是false是因为test1是字符串常量池中的对象,而test2是堆中的对象,因此他们的地址是不相等,故结果是false;第二个输出为true是因为当用双引号创建字符串时,首先会去字符串常量池中查找是否存在值相同得到对象,如果存在就直接返回引用地址,如果不存在才创建对象,因此test1和test3指向的是同一个地址。

jdk1.6和jdk1.7的不同点:

jdk1.6的字符创常量池存储是对象,jdk1.7字符常量池中既可以存储对象,又可以存储对象的引用。

还需要明确一点:
使用引号包含文本的方式创建的String对象之间使用“+”连接产生的新对象才会被加入字符串池中,对于所有包含new方式新建对象(包括null)的“+”连接表达式,它所产生的新对象都不会被加入字符串池中

String s6 = new String("go") +new String("od");
        String s7 = s6.intern();
        String s8 = "good";
        System.out.println(s6 == s7);//true
        System.out.println(s7 == s8);//true
        System.out.println(s6 == s8);//true

右上面的介绍可知,s6指向的是堆中字符串good对象的地址,且这个对象没有在字符串常量池中被创建,当执行到 String s7 = s6.intern();时由于字符创常量池没有这个对象,且堆中存在该对象,因此在字符串常量池中创建一个引用指向堆中的对象,所以s6和s7指向同一个对象,如果是jdk1.6,会直接在字符串常量池创建一个对象然后返回这个对象的引用,此时s6和s7指向的是不同的对象。

 String s2 = new String("lo") + new String("ng");
        String s3 =  s2.intern();
        System.out.println(s2 == s3);//false

这里按照上面的分析应该返回true,但是这里返回false,原因如下:

2021052109524743

到此这篇关于 Java 基础知识的总结归纳之字符串类型 String 的文章就介绍到这了,想要了解更多相关 Java String 的其他内容请搜索W3Cschool以前的文章或继续浏览下面的相关文章,也希望大家以后多多支持!

免责申明:本站发布的内容(图片、视频和文字)以转载和分享为主,文章观点不代表本站立场,如涉及侵权请联系站长邮箱:xbc-online@qq.com进行反馈,一经查实,将立刻删除涉嫌侵权内容。

同类热门文章

深入了解C++中的new操作符:使用具体实例学习

C++中的new操作符是动态分配内存的主要手段之一。在程序运行时,我们可能需要动态地创建和销毁对象,而new就是为此提供了便利。但是,使用new也常常会引发一些问题,如内存泄漏、空指针等等。因此,本文将通过具体的示例,深入介绍C++中的new操作符,帮助读者更好地掌握其使用。


深入了解C++中的new操作符:使用具体实例学习

怎么用Java反射获取包下所有类? 详细代码实例操作

Java的反射机制就是在运行状态下,对于任何一个类,它能知道这个类的所有属性和方法;对于任何一个对象,都能调用这个对象的任意一个方法。本篇文章将通过具体的代码示例,展示如何通过Java反射来获取包下的所有类。


怎么用Java反射获取包下所有类? 详细代码实例操作

了解Java中的volati关键字的作用 以及具体使用方法

本篇文章将和大家分享一下Java当中的volatile关键字,下面将为各位小伙伴讲述volatile关键字的作用以及它的具体使用方法。


了解Java中的volati关键字的作用 以及具体使用方法

Java Map 所有的值转为String类型

可以使用 Java 8 中的 Map.replaceAll() 方法将所有的值转为 String 类型: 上面的代码会将 map 中所有的值都转为 String 类型。 HashMap 是 Java

Java Map 所有的值转为String类型

员工线上学习考试系统

有点播,直播,在线支付,三级分销等功能,可以对学员学习情况的监督监控,有源码,可二次开发。支持外网和局域网私有化部署,经过测试源码完整可用!1、视频点播:视频播放,图文资料,课件下载,章节试学,限时免

员工线上学习考试系统