❤️❤️前言~🥳🎉🎉🎉
hellohello~,大家好💕💕,这里是E绵绵呀✋✋ ,如果觉得这篇文章还不错的话还请点赞❤️❤️收藏💞 💞 关注💥💥,如果发现这篇文章有问题的话,欢迎各位评论留言指正,大家一起加油!一起chin up!👍👍
💥个人主页:E绵绵的博客
💥所属专栏:JAVASE题目练习 JAVASE知识点专栏 c语言知识点专栏 c语言题目练习
该篇讲String主要是讲如何去使用String,所以比较简单,对于牵涉到String本质的真正很难的那部分我们到了数据结构再讲。
那么开始出发吧👊👊
String类的认识
❤️❤️对于String这个类型,我们以前往往认为它是一个简单的基本类型,但我们错了,对于String,它是一个类,为引用类型。
而我们的String类位于java.lang包中,java.lang包是Java的核心包,会自动导入到每个Java程序中。因此,在使用String类时,无需显式导入。
❤️❤️对于String内部有两个要注意的成员变量,一个为value ,一个为hash。
之后很多关于String的使用都会牵扯到这两个变量的使用。
其中value为字符数组 。
hash为整形,默认为0 .
❤️❤️那因为字符串为引用变量,当我们的println打印,应该是打印出地址呀,为什么像如下图一样打印出的是asdjj。
那是因为String这个类有重写toString方法,在println中经过一系列复杂的操作导致其打印出的其实是字符串对象内部的value成员数组中的每个数组成员。如上打印出asdjj。
String对象的创建
❤️❤️String对象的创建常见有以下三种:
public static void main(String[] args) { // 使用常量串构造 String s1 = "hello bit"; System.out.println(s1); // 直接newString对象 String s2 = new String("hello bit"); System.out.println(s1); // 使用字符数组进行构造 char[] array = {'h','e','l','l','o','b','i','t'}; String s3 = new String(array); System.out.println(s1); }
所以我们现在来逐步分析下:
🎯🎯使用常量串构造
🎯🎯在Java中,如上,字符串可以直接赋值而不需要使用new关键字是因为Java为字符串提供了特殊的字符串常量池(String Pool)机制。当我们使用双引号括起来的字符串字面量赋值给一个字符串变量时,Java会首先检查字符串常量池中是否已经存在相同内容的字符串对象,如果存在,则直接返回常量池中的引用;如果不存在,则在常量池中创建一个新的字符串对象,并返回其引用。
这种机制的好处是可以节省内存空间,避免创建大量相同内容的字符串常量对象。因为字符串在Java中是不可变的(Immutable),所以可以共享使用相同内容的字符串常量对象,提高了性能和效率。
需要注意的是,使用new关键字创建的字符串对象会在堆内存中创建一个新的对象,而不会在字符串常量池中创建对象。因此,直接赋值和使用new关键字创建字符串对象是有区别的。
注意字符串常量池位于java堆内存的一块特殊区域中,因为是特殊区域,所以在堆区正常创建对象不会影响字符串常量池。
🎯🎯对于字符串常量,如"abcd","shdak" 实则都是字符串常量对象的引用,它们指向的字符串对象都在字符串常量池中创建出来。
而对于这些字符串常量对象中的value数组变量,编译器会将该字符串常量如"Hello"转换为