iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >分析Java中为什么String不可变
  • 696
分享到

分析Java中为什么String不可变

2024-04-02 19:04:59 696人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

目录常量池便利安全引申问题String在Java中的【引用传递】常量池 Java中我们创建String对象有两种基本方法。 String str1 = "zxhtom"; Str

常量池

Java中我们创建String对象有两种基本方法。


String str1 = "zxhtom";
String str2 = new String("zxhtom");

上面两种方式我们创建了两个String变量 。 但是第一种通过双引号创建的zxhtom这个对象我们称之为常量 。 在JVM中是存储在一块叫【常量池】中的。而第二种str2是我们称之为普通变量。new一次就在JVM中开辟一块内存。

【常量池】的作用就是复用,当同样的内容再次被通过常量方式创建的时候Java会指向同一块地址。通过如下代码理解:


String z1 = "zxhtom";
String z2 = "zxhtom";

通过上图我们可以了解 z1 , z2两个变量其实引用的是同一内存地址 。 所以z1==z2 为true .

到这里引发出为什么String被设计为不可变 。 上列中z1 被修改成zxh . 如果String是可变得那么z2就会被莫名其妙修改成zxh .

便利

在Java中判断两个对象相等时通过地址判断。但是地址被抽象话为一段hash函数。在Java使用中hash是经常被使用的。将String设置为不可变性那么hash就可以一直使用下去。不需要重新计算体现了便捷性

安全

仍是上面的情况 , z2会被不知情的情况下被修改了。这在多线程中很常见。我们在使用的时候会被其他情况将数据更改。这样我们的数据将会失去了准确性。

引申问题

在上部中我们提到String的常量池。针对常量池引发思考 【String.intern()】

该方法的功能就是扩充【常量池】。z2.intern() 表示判断常量池中是否存在与该值相同的对象如果有则返回该对象的引用。 如果没有则将该值注册到内存中。注意这里并不是将z2对象注册过去。而是将z2的值注册进去。


String z1=new String("zxhtom");
String z2=z1.intern();
System.out.println( z1==z1.intern() );
System.out.println( z1.hashCode()+" "+z2.hashCode() );
System.out.println( z2==z1 );
System.out.println( z2==z1.intern() );

输出结构

false

-688175064 -688175064

false

true

分析一下输出结果不难发现,z1.intern()是常量池中没有zxhtom,会将zxhtom值创建到常量池中,z2就是引用常量池中的引用。这个时候z1==z2 为false说明注册到常量池中的并不是z1的地址,而是相当于z1的一个对象拷贝。

string创建方式的确定简单归结:

  • 通过双引号创建的 == 常量创建
  • 通过常量拼接 == 常量创建
  • 通过非常量与常量拼接 = 非常量创建
  • 通过new 创建 == 非常量创建

String在Java中的【引用传递】

在Java中方法参数传递都是通过值传递的。但是为什么String给我们的感觉是引用传递的呢?


public static void main(String[] args) {
	String x = new String("ab");
	change(x);
	System.out.println(x);
}
 
public static void change(String x) {
	x = "cd";
}

String不是基本对象所以String是引用传递。但是这里的引用传递知识传递String引用的地址 .当执行x=cd是原来ab的对象还在JVM中。外部x的引用地址没有变 。 变得知识change方法中x的指向。所以外部打印的还是ab

以上就是分析Java中为什么String不可变的详细内容,更多关于Java中为什么String不可变的资料请关注编程网其它相关文章!

--结束END--

本文标题: 分析Java中为什么String不可变

本文链接: https://www.lsjlt.com/news/127689.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 分析Java中为什么String不可变
    目录常量池便利安全引申问题String在Java中的【引用传递】常量池 Java中我们创建String对象有两种基本方法。 String str1 = "zxhtom"; Str...
    99+
    2024-04-02
  • Java中的String为什么是不可变的
    这篇文章主要介绍“Java中的String为什么是不可变的”,在日常操作中,相信很多人在Java中的String为什么是不可变的问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java中的String为什么是不...
    99+
    2023-06-17
  • Java中String是不可变的吗
    这篇文章主要介绍“Java中String是不可变的吗”,在日常操作中,相信很多人在Java中String是不可变的吗问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java中String是不可变的吗”的疑惑有所...
    99+
    2023-06-27
  • 分析JDK中String的存储区与不可变性
    这篇文章主要介绍“分析JDK中String的存储区与不可变性”,在日常操作中,相信很多人在分析JDK中String的存储区与不可变性问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”分析JDK中String的存储...
    99+
    2023-06-02
  • String的不可变是因为Final 吗
    这篇文章主要讲解了“String的不可变是因为Final 吗”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“String的不可变是因为Final 吗”吧!St...
    99+
    2024-04-02
  • Java源码分析:Guava之不可变集合ImmutableMap的源码分析
    目录一、案例场景二、ImmutableMap源码分析总结一、案例场景 遇到过这样的场景,在定义一个static修饰的Map时,使用了大量的put()方法赋值,就类似这样—— pu...
    99+
    2024-04-02
  • 关于Java Guava ImmutableMap不可变集合源码分析
    目录Java Guava不可变集合ImmutableMap的源码分析一、案例场景二、ImmutableMap源码分析Java Guava不可变集合ImmutableMap的源码分析 ...
    99+
    2024-04-02
  • python数据类型可变与不可变深入分析
    目录一.可变类型与不可变类型的特点1.不可变数据类型2.可变数据类型二.哪些是可变类型哪些是不可变类型一.可变类型与不可变类型的特点 1.不可变数据类型 不可变数据类型在第一次声明赋...
    99+
    2024-04-02
  • java String如何被设计成不可变对象
    这篇文章主要介绍“java String如何被设计成不可变对象”,在日常操作中,相信很多人在java String如何被设计成不可变对象问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”java String如何...
    99+
    2023-06-19
  • Java中的String对象不可改变的特性有哪些
    Java中的String对象不可改变的特性有哪些?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。1. String对象不可改变的特性下图显示了如下代码运行的过程:...
    99+
    2023-05-31
    java string ava
  • java中可变参数是什么
    这期内容当中小编将会给大家带来有关java中可变参数是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。python是什么意思Python是一种跨平台的、具有解释性、编译性、互动性和面向对象的脚本语言,其...
    99+
    2023-06-14
  • Python不可变数据结构举例分析
    这篇文章主要讲解了“Python不可变数据结构举例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python不可变数据结构举例分析”吧!我们从思考正方形和矩形开始。如果我们抛开实现细节,...
    99+
    2023-06-17
  • Java中String类的示例分析
    这篇文章主要为大家展示了“Java中String类的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Java中String类的示例分析”这篇文章吧。带大家了解一下java的基础法语---S...
    99+
    2023-06-15
  • java环境变量配置为什么不成功
    Java环境变量配置不成功可能有以下几个原因:1. 配置错误:可能配置的路径不正确,或者配置的环境变量名称有误。在配置环境变量时,需...
    99+
    2023-09-08
    java
  • Java可变参数是什么
    这篇文章主要讲解了“Java可变参数是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java可变参数是什么”吧!什么是可变参数?就是方法参数用 Object... args 三个点形式,...
    99+
    2023-06-19
  • Java变量的可见性问题实例分析
    这篇文章主要介绍了Java变量的可见性问题实例分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java变量的可见性问题实例分析文章都会有所收获,下面我们一起来看看吧。问题:s...
    99+
    2024-04-02
  • 为什么numpy对象是Python数据分析中必不可少的数据类型?
    在Python中,NumPy是一种非常重要的数据类型,尤其在数据分析领域中,它的作用更为突出。那么,为什么NumPy对象是Python数据分析中必不可少的数据类型呢?本文将从以下几个方面进行阐述。 一、NumPy的基本介绍 NumPy是Py...
    99+
    2023-07-20
    数据类型 numy 对象
  • VB.NET中匿名类型可变与不可变之间有什么区别
    这篇文章给大家分享的是有关VB.NET中匿名类型可变与不可变之间有什么区别的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。VB.NET匿名类型只要可以分为两种,一种是可变匿名类型;另一种则是不可变匿名类型。对于这两...
    99+
    2023-06-17
  • Python可变与不可变数据和深拷贝与浅拷贝实例分析
    这篇文章主要介绍“Python可变与不可变数据和深拷贝与浅拷贝实例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Python可变与不可变数据和深拷贝与浅拷贝实例分析”文章能帮助大家解决问题。浅拷...
    99+
    2023-06-29
  • python的可变和不可变数据类型是什么
    这篇文章主要讲解了“python的可变和不可变数据类型是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“python的可变和不可变数据类型是什么”吧!不可变数据类型python中不可变数据...
    99+
    2023-06-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作