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