题目1.指出下列程序运行的结果 ()
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.print(ex.str + " and "); System.out.print(ex.ch); } public void change(String str, char ch[]) { str = "test ok"; ch[0] = 'g'; }
}

A、 good and abc

B、 good and gbc

C、 test ok and abc

D、 test ok and gbc

答案:B

解析:我也像很多人一样,上了就像选D。但敲到eclipse中试了下,的确输出B。很神奇!百度了一下,这就是所谓的java只有值传递,没有引用传递。

就是说传入的实参是对象str的值,同时为复制这个值并分配一个新的引用地址,而并不是原本的str的引用。所以修改新的值与原始的并没有关系。

这里有个哥们讲的比较精髓:

http://guhanjie.iteye.com/blog/1683637

但为什么char数组的首位元素的值却被修改了呢?这个让我不仅想到Python的内存处理:

对于简单的Python对象,例如数值、字符串,元组(tuple不允许被更改)采用的是复制的方式(深拷贝),也就是说当将另一个变量B赋值给变量A时,虽然A和B的内存空间仍然相同,但当A的值发生变化时,会重新给A分配空间,A和B的地址变得不再相同
而对于像字典(dict),列表(List)等,改变一个就会引起另一个的改变,也称之为浅拷贝
 
Java中的数组,也是可以改变元素数量的,就像Python中的字典和列表。new char[]时,编译器要做的,只是分配一块内存给它,保存指向数组实体的地址。
所以当数组作为实参传入函数的时候,肯定传入的是数组的引用地址,引用地址指向数组对象真实的值,所以该数组元素被修改了。
 
同时,联想到今天面试遇到的一个问题,做下记录说明:
题目2.Java中字符串连接有哪些方法,其中+连接时内存是怎么分配的?
首先,常用的字符串连接就是+和append,网上还有提到:strFormat2(s1, s2);
其实+是重载了StringBuilder的append()方法,append()是StringBuilder对象中的一个方法。
strFormat源代码也是通过StringBuilder实现的。
所以StringBuilder是其他两种方式的基础实现,所以还是StringBuilder比较占优势。
 
而且Java中String对象是不可变的,String类中每一个修改String的方法,其实都是创建了一个全新的String对象,当然append()也不例外。
网上有一个帖子详细比较了这三个方法的内存消耗:
http://www.2cto.com/kf/201409/333054.html
只有append()的确是最直接也是速度最快的!
 
 
												

Java_内存管理String and Array的更多相关文章

  1. iOS: ARC & MRC下string内存管理策略探究

    ARC & MRC下string内存管理策略探究 前两天跟同事争论一个关于NSString执行copy操作以后是否会发生变化,两个人整了半天,最后写代码验证了一下,发现原来NSString操作 ...

  2. Java_基础_内存管理

    把没几多年,完全忘记了把自己学的东西记录下来了,现在也基本不知道怎么去记录会更好了,不过好歹妹是把住了~也要毕业了,继续回来写东东记录自己的学习...... 一个Java程序在运行时的内存分布主要如上 ...

  3. string的内存管理问题

    string的内存管理是通过仅仅增不减的方式进行的,string的clear方法不会真正的释放内存,假设须要真正的释放内存可以连续调用string的这两个方法.resize(0),reserve(). ...

  4. C/C++(C++内存管理,内联函数,类型转换,命名空间,string类)

    ---恢复内容开始--- 内存管理 new/delete C语言中提供了 malloc 和 free 两个系统函数,#include "stdlib.h"库函数,完成对堆内存的申请 ...

  5. Object-c 内存管理

                    内存管理 主要内容 1.内存管理的概念 2.引用计数 3.如何持有对象所有权 4.自动释放池 5.@property的使用 什么是内存管理 内存管理是关于如何管理对象生 ...

  6. Objective-C中的内存管理

    在编程语言中是少不了对内存的管理的,内存对于计算机来说是宝贵的资源,所以对使用不到的资源进行回收是很有必要的.OC中使用引用计数和垃圾回收来管理内存,在OC中为每个对象分配一个引用计数器,当对象刚刚被 ...

  7. C++内存管理的缩影

    都说C++内存管理是个大坑.实际上也确实是这样. C++有析构函数,每当一个对象过期的时候,C++会执行两个动作 1.执行析构函数. 2.将对象和对象的所有数据删除. 很多人就会问了,既然有把对象删除 ...

  8. C++STL内存管理方法(g++版)

    STL作为C++的经典作品,一直备受人们关注.本文主要介绍STL的内存管理策略. 早期的STL内存管理 第一次接触STL源码是看侯捷先生的<STL源码剖析>,此书通俗易懂,剖析透彻,是极佳 ...

  9. Objective C 内存管理[转]

    1  配对原则 alloc – release new – release retain - release copy – release 2  new和alloc-init的区别 (1)区别只在于a ...

随机推荐

  1. Eclipse常见配置及常用插件

    tomcat为能同时运行多个项目而不崩溃,需要配置一下jvm设置 -Xms1024m -Xmx1024m -XX:PermSize=128m -XX:MaxPermSize=512m

  2. 微信小程序未来怎么样?听微盟卫晓祥来说说

    微信小程序宣布公测已经一个多月了,开发者一片火热,未来会怎么样?听微盟卫晓祥来说说.微盟移动营销事业部总经理卫晓祥表示,微信小程序最吸引商户的地方在于:一方面小程序作为一种全新的连接用户与服务的方式, ...

  3. 大数据之Ganglia

    1.什么是ganglia 一个开源集群监视项目:Ganglia可以做系统监控,但是,目前它不支持服务器异常或故障报警功能. 2.Ganglia监控集群架构 Ganglia 集群主要是由gmond.gm ...

  4. 如何编译Apache Hadoop2.6.0源代码

    如何编译Apache Hadoop2.6.0源代码 1.安装CentOS 我使用的是CentOS6.5,下载地址是http://mirror.neu.edu.cn/centos/6.5/isos/x8 ...

  5. View和ViewImage设置图片

    1.view类的设置背景android:background --setBackgroundResource(int) --A drawable to use as the background. s ...

  6. SSH-Struts第三弹:传智播客视频教程第一天上午的笔记

    一. 框架概述1.三大框架 : 是企业主流 JavaEE 开发的一套架构 Struts2 + Spring + Hibernate 2. 什么是框架?为什么要学框架 ?框架 是 实现部分功能的代码 ( ...

  7. nginx 下 bootstrap fa 字体异常问题

    server { listen 8082; # server_name 192.168.16.88; # root /home/ywt/workspace/kuF/web/statics; # aut ...

  8. 将 JAR 转为 EXE – JSMOOTH 的使用教程(第二期)(转载)

    http://www.iteknical.com/convert-jar-to-exe-phase-ii-jsmooth-use-tutorial/

  9. easyui只打开一个tab

    下面是JS代码: var curr = null; //curr为当前tab的标题,在else中赋值 function addtab(href, tabtitle) { if (curr) { $(' ...

  10. 新型序列化类库MessagePack,比JSON更快、更小的格式

    MessagePack is an efficient binary serialization format. It lets you exchange data among multiple la ...