对象引用 String引用 基本类型引用 差别

最近遇到一个线上问题,原因是忽略的引用的一些语法,导致出错,现在记录一下:

@Testpublic void testList(){List<String> list = new ArrayList<String>();list.add("1");list.add("2");list.add("3");List<String> list2 = new ArrayList<String>();list2.add("1");list2.add("2");//我现在想获得一个新list,内容是list中有,但list2中没有的//于是我用了下面的代码实现List<String> list1 = list;list1.removeAll(list2);System.out.println(list);//[3]---看这个,原始的list也变了System.out.println(list1);//[3]System.out.println(list2);//[1, 2]//很明显,这里原始list的结果,并不是我想要的,我并不想让list发生变化//但由于我是直接将list的引用给了list1,其实这个时候list1和list是指向同一个对象的,所以对list1做操作,list也会发生变化,因为这两个压根就是一个东西//做个比喻,list就是一个人,他的名字叫list,他有三颗糖,分别1号,2号,3号//那么同时list2就是另外一个人,他的名字叫list2,他有两颗糖,分别1号,2号//我想要的,是获得list有,list2却没有的糖,我采用了排除法//但我做的操作却是:List<String> list1 = list;//这个相当于给list另外起了个外号,叫list1,但还是同一个人//所以我拿走list1的糖,其实也就是拿走了list的糖,因为就是一个人}

这个问题,对于自定义对象一样,只给引用,再操作那个新的引用,其实操作的都是一个对象,但是,对于String字符串,却不是这样的

 @Testpublic void testString(){String a = "1";String b = a;b += "2";System.out.println(a);//1System.out.println(b);//12//看这个操作,照样是引用,但a却没有因为b的改变}

扩展总结:
基本类型对象存放在栈中,
引用类型对象数据存放在堆中,
String类型数据存在堆中,但可能存两份,看下面代码

        String a = new String("good");String b = "good";String c = new String("good");System.out.println(a == b);System.out.println(a.equals(b));System.out.println(b == c);

第一行:首先在String常量池中查找有没有字符常量“good”.因为没有所以创建“good”对象,当执行new String(“good”)时,则在Java的堆中创建一个”good”对象,而a是该对象的引用,因此共计创建2个对象,都在堆中,一个在常量池内,一个在常量池外,两个good虽然是两个对象,但却占一块内存,都在堆中,只不过是常量池外的good指向常量池中的goog,a引用指的是常量池外的good

第二行:首先在String常量池中查找有没有字符串常量“good”,有则直接将b作为String常量池中“good”的一个引用,当你重新声明一个String型变量为“good”时,将使用串池里原来的那个“good”,而不用重新分配内存,也就是说,str与str1将会指向同一块内存,因此,此时没有创建任何对象。

第三行:依次在String常量池中查找有没有字符串常量“good”,有则不进行再次创建,由于这里用了new关键字(有new就有对象),所以在Java堆中又创建了一个“good”对象(地址与第一句在堆中创建的地址不同),而c则是这个对象的引用,因此执行此句时,创建了1个对象。

下图是a,b,c,good,list,list1,list2的存储位置:
引用图例

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

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

相关文章

Mantle For iOS

Mantle可以很方便的去书写一个模型层的代码。 使用它可以很方便的去反序列化JSON或者序列化为JSON(需要在MTLModel子类中实现<MTLJSONSerializing>协议) 使用一个解释器MTLJSONAdapter去转换模型对象。 NSError *error nil; MyObject *myObject [MTLJSONAdapter modelO…

String的split方法的使用

1.引言 split方法很常用,记得我入职公司的时候,第一道笔试题就是关于字符串的拆分拼装等,这也足以说明,大公司对这些方法的重视程度. 其实我们平时一般用到的都是这些方法最简单的用法,但如果你不了解他的实现原理,碰到某些特殊问题终究是会被卡住的,于是就产生了所谓的bug,而…

ReactiveCocoa入门

概述 为什么要使用RAC&#xff1f;一个怪怪的东西&#xff0c;从Demo看也没有让代码变得更好、更短&#xff0c;相反还造成理解上的困难&#xff0c;真的有必要去学它么&#xff1f;相信这是大多数人在接触RAC时的想法。RAC不是单一功能的模块&#xff0c;它是一个Framework&am…

[前台]---input标签中的hidden,浏览器差异问题

前言: 这是一个比较简单的问题,也有人犯过这样的错误,如果你是一个人在编码,并且没有专门的去测试浏览器差异,这个或许会坑到你 问题描述: 用input标签的时候,需要把这个input隐藏掉,于是先这样做: <input hidden id"xxx" value"xxx"/> 这行代码…

C++和Objective-C混编(官方文档翻译)

苹果的Objective-C编译器允许用户在同一个源文件里自由地混合使用C和Objective-C&#xff0c;混编后的语言叫Objective-C。有了它&#xff0c;你就可以在Objective-C应用程序中使用已有的C类库。 Build Setting中要设定编译文件类型设置&#xff0c;如下图&#xff1a;Objectiv…

SpringMVC获取response的问题

SpringMVC获取response的问题: 关于用以下这种方式获取response的一些问题: ((ServletWebRequest) RequestContextHolder.getRequestAttributes()).getResponse(); 网上对于这种方式获取response的描述很多,我用的是jar包版本是3.2.9.release web.xml中肯定也是加了Request…

BigDecimal的个人总结

前言: 互联网公司,对于BigDecimal的使用,还是较为频繁的,那么就会涉及到关于这个类型的种种问题. 1:为什么使用BigDecimal 首先java八大基本类型真的很基本,4个整型搞不了小数,double和float搞的了小数,但搞不好,关键时刻就调链子,当然这也和他们存储方式有关(二进制无法精确的…

MagicRecord For IOS API深层解析

一、NSManagedObjectContext创建和获取1.默认上下文(每种只存在一个)&#xff08;1&#xff09;MR_rootSavingContext&#xff1a;此方法返回的上下文类型为NSPrivateQueueConcurrencyType(后台线程)&#xff0c;直接关联持久化协调器&#xff0c;对此上下文对象执行保存方法&a…

BeanUtils.copyProperties(对象A,对象B)

对于两个实例的复制,如果属性名字相同,则可以通过这个方法来操作,但是在使用的时候,一定要注意BeanUtils用的是哪个包的,因为常用的两个包,都有这个类和对应的方法,而复制方向却相反,所以一定要注意自动导包时选择的包!!!!!! 1.import org.springframework.beans.BeanUtils 这…

Xcode中的-ObjC和-all_load

有时候使用第三方库的时候&#xff0c;需要在Xcode的Build Settings下Other Linker Flags里面加入-ObjC标志。 之所以使用该标志&#xff0c;和Objective-C的一个重要特性&#xff1a;类别&#xff08;category)有关。根据这里的解释&#xff0c;Unix的标准静态库实现和Object…

[前台]---ajax返回200成功,却进入error函数的解决方法

最近碰到一个问题,就是如题目所说,ajax在调用的时候,明明返回成功了,但js代码却走到了error中,最后发现是我返回的json格式不对,jQuery在1.4后,对ajax返回的json格式有了很强的限制,所以一定要用严格的JSON格式返回. 先上代码: jQuery.ajax({type: "POST",async: tr…

SpringMVC解决静态资源不能访问

解决: 直接在SpringMVC的xml文件中加一行配置: <mvc:default-servlet-handler/> 问题根源: 做项目迁移的时候,原来控制层的框架是Struts2,现在要换成SpringMVC,第一版是尽量少改动的移过去,保证功能都正常,第二版开始优化,于是: 原来项目的访问都是XXX.action,现在想…

CocoaPods版本升级

和往常一样使用CocoaPods管理一个基于FMDB的项目类库 命令行执行 $ pod install [!] The master repo requires CocoaPods 0.32.1 - 失败&#xff0c;提示需要CocoaPods 0.32.1版本 查看CocoaPods版本 $ pod --version 0.29.0 确实需要更新了 命令行更新&#xff08;安装&…

[前台]---js获取input标签中name相同的各个value值

在页面form表单中,经常会有相同name的多个input标签,在提交表单前需要对这些input的value值做校验,就要在js中拿到这些值,下面这个方法,亲测是最实在的: 页面:<input type"hidden" name"myname" value"aa"/><input type"hidden&qu…

Objective-C消息转发

我们要通过一个小例子来简单、通俗的理解一下什么是消息转发以及如何消息转发&#xff0c;希望看完这篇文章时大家会彻底的明白OC的消息。首先&#xff0c;你需要知道这两个概念&#xff1a; OC中调用方法就是向对象发送消息。 比如 &#xff1a; 1[person run];这实际上这是在…

[前台]---js中方法的强制返回和java中方法的强制返回

java写惯了,偶尔写个js,真是各种坑,比如方法中的return的效果就不一样: java中: public static void main(String[] args) {String[] a {"1","2","3"};for (String s : a) {if(s.equals("1")){System.out.println(s);return;//方法中…

Create groups 与 Create folder references的区别

选择了Create groups方式添加了一个文件&#xff0c;我们会发现被添加进来的文件&#xff0c;文件夹是黄色的。选择了 Create folder references方式添加进来的文件的文件夹是蓝色的。那么两种方式有什么区别呢&#xff1f; 1.使用Create groups 为任何新增加的文件夹创建组&a…

[前台]---js重复上传一张图片两次,第二次失败的解决办法和思路

js重复上传一张图片两次,第二次会失败,解决办法就是修改input的value值. 先上代码: <input style"display:none" type"file" id"aaa" onchange"newuploadImageForDetail(event)" accept"image/jpg, image/jpeg, image/gif, …

XMPP协议简介

XMPP是一种基于标准通用标记语言的子集XML的协议&#xff0c;它继承了在XML环境中灵活的发展性。因此&#xff0c;基于XMPP的应用具有超强的可扩展性。经过扩展以后的XMPP可以通过发送扩展的信息来处理用户的需求&#xff0c;以及在XMPP的顶端建立如内容发布系统和基于地址的服…

[前台]---关于input标签的value值

碰到这个情况,先上代码: <input type"hidden" id"input-shoppingListType" value0/> 这样写的话,最终在获取value的值的时候,平时都是0,直到有一次成了’0/’,发现了吗?把后面的斜杠也给拿到了,最终导致报错了 结果: <input type"hidde…