Java引用数据类型Q&A
2021-08-25 15:29:37 41 举报
AI智能生成
Java引用数据类型+Q&A总结
作者其他创作
大纲/内容
基础概念
<ul><li>类似C的指针,<font color="#ff0000">引用类型存放的是对象的引用</font>。</li><li>引用类型包括:<font color="#ff0000">类、接口、数组、枚举、注解<br></font></li><li>所有引用类型的<font color="#ff0000">默认值都是null</font>。</li><li>引用变量在声明时被指定为一个特定的类型,一旦声明后,类型就不能被改变</li><li>引用变量可以用来引用任何与之兼容的类型</li></ul>
包装类型
包装类就是把基本数据类型和其辅助方法的封装到类中<br>作用:<font color="#ff0000">基本类型不是类,所以无法获得类的基本特性,无法参与转型、泛型、集合、反射等过程</font>。包装类的出现就是为了弥补这个缺陷。<br><br>自动拆装箱<br>装箱是指把基本类型装入包装类的过程,拆箱是从包装类对象中取出基本类型<br>
常量池
Integer: 通过=进行赋值的,且范围为 -128~127的值会被缓存到常量池中<br>String: 通过=""赋值的,都来自常量池中<br>Boolean:通过=true/false赋值的,都来自常量池中<br>
Q&A总结
<font color="#f57f17">Q: StringBuffer和StringBuilder的区别:</font><br>A: <font color="#ff0000">StringBuffer是线程安全的,但是慢。StringBuilder是线程不安全的,但是快。</font>
Q:<font color="#0000ff">String s = “123”+“456”+“789”;</font><font color="#f57f17">对于这种静态的拼接,用StringBuffer去拼接比用String去拼接要快,对吗?</font><br>A:错,反编译代码后,我们发现代码是<font color="#0000ff">String s = “123456789”;</font><br>因为对于静态字符串的连接操作,<font color="#ff0000">Java在编译时会进行彻底的优化,将多个连接操作的字符串在编译时合成一个单独的长字符串</font>。因此要注意StringBuffer/Builder的适用场合: for循环中大量拼接字符串。如果是静态的编译器就能感知到的拼接,不要盲目地去使用StirngBuffer/Builder<br>PS:<br><ul><li>如果是字符串变量相加,会优化成StringBuilder做append</li><li>如果是常量字符串相加, 则会直接拼接</li></ul>
<font color="#f57f17">Q:下面输出什么结果?为什么?</font><br>String s1 = "Hello";<br>String s2 = "Hello";<br>String s3 = "Hel" + "lo";<br>String s4 = "Hel" + new String("lo");<br>String s5 = new String("Hello");<br>String s6 = s5.intern();<br>String s7 = "H";<br>String s8 = "ello";<br>String s9 = s7 + s8;<br> <br>System.out.println(s1 == s2); // true<br>System.out.println(s1 == s3); // true <font color="#ff0000">--java前端编译优化, 会将常量字符串合并</font><br>System.out.println(s1 == s4); // false <font color="#ff0000">--因此涉及string拼接的,都是和原先常量不等</font><br>System.out.println(s4 == s5); // false<br>System.out.println(s1 == s6); // true <font color="#ff0000">--intern()会从常量池获取</font><br>System.out.println(s1 == s9); // false<br>
<font color="#f57f17">Q: String a = new String(“b”) 会产生几个对象</font><br>A:创建两个对象,<font color="#ff0000">"b"在String pool池中,当创建对象时,堆中会拷贝String池中”b“作为一个对象b1,<br>然后建立一个新对象该对象的引用a指向b1;</font><br>
<font color="#f57f17">Q: String c=“b”; 会产生几个对象</font><br>A:1个对象。 <font color="#ff0000">"b"在String池中,c作为引用指向该对象;</font><br>
<font color="#f57f17">Q:String a=“b”;a=a+“b”;会产生几个对象?</font><br>A:有两个对象,第一a是个对象, 第二a+"b"为一个对象
0 条评论
下一页