java中String类型变量的赋值问题介绍


Posted in Javascript onMarch 23, 2016

运行下面这段代码,其结果是什么?

package com.test;

public class Example {
  
  String str = new String("good");
  char[] ch = { 'a', 'b', 'c' };

  public static void main(String[] args) {
    Example ex = new Example();
    ex.change(ex.str, ex.ch);
    System.out.println(ex.str);
    System.out.println(ex.ch);
  }

  public void change(String str, char ch[]) {
    str = "test ok";
    ch[0] = 'g';
  }
  
}

结果如下:

good
gbc

解说:

java 中String是 immutable的,也就是不可变,一旦初始化,其引用指向的内容是不可变的(注意:是内容不可变)。

也就是说,假设代码中有String str = “aa”;str=“bb”;,则第二条语句不是改变“aa”原来所在存储地址中的内容,而是另外开辟了一个空间用来存储“bb”;同时由于str原来指向的“aa”现在已经不可达,jvm会通过GC自动回收。
 
在方法调用时,String类型和数组属于引用传递,在上述代码中,str作为参数传进change(String str, char ch[]) 方法,方法参数str指向了类中str指向的字符串,但str= "test ok"; 语句使得方法参数str指向了新分配的地址,该地址存储“test ok”,而原来的str仍然指向“good”。对于数组而言,在change方法中,方法参数ch指向了类中ch指向的数组,ch[0] = 'g';语句改变了类中ch指向的数组的内容
 

我们再来看下面这段代码,它的运行结果是什么?

package com.test;

public class Example {
  
  String str = new String("good");
  char[] ch = { 'a', 'b', 'c' };

  public static void main(String[] args) {
    Example ex = new Example();
    ex.change(ex.str, ex.ch);
    System.out.println(ex.str);
    System.out.println(ex.ch);
  }

  public void change(String str, char ch[]) {
    str = str.toUpperCase();
    ch = new char[]{ 'm', 'n' };
  }
  
}

结果如下:

good
abc

有了前面的解释,这个结果是不是在意料之中?!

以上这篇java中String类型变量的赋值问题介绍就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
!DOCTYPE声明对JavaScript的影响分析
Apr 12 Javascript
js实现网站首页图片滚动显示
Feb 04 Javascript
jQuery提交多个表单的小技巧
Jul 27 Javascript
js网页右下角提示框实例
Oct 14 Javascript
jQuery简单实现网页选项卡特效
Nov 24 Javascript
jQuery ajax时间差导致的变量赋值问题分析
Jan 22 Javascript
AngularJS路由实现页面跳转实例
Mar 03 Javascript
Vue的轮播图组件实现方法
Mar 03 Javascript
vue打包相关细节整理(小结)
Sep 28 Javascript
webstorm+vue初始化项目的方法
Oct 18 Javascript
JS实现可用滑块滑动的缓动图代码
Sep 01 Javascript
ES6中Promise的使用方法实例总结
Feb 18 Javascript
基于javascript实现泡泡大冒险网页版小游戏
Mar 23 #Javascript
基于javascript实现句子翻牌网页版小游戏
Mar 23 #Javascript
基于jquery编写的放大镜插件
Mar 23 #Javascript
Jquery+ajax+JAVA(servlet)实现下拉菜单异步取值
Mar 23 #Javascript
JavaScript弹出对话框的三种方式
Mar 23 #Javascript
JS随机洗牌算法之数组随机排序
Mar 23 #Javascript
JavaScript学习笔记之取数组中最大值和最小值
Mar 23 #Javascript
You might like
PHP 5昨天隆重推出--PHP 5/Zend Engine 2.0新特性
2006/10/09 PHP
PHP中的cookie不用刷新就生效的方法
2012/02/04 PHP
php图片加水印原理(超简单的实例代码)
2013/01/18 PHP
php将字符串全部转换成大写或者小写的方法
2015/03/17 PHP
PHP架构及原理知识点详解
2019/12/22 PHP
原生js与jQuery实现简单的tab切换特效对比
2015/07/30 Javascript
详解JavaScript函数
2015/12/01 Javascript
分享12个实用的jQuery代码片段
2016/03/09 Javascript
Javascript基础教程之比较null和undefined值
2016/05/16 Javascript
Bootstrap组合上、下拉框简单实现代码
2017/03/06 Javascript
微信小程序 跳转传递数据的实例
2017/07/06 Javascript
Vue项目webpack打包部署到服务器的实例详解
2017/07/17 Javascript
BootStrap模态框和select2合用时input无法获取焦点的解决方法
2017/09/01 Javascript
VUE重点问题总结
2018/03/19 Javascript
Vue路由切换时的左滑和右滑效果示例
2018/05/29 Javascript
微信小程序踩坑记录之解决tabBar.list[3].selectedIconPath大小超过40kb
2018/07/04 Javascript
vue 实现边输入边搜索功能的实例讲解
2018/09/16 Javascript
微信小程序使用wx.request请求服务器json数据并渲染到页面操作示例
2019/03/30 Javascript
layui关闭弹窗后刷新主页面和当前更改项的例子
2019/09/06 Javascript
JS call()及apply()方法使用实例汇总
2020/07/11 Javascript
[01:15:16]DOTA2-DPC中国联赛 正赛 Elephant vs Aster BO3 第一场 1月26日
2021/03/11 DOTA
python 读写中文json的实例详解
2017/10/29 Python
Python基于列表list实现的CRUD操作功能示例
2018/01/05 Python
详解Python 装饰器执行顺序迷思
2018/08/08 Python
10 分钟快速入门 Python3的教程
2019/01/29 Python
python操作yaml说明
2020/04/08 Python
python PyAUtoGUI库实现自动化控制鼠标键盘
2020/09/09 Python
css3实现背景模糊的三种方式(小结)
2020/05/15 HTML / CSS
中粮集团旗下食品网上购物网站:我买网
2016/09/22 全球购物
在SQL Server中创建数据库主要有那种方式
2013/09/10 面试题
五年级数学教学反思
2014/02/11 职场文书
优秀工会工作者事迹材料
2014/06/02 职场文书
2015年学校办公室工作总结
2015/05/26 职场文书
小学语文教学随笔
2015/08/14 职场文书
理解深度学习之深度学习简介
2021/04/14 Python
springboot为异步任务规划自定义线程池的实现
2022/06/14 Java/Android