Java机制相关知识点.doc

  1. 1、本文档共5页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Java机制相关知识点

String比较 public static void main(String[] args) { String s1=abc; String s2=abc; String s3=new String(abc); System.out.println(s1==s2); System.out.println(s2==s3); } s1==s2 true s2==s3 false 小伙伴们看了是不是很熟悉?可能有的人一眼就扫出了答案true,false。当然没有扫出正确答案的小伙伴们也不要气馁,下面跟大家分析分析为毛是这么一个答案。 按照==的语法来看, 首先s1、s2、s3是三个不同的对象,常理来说,输出都会是false。然而程序的运行结果确实true、false。第二个输出false可以理解,第一个输出true就又让人费解了。 我们知道一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配,而堆内存中则存放new 出来的对象和数组。然而除此之外还有一块区域叫做常量池。 像我们通常想String s1 = abc;这样申明的字符串对象,其值就是存储在常量池中。当我们创建String s1 = abc这样一个对象之后,abc就存储到了常量池(也可叫做字符串池)中。 当我们创建引用String s2 = abc 的时候,Java底层会优先在常量池中查找是否存在abc,如果存在则让s2指向这个值,不会重新创建,如果常量池中没有则创建并添加的池中。这就是为什么答案是true 和false的原因。 Integer a = 128,b=128; Integer c = 127,d=127; 如果你的回答是false,false,可能你有一定的基础,知道Integer是一个封装类。当然如果你的答案是true,true的话,也在一定的认知范围之内,但是基础知识掌握的不够好。 好了,我们运行main方法,正确答案应该是false,true。前几年这道题出现在很多面试题中,当然你也会说了,我会做项目就ok了,用到查就是了,何必要知道,这我没话说。 其实当我们给一个Integer对象赋一个int值的时候,会调用Integer类的静态方法valueOf, 如果整型字面量的值介于-128到127之间,就不会new一个新的Integer对象,而是直接引用常量池中的Integer对象,所以上面的运行结果是a==b=false,而c==d=true。Integer与int比较 public static void main(String[] args) { Integer a = new Integer(128); int b = 128; Integer c = new Integer(6); Integer d = new Integer(6); } 相信又有不少小伙伴懵比了吧,ture还是false?还是直接公布答案吧,true,false。 c == d=false,我觉得没什么好说的,可能有的小伙伴要问了不是-128-127被缓存起来了么?但是我们这里的Integer是new出来的,并不是用的缓存,所以结果是false。 a == b=true,大家注意一下这里的b是int类型,当int和Integer做==比较的时候,Integer类型会自动拆箱,也就是把Integer转成int类型,所以这里进行比较的是int类型的值,所以结果即为true。 栈与堆都是Java用来在Ram中存放数据的地方。与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆。stack:存放基本类型的变量数据和对象的引用; 存取速度比堆要快存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。如int a = 3; 这里的a是一个指向int类型的引用存在栈中的数据可以共享heap:存放所有new出来的对象和数组 堆的优势是可以动态地分配内存大小Java的垃圾收集器会自动收走这些不再使用的数据缺点是,由于要 在运行时动态分配内存,存取速度较慢。在堆中产生了一个数组或对象后,还可以在栈中定义一个特殊的变量,让栈中这个变量的取值等于数组或对象在堆内存中的首地址,栈中的这个变量就成了数组或对象的引用变量。“china”)创建了几个String Object 答案:2个 解析: 对于通过new产生一个字符串(假设为”china”)时,会先去常量池中查找是否已经有了”china”对象,如果没有则在常量池中创建一个此字符串对象,然后堆中再创建一个常量池中此”china”对象的拷贝对象。 题2:成员变量和局部变量的储存 成员变量:方法外部,类的内部定义的变量; 存储在堆中的对象里面,由垃圾回收器(GC)负责回收 局部变量:方法或语句块内部定义的变量。

文档评论(0)

138****7331 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档