预期("字符串常量之前")
字符串常量池是 Java 中的一块特殊内存区域,用于存储字符串对象。在 Java 中,字符串是不可变的,即创建后不能被修改。为了提高性能和节省内存空间,Java 使用了字符串常量池来管理字符串对象。
String 是 Java 中不可变的类,所以一旦被实例化就无法修改。不可变类的实例一旦创建,其成员变量的值就不能被修改。本文总结下 String 类设计成不可变的原因及好处,以及 String 类是如何设计成不可变的。
我想所有 Java 程序员都曾被这个 new String 的问题困扰过,这是一道高频的 Java 面试题,但可惜的是网上众说纷纭,竟然找不到标准的答案。有人说创建了 1 个对象,也有人说创建了 2 个对象,还有人说可能创建了 1 个或 2 个对象,但谁都没有拿出干掉对方的证据,这就让我们这帮吃瓜群众们陷入了两难之中,不知道到底该信谁得。
本质上一个常量,指针用来说明常量的类型,表示该常量是一个指针类型的常量。在指针常量中,指针自身的值是一个常量,不可改变,始终指向同一个地址。在定义的同时必须初始化。用法如下:
运行结果: http://c.biancheng.net http://c.biancheng.net 字符数组归根结底还是一个数组,上节讲到的关于指针和数组的规则同样也适用于字符数组。更改上面的代码,使用指针的方式来输出字符串:
目录: 1.常量池与Class常量池 2.运行时常量池 运行时常量池的简介 方法区的Class文件信息,Class常量池和运行时常量池的三者关系 3.字符串常量池 字符串常量池的简介 采用字面值的方式创建字符串对象 采用new关键字新建一个字符串对象 字符串池的优缺点 4.字符串常量池和运行时常量池之间的藕断丝连 常量池和字符串常量池的版本变化 String.intern在JDK6和JDK7之后的区别(重难点) 字符串常量池里存放的是引用还是字面量
相信大家在平时的JAVA面试中经常遇见String类型是什么?String类型是基础类型吗?今天就给大家分享下JAVA中String类型常见的面试题!
关于String以及StringBuffer、StringBuilder的相关信息可以参考博主的另一篇文章:
在 C++ 编程中,类型转换错误(Invalid Conversion)是常见的编译错误之一。特别是当程序试图将一个常量字符指针(const char*)转换为非常量字符指针(char*)时,会导致编译错误。这种错误通常发生在处理字符串和字符数组时。本文将深入探讨无效类型转换的成因、检测方法及其预防和解决方案,帮助开发者在编写 C++ 程序时避免和处理这种类型转换问题。
大家好,欢迎来到程序视点!我是小二哥。今天我们来来聊聊String类型对象不可变的问题。
首先讲获得字符串对象的方式有两种,一种是直接使用字符串常量,一种是使用new关键字创建,但它们之间是有一些区别,如下运行实例:
上面的测试代码进行了两组对比,如果你完全能理解执行的结果,那么恭喜你,这篇博客你没必要看了;反之,这篇博客接下来的内容就是你的菜。不过,即使你能答对执行结果,也建议你阅读下本文对常量池及字符串创建的分析,因为关于这块解读的博客确实非常多,但可惜的是,大多说法都是错误的!!!
昨天,我花了很长时间完善了一下 JavaGuide 上 JVM 部分方法区的相关介绍。
最流行的Java面试题之一就是:什么是不可变对象(immutable object),不可变对象有什么好处,在什么情况下应该用,或者更具体一些,Java的String类为什么要设成immutable类型? 不可变对象,顾名思义就是创建后不可以改变的对象,典型的例子就是Java中的String类。
Java中字符串对象创建有两种形式,一种为字面量形式,如String str = "droid";,另一种就是使用new这种标准的构造对象的方法,如String str = new String("droid");,这两种方式我们在代码编写时都经常使用,尤其是字面量的方式。然而这两种实现其实存在着一些性能和内存占用的差别。这一切都是源于JVM为了减少字符串对象的重复创建,其维护了一个特殊的内存,这段内存被成为字符串常量池或者字符串字面量池。
本文主要来介绍一下Java中的不可变对象,以及Java中String类的不可变性,那么为什么Java的String类是不可变对象?让我们一起来分析一下。
对于 Java 程序员来说,在虚拟机自动内存管理机制下,不再需要像 C/C++程序开发程序员这样为每一个 new 操作去写对应的 delete/free 操作,不容易出现内存泄漏和内存溢出问题。正是因为 Java 程序员把内存控制权利交给 Java 虚拟机,一旦出现内存泄漏和溢出方面的问题,如果不了解虚拟机是怎样使用内存的,那么排查错误将会是一个非常艰巨的任务。
传统的 C 语言中 错误处理 , 是通过返回不同的 int 类型值进行的 , 如 :
String的深入解析 首先String不属于8种基本数据类型,String是一个对象。 因为对象的默认值是null,所以String的默认值也是null;但它又是一种特殊的对象,有其它对象没有的一些特性。 new String()和new String(“”)都是申明一个新的空字符串,是空串不是null; - 1String str=”kvill”; 2 String str=new String (“kvill”); 的区别: 在这里,我们不谈堆,也不谈栈,只先简单引入常量池这
因为对象的默认值是null,所以String的默认值也是null;但它又是一种特殊的对象,有其它对象没有的一些特性。
在Java中String类的使用的频率可谓相当高。它是Java语言中的核心类,在java.lang包下,主要用于字符串的比较、查找、拼接等等操作。如果要深入理解一个类,最好的方法就是看看源码:
众所周知在java里面除了8种基本数据类型的话,还有一种特殊的类型String,这个类型是我们每天搬砖都基本上要使用它。
1、字符数组的定义与初始化 字符数组的初始化,最容易理解的方式就是逐个字符赋给数组中各元素。
怎么说呢,我没想到过自己写的东西居然能够帮助到别人,虽然可能只是是一句客套的夸赞,也许还含有很多的鼓励成分,但我还是挺开心的。
2019.07.07问题及解析 String str = new String("xiaodao");这个语句一共会创建几个String object? A.1 B.2 C.3 D.4 答案与解析 1
String是Java中的引用类型,位于java.lang下,该类所定义的变量可用于指向字符串对象,然后来操作该字符串。
国际惯例,每天更新答疑解惑。网友们在群里有很多问题讨论,小编挑几个很有代表性的问题给大家叨叨几句。 一、关于Java学习资料: 昨天有网友对于Java群中资料少表达了不满,小编赶快去群里看了看是不是真的少,发现有Java编程思想、Java核心技术卷I、正则表达式等,在小编看来可能是已经够了,可能是因为没有视频资源吧,这个问题我尽快申请网盘满足大家的需求。 小编根据自己的学习经历给大家一些建议: 再多的学习资料也只是在你搜集的时候心里很兴奋,觉得我拿到了就能学到,这真的是不正确的,不能仅仅是满足自己的心里需要
我们平常给一个字符串初始化了,但是后面我们想重新赋一个字符串却错误了,如下面的操作。
字符串常量池是 Java 中的一种特殊的内存区域,用于存储字符串常量。它是在编译阶段就确定并存储的,是一种优化机制,可以减少内存的占用和提高程序的执行效率。
作为一个关键词,你可以将 const 视为对数据的权限控制机制之一,它主要用于限制数据的可变性,从而提高代码的安全性和可靠性。通过使用 const,可以缩小对数据的修改权限,确保数据在某些情况下不被意外修改。
在JVM中,为了减少字符串对象的重复创建,维护了一块特殊的内存空间,这块内存就被称为字符串常量池。
关键字 const 被用于表示常量,常量用于存储不会改变的数据,常量中的数据类型只可以是布尔型、数字型(整数型、浮点型和复数)和字符串型。
String.intern 方法是 Java 中的一个方法,「它用于将字符串对象添加到字符串常量池中,并返回常量池中该字符串的引用。如果常量池中已经存在该字符串,则直接返回常量池中的引用」。
JDK1.8-1.9,String底层从char数组变成了byte数组,原因是部分字符仅占一个byte,而堆中含有大量的String字符串,该优化能节省较多空间。
本文以 JDK 1.8 为讨论版本,虽然现在都已经 JDK 14了,奈何我们还是钟爱 1.8。
在Java开发中不管是前后端交互的JSON串,还是数据库中的数据存储,我们常常需要使用到String类型的字符串。作为最常用也是最基础的引用数据类型,JVM为String提供了字符串常量池来提高性能,本篇文章我们一起从底层JVM中认识并学习字符串常量池的概念和设计原理。
关于字符串的比较在前面文章中已经详解过,本篇文章基于字符串常量池的存储及在使用intern方法时所引起的内存变化进行一步深层次的讲解。
intern() 方法是 java.lang.String 类中的一个方法,用于在 Java 字符串常量池中添加字符串对象,并返回对字符串对象的引用。它的作用是将字符串对象添加到字符串常量池中,并且如果字符串常量池已经存在相同内容的字符串,则返回对该字符串的引用。
String字符串在我们日常开发中最常用的,当然还有他的两个兄弟StringBuilder和StringBuilder。他三个的区别也是面试中经常问到的,大家如果不知道,就要先去看看了哈!最近也是看周志明老师的深入JVM一书中写到关于intern()方法的介绍,小编也是以前没在开发中用到。但是面试题还是很多的,所以特意研究了一天,写下来记录一下自己的收获,希望也可以帮助到大家!!
作为最基础的引用数据类型,Java 设计者为 String 提供了字符串常量池以提高其性能,那么字符串常量池的具体原理是什么,我们带着以下三个问题,去理解字符串常量池:
String.intern() 方法可以使得所有含相同内容的字符串都共享同一个内存对象。
在网上看了很多博客,解释也比较多,关于字符串常量池的具体位置难以分辨谁真谁假。
基本上和c语言中的常量类似,但有区别 在const关键字的基础上,添加了readonly,readonly关键字在笔记中说明。
看 1.8 , 疯狂的intern, 抛出了 heap oom ,由此可以推断出 1.8中的字符串常量池 是在堆中。
领取专属 10元无门槛券
手把手带您无忧上云