Java题目分析
2021/9/28 11:40:53
本文主要是介绍Java题目分析,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
赋值问题
String 和 Char 赋值问题
如题
- 判断下列代码输出情况
public class Example { String str = new String("good"); char[] ch = { 'a', 'b', 'c' }; public void change(String str, char ch[]) { str = "test ok"; ch[0] = 'g'; } public static void main(String[] args) { Example ex = new Example(); ex.change(ex.str, ex.ch); System.out.println(ex.str); for(char a : ex.ch) System.out.print(a + " "); } }
输出结果为
good
g,b,c
原因
Java中 String 类型是 immutable (不可变得),即 引用指向内容 不可变
也就是说定义一个 String 类型 变量 str ,给 str 赋予初值 "aa",再给 str 赋值 "bb",str 赋值 "bb" 时,不是改变 "aa"的存储内容,而是 重新开辟一块存储空间,同时原先指向 "aa"地址不可达了,jvm 通过 GC自动回收。
题中 方法调用时,str = "test ok" 语句开辟了新的地址,但是原来的 str 仍然 指向 "good",所以输出时仍然是 good ,数组中 参数 ch 指向了类中 ch 指向的数组,语句改变了 类中的数组内容。
public class Example { String str = new String("good"); char[] ch = { 'a', 'b', 'c' }; public void change(String str, char ch[]) { str = "test ok"; System.out.println("形参str 哈希码 :" + str.hashCode()); ch[0] = 'g'; } public static void main(String[] args) { Example ex = new Example(); ex.change(ex.str, ex.ch); System.out.println("成员变量str 哈希码 :" + ex.str.hashCode()); System.out.println(ex.str); for(char a : ex.ch) System.out.print(a + " "); } }
通过 查看哈希码 能发现他们地址不同 :
解决方法
方法一
- 不使用形参输入,直接调用成员变量 str
public class Example { String str = new String("good"); char[] ch = { 'a', 'b', 'c' }; public void change(char ch[]) { str = "test ok"; ch[0] = 'g'; } public static void main(String[] args) { Example ex = new Example(); ex.change(ex.ch); System.out.println(ex.str); for(char a : ex.ch) System.out.print(a + " "); } }
方法二
- 使用 this 调用 成员变量
public class Example { String str = new String("good"); char[] ch = { 'a', 'b', 'c' }; public void change(String str, char ch[]) { this.str = "test ok"; ch[0] = 'g'; } public static void main(String[] args) { Example ex = new Example(); ex.change(ex.str, ex.ch); System.out.println(ex.str); for(char a : ex.ch) System.out.print(a + " "); } }
方法三
- 将 str 以返回值的方式 用对象 调用 成员变量 str
public class Example { String str = new String("good"); char[] ch = { 'a', 'b', 'c' }; public String change(String str,char ch[]) { str = "test ok"; ch[0] = 'g'; return str; } public static void main(String[] args) { Example ex = new Example(); ex.change(ex.str,ex.ch); System.out.println(ex.change(ex.str,ex.ch)); for(char a : ex.ch) System.out.print(a + " "); } }
参考于:https://blog.csdn.net/weixin_30765505/article/details/95110037
这篇关于Java题目分析的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2025-01-12百万架构师第十五课:源码分析:Spring 源码分析:SpringMVC核心原理及源码分析|JavaGuide
- 2025-01-11有哪些好用的家政团队管理工具?
- 2025-01-11营销人必看的GTM五个指标
- 2025-01-11办公软件在直播电商前期筹划中的应用与推荐
- 2025-01-11提升组织效率:上级管理者如何优化跨部门任务分配
- 2025-01-11酒店精细化运营背后的协同工具支持
- 2025-01-11跨境电商选品全攻略:工具使用、市场数据与选品策略
- 2025-01-11数据驱动酒店管理:在线工具的核心价值解析
- 2025-01-11cursor试用出现:Too many free trial accounts used on this machine 的解决方法
- 2025-01-11百万架构师第十四课:源码分析:Spring 源码分析:深入分析IOC那些鲜为人知的细节|JavaGuide