JAVA笔记——道JAVA基本类型内存探究写昵称不如写代码

线索:我想采用实例代码驱动的方式来一步步地分析,这也符合我们探知新事物的过程。

一、基本数据类型的内存分配

代码1:

看到上面的输出结果,如果你还是有些不能理解的,那就耐心地接着看我的分析吧。

分析:

编号1:在java编译时期,当编译到“intp1=1000;”时会在栈中压入1000,其实后面的p2,i1,i2都是指向这个1000,这样可以提高java的性能,所以编号1、编号2、编号3的输出结果都是true.其实char,float,double等基本数据类型都是这样的。

编号2、编号3:同编号1

编号4:这是java中的自动装箱机制,将基本数据类型int自动转为类类型Integer,这是jdk1.5以上才有的功能,jdk1.5以下编译时会报错。自动装箱时java底层会调用Integer.valueOf(inti)方法自动装箱,下面我们来看看Integer.valueOf(inti)的源码吧:

注:分析源码我们知道IntegerCache.high其实就是127,在IntergerCache的静态块中定义的。

源码的意思是当i的值在-128—127之间时会返回IntegerCache.cache[]中的对象,其他的新建一个Integer对象。其实Integer类是这样实现的:考虑到-128—127之间的对象经常使用,就在Integer创建时将值在-128—127之间的对象先创建好,放在池中,以后要使用时,这些对象就不用重新创建了,目的在于提高性能。其实这种机制在Character中也用到了,Character是创建ASCII在0—127之间的对象。补充说明:Integer创建的对象引用在栈中,对象的内容在堆区,栈中的值是堆中对象的地址。Character、Long、Short等包装类都是这样的。所以编号4的输出结果是false,因为值大于127,java新创建了一个对象。

编号5:因为值在-128—127之间,所以两个引用指向的是堆区的同一个对象。

编号6:当使用new创建对象时,都会新创建一个对象,即在栈中创建一个引用,在堆中创建该对象,引用指向对象。

编号7:这种情况有些人可能会不太清楚,其实这是java的自动拆箱机制,当int和Integer发生操作时,Integer类型对象会自动拆箱成int值,这时比较的是两个int值,而我们前面分析了,int值都会指向常量池中的数据,所以,两者指向的是同一块空间。结果编号7输出true

编号8:同编号7,也是Integer的自动拆箱。

编号9:我想,分析了这么多,编号9不用我说,你也应该懂了,呵呵,这里就不赘述了哦~分析了这么多,终于第一块代码分析完了。

二、String类型的内存分配

大家都知道String类型是类类型,不过String类型是一个特殊的类类型,那它特殊在哪呢?代码2:

编号1:String类型是一个很特殊的类型,当我们使用Stringstr=”abc”;这种定义方法时,”abc”会放入常量池中,以后如果再有定义Stringstr2=”abc”时,其实str和str2指向的是常量池中同一个对象。而只有当使用new创建时才会每次都创建一个新的对象。(我觉得这是String类型和其他类类型的特殊之处)

编号2、编号3:编号1已经分析了。

编号4:执行到Stringc=b+"c";这一句时,java底层会先创建一个StringBuilder对象,封装b,接着再加上“c”,最后再创建一个String对象,将StringBuilder中的值赋给该String对象,用c来指向它。.其实此时的c指向的对象已经不是a指向的对象了。

编号5:当用final修饰后,s6就变为了常量,在常量池中创建“12”,当执行到Strings7=s6+"3";时,编译器直接就把s6当成了“12”,s7此时就已是“123”,它指向常量池中的“123”,所以s5和s7指向的是同一个对象,输出为true。

三、StringBuilder,StringBuffer,String的对比

(一)StringString类型的值是不可变的,听到这句话后可能你会有疑问,我们的String对象可以重新赋值呀,这里有两种情况,情况一:Stringstr=”abc”;,情况二:Stringstr=newString(“abc”);采用情况一重新赋值时,java会先看常量池中有没有“abc”,如果有则直接指向它,如果没有,在编译时就创建一个常量放入常量池中;对于情况二:str则重新指向一个先创建的对象,该新对象在堆中。下面提出问题:为什么String是不可变的呢?我们来看看String的源码:

我们看到String类型是用一个用final修饰的char数组来存储字符串的,所以String类型是不可变的,(其实Short,Character,Long等包装类型也是这样实现的),根据上面对String类型的分析,如果要改变String的值,就要重新创建一个对象,这无疑性能会很差。为了优化String,sun公司添加了StringBuffer,在jdk1.5之后又添加了StringBuilder。

(二)下面我们来分析一下StringBufferStringBuffer作为字符串缓冲类,当进行字符串拼接时,不会重新创建一个StringBuffer对象,而是直接在原有值后面添加,因为StringBuffer类继承了AbstractStringBuffer类,分析后者的源码后,我们发现存储字符串的char[]没有被final修饰。至于StringBuffer类是怎样扩充自己的长度的,我们可以参考它的append()方法,这里不再赘述。不过一定要提出的是:StringBuffer是线程安全的,它的方法体是被synchronized修饰了的。

(三)StringBuilder有是怎么样的呢?StringBuilder基本实现了StringBuffer的功能,最大的不同之处在于StringBuilder不是线程安全的。

(四)String、StringBuffer、StringBuilder的性能比较代码三:

实验结果为:

显然,StringBuilder的性能最好,String的性能最差,而且差很多;不过StringBuffer的线程安全性很好,性能也比较接近StringBuilder,所以我推荐的选择使用顺序为:StringBuffer>StringBuilder>String;

四、java传参

下面我们我看一段代码,不过有点长,请大家有点耐心哦~代码四:

输出结果为:

分析:这个例子我举得有点大,不过我觉得如果把我举得这个例子的参数传递完全搞懂了,你对java的参数传递过程就比较了解了。

不过在分析之前,我想给大家java传参的一个思想:java只有值传递,没有引用传递,也没有指针传递。对于基本数据类型,java是直接传值,其实就是将形参指向栈中的那个值;对于类类型(比如String,StringBuffer,自定义类类型等)是传引用(在栈中)的值,也就是堆中对应对象的地址。这个在我认为也是值传递。

下面我们开始分析test()方法1、首先定义了int类型变量,int类型变量传入change()方法是简单的值传递,这个大家都知道,所以就不说了;

2、下面是String类型的变量,大家可能会想,String类型是类类型啊,当调用change方法后test方法中也应该会发生变化呀,呵呵,其实这时你忘了String类型是不可变的,因为它存储数据的char[]是用final修饰过的。当change方法中改变了p2的值后,其实p2指向的已经是另一块内存空间了。

3、下面是StringBuffer类型,之前已说类类型传递变量的地址,所以bs和p3指向的是同一块内存空间,当p3重新赋值时,bs也会跟着变得。

4、下面是自定义的类类型,我不想再用文字述说了,就用一个图来表示吧,我相信你现在可以自己分析了。

五、java对象的克隆机制(以上概念的应用)

概念引入:

我相信大家都听过java中的“克隆”这个名词,在Object类中有一个本地化clone()方法就是用来克隆对象的,其实我们自己也可以用new来克隆对象,但这样的效率会比较低。概念名词:

浅度克隆:要克隆对象的属性如果是类类型变量,只在栈中创建一个该属性的新引用,指向源属性对象;如果是基本数据类型,我相信你懂得。

深度克隆:对于类类型的属性,在栈中和堆中都重新开辟空间,创建一个全新的属性对象。其实Object中的clone()方法就是一种浅度克隆,不过当我们重写该方法时一定要实现Cloneable接口,否则会报异常,代码验证如下:代码五:

这时的运行结果如下,很显然是浅克隆。

当我们把clone()方法中的注释语句“//o.sb=newStringBuffer();”启用后,这就是深度克隆了哦,运行结果如下:

上面实现深度克隆的方法是基于Object的clone()方法的,其实我们也可以采用序列化的方式来实现深度克隆的,这样就不用重写clone()方法了,我们给Point类添加一个deepClone方法,不过一定要让Point类实现Serializeble接口哦~,deepClone方法如下:

呵呵,通过这些实验,我想你对java的克隆机制还是比较了解了,具体的分析我也没有必要再说了。就到此为止吧

THE END
1.相关性研究的研究类型这种方法系比较在不同人群中疾病的发病率或死亡率的差别,了解这些人群中某些因素的出现率并同疾病的发病率或死亡率对比看是否一致,从而为探索病因找到线索。 例如,通过生态比较研究发现:①大肠癌在发达国家比发展中国家更常见。这促使人们考虑饮食习惯和环境污染是否与大肠癌发病有关。②大肠癌的发病率和死亡率的性别https://www.med66.com/new/47a210aa2009/2009127renyej10433.shtml
2.四种类型学校中初中教育质量和优势的比较研究四种类型学校中初中教育质量和优势的比较研究 初中阶段教育作为义务教育的重要组成,具有承上启下的重要作用。目前,我国初中教育实施的现状是与小学或高中一体或独立存在,具体可分为以下四种类型:独立初中 (7~9年级)、完全中学(7~12 年级,初高中一体)、九年一贯制学校(1~9 年级,小学初中一体)、十二年一贯制学校https://www.unjs.com/lunwen/jiaoyu/20160712000000_1312927.html
3.关于版权客体分类方法与类型的比较研究关于版权客体分类方法与类型的比较研究 《中华人民共和国著作权法》(以下简称《著作权法》)已根据2001年10月27日第九届 全国人民代表大会常务委员会第二十四次会议《关于修改<中华人民共和国著作权法>的 决定》修正,而且,中国已成为WTO的正式成员国。考察新修正后的法律,我们发现, 与WTO和WIPO分别于1994年和1996年https://www.fwsir.com/fl/html/fl_20061124181448_5875.html
4.论文理论研究类和实践应用类区别2、应用研究:应用研究在获得知识的过程中具有特定的应用目的。或是发展基础研究成果确定其可能用途,或是为达到具体的、预定的目标确定应采取的新的方法和途径。应用研究虽然也是为了获得科学技术知识。 问:研究生论文类型中的基础研究和应用研究什么区别 答:一、指代不同 https://www.igaichong.com/article/1b51da3b22fba67a6fa2cdee.html
5.深化比较:汉语方言学研究创新的重要途径单点研究是类型比较的基础,类型比较使单点研究深入和准确。汉语方言的类型比较面临两个问题:一是由于单点描写成果少,制约了类型比较的开展。二是由于单点描写欠深入,制约了类型比较的深度和解释力。今后,在重视类型比较的同时,应该鼓励更多地、深入地开展单点的描写性研究。这样,类型比较才能拥有丰富的材料。http://sscp.cssn.cn/xkpd/yyx_20148/201106/t20110602_1119980.html
6.社会比较研究的现状与发展趋势摘要社会比较是人类普遍存在的一种社会现象,在西方关于社会比较的研究已经成为心理学界的一个重要课题。该文从社会比较的概念、类型、动机和策略等几个方面,回顾了国外近50年来研究者关于社会比较的研究脉络;最后,在回顾近几年研究的基础上对社会比较的未来研究趋势进行了展望。 https://www.psychspace.com/psych/viewnews-14668.html
7.日记研究5 在日记中评估人的变化 6 日记研究的类型 7 诱导研究 8 日记研究的比较 日记研究 编辑 日记研究是一种收集定性信息的研究方法,它让参与者在日志、日记或日记中记录有关他们日常生活的条目,了解所研究的活动或经历。这种数据的收集采用了纵向技术,即在一段时间内对参与者进行研究。这种研究工具,虽然不能像真正https://vibaike.com/175009/
8.第一章医学研究类型与统计分析策略医学研究的常见设计类型(研究设计角度,常见于以下三类):实验性研究、观察性研究、文献研究 一、实验性研究 又称:干预性研究 研究者人为施加干预措施,评价干预措施的影响或效果的研究。包括:动物实验研究;人群实验研究 分为:随机对照研究、非随机对照研究 https://www.jianshu.com/p/e3df728f999b
9.研究方法范文8篇(全文)行动研究的类型大体上有两种,一是独立进行的行动研究,二是联合性的行动研究。分为三个层次。这三个层次分别为:单个教师的行动研究;协作性的行动研究(理论工作者与教师合作);学校范围内的联合行动研究。 行动研究的适用范围主要是适用于教育实际问题而不是理论问题的研究,单个教师的行动研究的特点是规模小,研究问题范https://www.99xueshu.com/w/file12jr79tl.html
10.比较文学MOOC中国二、比较文学的研究范围 1.跨国界的文学研究 2.跨学科的比较研究 三、影响研究 1.何谓“影响” 2.影响产生的条件 3.影响研究的范围 四、平行研究 1.平行研究的可行性 2.平行研究的具体方法 3.平行研究的特点和局限 第四讲 流传学 一、流传学的类型 https://www.mooc.cn/course/6556.html
11.大学生学业拖延现状与不同类型拖延群体的比较研究大学生学业拖延现状与不同类型拖延群体的比较研究,主动拖延,被动拖延,学业自我效能,时间管理,自我评价,积极人格,学业拖延指的是学生违背原有的学习意向没有按时完成或者有意地延迟启动、延迟完成学业任务的行为。 本研究采用Chu和Choi对学业拖https://wap.cnki.net/lunwen-1012016159.html
12.质性研究工具本文探讨了定性研究与质性研究、质化研究等概念的区别与联系,指出这些概念在中文文献中使用的混乱状况。文章强调定性研究的复杂性和多样性,介绍了定性研究的基本类型,如个案研究、民族志、扎根理论、行动研究等,并指出这些是定性研究中重要且常见的方法。作者呼吁在理解和应用定性研究时,应明确其具体方法和重要类型,以https://blog.csdn.net/weixin_31608241/article/details/112695966
13.不同部位猪肉肌纤维类型组成与品质特性比较研究摘要:為比较不同部位猪肉肌纤维类型组成与品质特性的差异,选取9 头6 月龄杜长大三元杂交猪背最长肌(Longissimus dorsi)、半膜肌(Semimembranosus)和半腱肌(Semitendinosus)3 个部位猪肉作为研究对象,通过烟酰胺腺嘌呤二核苷酸四唑氧化还原酶(nicotinamide adenine dinucleotide-tetrazolium reductase,NADH-TR)染色法研究不https://www.fx361.com/page/2020/0910/7016449.shtml
14.职业教育类型特征体现在哪里?——基于职普人才培养方案的对比研究根据上述理论分析,本文选取湖南省一所职业院校(M校)和一所普通本科院校(X校)的社会工作专业人才培养方案进行对比研究,以期找到职业教育的类型特征以及与普通教育的本质区别。为了增强对比研究的效度和信度,本文选取了同一区域即湖南省的两所公办院校进行对比,且普通本科院校并未选取“985”“211”等重点院校;人才培养方https://www.hebcpc.cn/gzjy/info/1074/1901.htm
15.这个临床研究类型“贼牛”,且好上手!适合护理营养康复和医学护理科、营养科、康复科和医学教育等领域的人员,在发表医学论文时,可能会因为时间和资源、研究设计的限制,数据收集挑战,专业性质、资源限制以及研究环境等因素,导致缺乏有效的科研产出。 基于这些限制,今天梅斯学术将为大家介绍一个适合上述科室及人员的临床研究类型——Quasi-Experimental Study。 https://m.medsci.cn/article/show_article.do?id=756ee9031307
16.2021年10月自考00401学前比较教育真题与答案自考1.20世纪上半叶是比较教育学科的形成阶段,方法上的特征是 A.口头传递 B.借鉴分析 C.因素分析 D.综合研究 2.对国际学前教育的现状和趋势进行全面、综合的比较研究类型是 A.专题比较研究 B.总体比较研究 C.定性比较研究 D.定量比较研究 3.日本第一部由政府颁布的有关幼儿园的法令是 https://www.educity.cn/zikao/316564.html
17.最新文学类论文研究方法十(模板9篇)正因为如此,他们对宗教比较研究持一种消极否定的态度:宗教的价值属于主观性领域,评判不同的宗教观点是不可能的;因为在宗教的领域,并不存在一种像运行于科学领域的规律那样的强制要求普遍一致的规律。在实证主义哲学的影响下,一些学者坚持认为,宗教比较研究只有在人类学与社会学研究领域才能开花结果,而在哲学与宗教研究http://cooco.net.cn/zuowen/3320753.html
18.不同类型群落物种多样性指数的比较研究.PDF35 No. 5 2015 年5 月 Journal of Central South University of Forestry Technology May 2015 Doi:10.14067/j .cnki.1673-923x.2015.05.015 http : // 不同类型群落物种多样性指数的比较研究 吴 昊 1,2,3 (1. 西北农林科技大学林学院,陕西 杨凌712 100;2. 河南农业大学生命科学学院,河南 郑州450002; https://max.book118.com/html/2017/1018/137390506.shtm