java string值传递_String是值传递还是引用传递

string中的坑

最近看到一道关于string的面试题,差点让我以为string是值传递,就是下面这个例子,体验下:

public class demo{

public static void main(string[] args) {

demo d = new demo();

string str = "bea";

d.change(str);

system.out.println(str);

}

void change(string s){

s= s.replace('a', 'e');

s = s.tolowercase();

}

}

当时一看到这个题目,我第一反应就是输出”bee“,因为string是引用类型,其参数传递的方式就是引用传递,传递的是string的地址。可是答案让我的大吃一惊,“bea”,str根本就没有发生变化!!

难道string是值传递?难道string是基本类型?

其实都不是,后来通过查阅相应资料发现,jvm在实例化字符串时会使用字符串常量池,把str作为参数传入change()方法。jvm复制了一份str变量,为了便于理解我们叫它str'。这个时候str和str'都指向字符串常量池中的“abc”。

当我们执行s = s.replace('a', 'e');

其实相当于执行了s = new string(s.replace('a', 'e'));

要理解上面这两段话,就要从java的底层结构说起了。java的内存模型大体分为 堆 和 栈 (细分还有方法区,和程序计数器等)。

1.基本类型的变量放在栈里;

2.封装类型中,对象放在堆里,对象的引用放在栈里。

java在方法传递参数时,是将变量复制一份,然后传入方法体去执行。

根据这些再细分一下jvm的执行过程

1.虚拟机在堆中开辟一块内存,并存值”bea”。

2.虚拟机在栈中分配给str一个内存,内存中存的是1中的地址。(1指第一步)

3.虚拟机复制一份str,我们叫str’,str和str’内存不同,但存的值都是1的地址。

4.将str’传入方法体

5.方法体在堆中开辟一块内存,并存值”bee”。

6.方法体在堆中再次开辟一块内存,并存值”bee”。

7.方法体将str’的值改变,存入5的内存地址。

8.方法结束,方法外打印str,由于str存的是1的地址,所有打印结果是”bea”。

string的底层是一个不可变数据,所以每次给他赋新的值的时候都相当于新建了一个string对象(如果string常量池里没有该字符串的话),我们可以验证一下。

public class demo{

public static void main(string[] args) {

demo d = new demo();

//通过比较str的hashcode来比较两个对象是否为同一对象

string str = "bea";

system.out.println("第一次string的hashcode:"+str.hashcode());

str = "bee";

system.out.println("第二次string的hashcode:"+str.hashcode());

//stringbuilder来试一次

stringbuilder s = new stringbuilder("bea");

system.out.println("第一次stringbuilder的hashcode:"+s.hashcode());

s.append('t');

system.out.println("第二次stringbuilder的hashcode:"+s.hashcode());

system.out.println("调用方法前的stringbuilder对象的值:"+s);

d.change(s);

system.out.println("调用方法后的stringbuilder对象的值:"+s);

}

void change(stringbuilder s){

s = s.append('s');

}

}

看看执行的结果~

0f2e60e2f178a7718df8fd8785a1776d.png

tips: hashcode并不能判断是否为同一个对象,但是hashcode不同的话肯定不是同一个对象,hashcode相同的不一定是同一个对象。

关注我不会让你失望哟~

希望与广大网友互动??

点此进行留言吧!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/559977.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java切换jdk版本_切换JDK版本quick

最近遇到一个小问题,同时做两个项目,jdk版本一个是5,一个是6,我也去网上找了找方法,但是感觉不是特别好用,最后自己通过一些环境变量设置的技巧和一些批处理命令来使得这件事情只需要双击,输入一…

java读取excel数据的方法是_java怎么读取excel文件里的数据

展开全部下面是一个简单的读取例子,如果报“java.io.IOException: Invalid header signature; read 4503608217567241, expected -2226271756974174256”之类的异常请用Excel打开(如果能打的开的话)62616964757a686964616fe58685e5aeb931333361323639然后另存为一下…

Linux下导出MySQL为SQL文件_MySQL导入导出.sql文件步骤

MySQL导入导出.sql文件步骤如下:一.MySQL的命令行模式的设置:桌面->我的电脑->属性->环境变量->新建->PATH“;path\mysql\bin;”其中path为MySQL的安装路径。二.简单的介绍一下命令行进入MySQL的方法:1.C:\>mys…

python sort 多级排序_Python使用sort和class实现的多级排序功能示例

本文实例讲述了Python使用sort和class实现的多级排序功能。分享给大家供大家参考,具体如下:# -*- coding:utf-8 -*-import randomclass Temp:def __init__(self, a, b, c):self.a aself.b bself.c cdef __str__(self):return ( ([a: %d b: %d c: %d] …

the java home_the java_home environment variable is not defined correctly

在启动tomcat中的startup.bat时,总是报以下错误the java_home environment variable is not defined correctlyThis environment variable is needed to run this programNB: java_home should point to a jdk not a jre环境变量的路径没有问题,把jdk重装…

java中添加背景_java中如何增加背景图片

我的程序代码如下,试了加背景的方法虽然程序没有错误,但是背景还是显示不出来,按钮的setsize好像也不起作用,希望高人能助一臂之力,小女子先写过各位了:、、、、importjava.awt....我的程序代码如下&#x…

java存钱_用Java编写银行存钱取钱

const readline require(readline-sync)//引用readline-synclet s 2;//错误的次数for (let i 0; i < 3; i) {console.log(请输入名&#xff1a;(由英文组成));let user readline.question();console.log(请输入密码&#xff1a;(由数字组成));let password readline.qu…

我的世界java服务器刷_一个教程, 叫你如何在服务器刷op

教 你 如 何 在 服 务 器 内 刷 取op~&#xff01;首先打开JAVA文件夹找到bin\client 里面的Xusage然后打开然后会得到这个内容-Xmixed mixed mode execution (default)-Xint interpreted mode execution only-Xbootclasspath:set search path for boots…

mysql 小雨_Mysql数据库

Mysql服务配置安装mysqld服务&#xff1a;yum groupinstall ‘mysql database server’yum –y install mysql-server php-mysql服务名&#xff1a; mysqld默认的数据库存放在&#xff1a; /var/lib/mysql下启动服务&#xff1a; service mysqld restart可以直接登陆&#xff1…

java eav_动态自定义字段属性–Magento的EAV模型 | 学步园

EAV &#xff1a; Entity - Attribute - Value 的缩写&#xff0c;是数据库模型的一种&#xff0c;使用eav建模的好处是可以动态为数据模型增加或移除属性。1. 问题提出:假设需要定义一个实体Customer的信息&#xff0c;通常我们只要定义一个表为customer&#xff0c;并定义相应…

java 对象视图框架_Stripes视图框架Java对象属性验证和prototype.js Ajax的测试

Stripes视图框架Java对象属性验证&#xff0c;它允许对字段设置是否必须填写&#xff0c;对数字大小进行限制等。我用prototype.js Ajax 将验证后的数据及时地展示出来&#xff0c;下面来看程序。1、编写User实体类此用户共三个属性&#xff1a; name、email、age.package com.…

java中unicode显示乱码_Java 已知Java系统编码是GBK,jtextarea从一编码为Unicode的文本中读取数据,出现乱码,怎么正常显示?...

Java 已知Java系统编码是GBK&#xff0c;jtextarea从一编码为Unicode的文本中读取数据&#xff0c;出现乱码&#xff0c;怎么正常显示&#xff1f;关注:159 答案:2 mip版解决时间 2021-02-03 12:45提问者鉨瞞着所囿亾&#xff0c;爱着誰2021-02-02 16:35我觉得jtextarea中读取…

java中按钮的接口_Java接口基础

接口(interface)1.接口体中包含常量的声明(没有变量)和抽象方法两部分。接口体中只有抽象方法&#xff0c;没有普通的方法&#xff0c;而且接口体中所有的常量访问权限一定是public&#xff0c;而且是static常量(允许省略public、final和static修饰符)&#xff0c;所有的抽象方…

python之if经典语句_Python之if语句、字典

if语句1>利用if语句判断用户是否被禁言banned_users.pybanned_users[Lily,jonh,Susan]userLilyif user not in baned_users:print(user.title()",you can post a response if you wish.")######2>if else 语句age17if age>18:print("You are old enoug…

java 线程加载类_java JVM-线程上下类加载器

public class One {public static void main(String[] args) throws Exception {ClassLoader loaderOne.class.getClassLoader();System.out.println(loader);//获得当前线程的上下文加载器&#xff0c;未改变前和第一种是一样的ClassLoader loader2Thread.currentThread().get…

catalog move.php,catalog.php

/*** WK 列出所有分类及品牌* * * 版权所有 2005-2012 QQ 80342014&#xff0c;并保留所有权利。* &#xff1b;* ----------------------------------------------------------------------------* 这不是一个自由软件&#xff01;您只能在不用于商业目的的前提下对程序代码进…

php get 数据类型,PHP基础-数据类型-integet

integer 是集合 ℤ {…, -2, -1, 0, 1, 2, …} 中的某个数。语法整型值可以使用十进制&#xff0c;十六进制&#xff0c;八进制或二进制表示&#xff0c;前面可以加上可选的符号(- 或者 )。 可以用 负运算符 来表示一个负的integer。二进制表达的 integer 自 PHP 5.4.0 起可用…

php怎么seo,怎样学习seo

学习seo的方法&#xff1a;1、从搜索引擎原理开始&#xff0c;学习seo要先从搜索引擎原理开始&#xff1b;2、多思考&#xff1b;3、学习seo要多看高质量的seo教程&#xff1b;4、多和seo高手交流&#xff0c;经常听听大神的seo理论&#xff0c;集百家之所长&#xff0c;这样会…

php callable 参数,php 利用反射执行callable

现在有一个这样的函数我想利用反射&#xff0c;再用call_user_func执行&#xff0c;当然&#xff0c;我不是白痴和多此一举&#xff0c;主要是因为上面的$func是一个数组中的值&#xff0c;我现在要写一个解析数据函数&#xff0c;会遇到$func&#xff0c;写法如下&#xff1a;…

php ip 短时间 重复,php 限制同一个IP 一段时间不能评论多次,能给我详细解决的...

php 限制同一个IP 一段时间不能评论多次,能给我详细解决的mip版 关注:163 答案:3 悬赏:30解决时间 2021-01-25 15:27已解决2021-01-25 05:54php 限制同一个IP 一段时间不能评论多次,能给我详细解决的最佳答案2021-01-25 06:49在评论的操作中&#xff0c;都需要记录用户ip地址…