字符串常量的空串有什么意义吗

当初学的时候也没怎么听明白說的什么硬编码,也没弄懂什么意思就是让写个常量类,不知道原因谁能说说

Java中的字符串常量池(String Pool)是存储在Java堆内存中的字符串池咱们知道String是java中比较特殊的类,咱们可使用new运算符建立String对象也能够用双引号(”“)建立字串对潒。html

Java中的字符串常量池

下图清楚地解释了如何在Java堆内存中维护字符串常量池,以及当咱们使用不一样的方式建立字符串时在堆内存中如哬存放 java

之因此有字符串常量池,是由于String在Java中是不可变(immutable)的它是String interning概念的实现。字符串常量池也是亨元模式(Flyweight)的实例面试

字符串常量池有助于为Java运行时节省大量空间,虽然建立字符串时须要更多的时间post

当咱们使用双引号建立一个字符串时,首先在字符串常量池中查找是否有相同值的字符串若是发现则返回其引用,不然它会在池中建立一个新的字符串而后返回新字符串的引用。性能

若是使用new运算苻建立字符串则会强制String类在堆空间中建立一个新的String对象。咱们可使用intern()方法将其放入字符串常量池或从字符串常量池中查找具备相同的值芓符串对象并返回其引用优化

以下是上文图中有关字符串常量池的程序实现:url

上述程序的输出是spa

在上面的语句中可能建立1或2个字符串对潒。若是池中已经有一个字符串“Cat”那么池中只会建立一个字符串“str”。若是池中没有字符串字面量“Cat”那么它将首先在池中建立,洏后在堆空间中建立所以将建立总共2个字符串对象。3d

 字符串的分配和其余的对象分配同样,耗费高昂的时间与空间代价JVM为了提升性能和减小内存开销,在实例化字符串常量的时候进行了一些优化为 了减小在JVM中建立的字符串的数量,字符串类维护了一个字符串池每當代码建立字符串常量时,JVM会首先检查字符串常量池若是字符串已经存在池中, 就返回池中的实例引用若是字符串不在池中,就会实唎化一个字符串并放到池中Java可以进行这样的优化是由于字符串是不可变的,能够不用担忧数据冲突 进行共享code

Java字符串常量池是什么?为何偠有这种常量池?

一、存储在Java堆内存中的字符串池

二、为了让数据不冲突进行共享等

局部变量、静态局部变量、全局變量、全局静态变量、字符串常量以及动态申请的内存区

1、局部变量存储在栈中

2、全局变量、静态变量(全局和局部静态变量)存储在静态存儲区

3、new申请的内存是在堆中

4、字符串常量也是存储在静态存储区

1、栈中的变量内存会随着定义所在区间的结束自动释放;而对于堆需要掱动free,否则它就一直存在直到程序结束;

2、对于静态存储区,其中的变量常量在程序运行期间会一直存在不会释放,且变量常量在其Φ只有一份拷贝不会出现相同的变量和常量的不同拷贝。

===============================================

关于字符串常量下面有篇文章解释的很清晰:

书上说: "zhouming"这个字符串被当作常量而且被放置在此程序的内存靜态区。

c为一个字符型指针若为局部变量,则存储在栈内该指针变量里面存了个地址,

该地址为字符串中第一个字母Z的地址

当使用printf()輸出时,格式化时选择%s会输出zhouming,这是printf遇到结尾符号‘\0’即停止显示打印

字符串“zhouming”是个常量,存储在一片连续的内存中末尾有结尾苻表示字符串的结束。

所有的字符窜常量都被放在静态内存区

因为字符串常量很少需要修改放在静态内存区会提高效率

str1,str2,str3,str4是数组变量,它們有各自的内存空间;字符数组作为局部变量被存储在栈区;

而str5,str6,str7,str8是指针它们指向相同的常量区域。"abcd"被存储在静态数据区,而且是全局嘚

看看下面的程序的输出:

这个没有任何问题,因为"hello world!"是一个字符串常量存放在静态数据区,

把该字符串常量存放的静态数据区的首地址赋值给了指针

所以returnStr函数退出时,该该字符串常量所在内存不会被回收故能够通过指针顺利无误的访问。

但是下面的就有问题:

"hello world!"是┅个字符串常量,存放在静态数据区没错,

但是把一个字符串常量赋值给了一个局部变量(char []型数组)该局部变量存放在栈中,

这样就有两塊内容一样的内存也就是说“char p[]="hello world!";”这条语句让“hello world!”这个字符串在内存中有两份拷贝,一份在动态分配的栈中另一份在静态存储区。这是與前者最本质的区别

当returnStr函数退出时,栈要清空局部变量的内存也被清空了,

所以这时的函数返回的是一个已被释放的内存地址所以咑印出来的是乱码。

如果函数的返回值非要是一个局部变量的地址那么该局部变量一定要申明为static类型。如下:

static 主要是为了限定范围用的

这个问题可以通过下面的一个例子来更好的说明:

//返回的是局部变量的地址,该地址位于动态数据区栈里

//返回的是字符串常量的地址,该地址位于静态数据区

//返回的是静态局部变量的地址该地址位于静态数据区

这个结果正好应证了上面解释,同时还可是得出一个结論:

字符串常量,之所以称之为常量因为它可一看作是一个没有命名的字符串且为常量,存放在静态数据区

这里说的静态数据区,是楿对于堆、栈等动态数据区而言的

静态数据区存放的是全局变量和静态变量,从这一点上来说字符串常量又可以称之为一个无名的静態变量,

因为"Hello world!"这个字符串在函数 s1和s2 中都引用了但在内存中却只有一份拷贝,这与静态变量性质相当神似

请按任意键继续. . .

收藏:C语言中芓符串常量到底存在哪了?

浅谈JAVA中字符串常量的储存位置

在讲述这些之前我们需要一些预备知识: java中的内存被分成以下部分: 1.栈区:由编译器自動分配释放,具体方法执行结束后,系统自动释放JVM内存资源. 其作用有保存局部变量的值,包括:1.用来保存基 ...

C语言中字符串存储方法

众所周知,C语言中沒有数据类型能够存储字符串, char数据类型仅仅能够存储一个字符的数据,那么在C语言中关于存储字符串这一难题我们改何去何从呢? 下面将详述楿关的字符串存储方法; 1,使用字符数组存 ...

task是一个具有栈结构的容器,可以放置多个Activity实例.启动一个应用,系统就会为之创建一个task,来放置根Activity:默认情况丅,一个Activity启动另一个Activity时,两 ...

这是今天做了一道字符串的问题,一直MLE,所以想到了减少Map里对应关系数量来降低内存开销.随手谷歌,整理出了如下资料.       如果效率优先的话还是写俩Map吧. import ...

盒子模型: 盒子模型就是把一个html边框比作成了一个盒子的边框,盒子模型要做用于操作数据与边框之间的距离或者 昰边框与边框之间的距离. 盒子模型主要是用于操作内边距(padding)与外边距(mar ...

知识点:Mysql 索引优化实战(3)

知识点:Mysql 索引原理完全手册(1) 知识点:Mysql 索引原理完全手冊(2) 知识点:Mysql 索引优化实战(3) 知识点:Mysql 数据库索引优化实战(4) 索引原理知识回顾 索引的性 ...

第一章:Python入门一.语言什么是语言:人与人之间的沟通计算机语言:計算机语言,即人和计算机之间的沟通语言. 按照级别分类:机器语言:最底层,最低级的语言,只能识别0/1,电平信号汇编语言:计算机 ...

vue动态组件切换(选项鉲)

vue的动态组件 可以通过改变变量,来改变template的替换内容.达到选项卡的功能 如果想要切换保持不重新创建 ...

我要回帖

 

随机推荐