!! 般的牛客网面经,自己增强下记忆,以后学习过程中自己再补充。
Java面经
Int 和Integer的区别
- Integer 是int的包装类,int是基本的数据类型。
- new Integer 时,会为这个对象分配指针,所以两次new Integer不相等。
- java5 之后引入了自动拆箱、装箱机制。
class AutoUnboxingTest { public static void main(String[] args) { Integer a = new Integer(3); Integer b = 3; // 将3自动装箱成Integer类型 int c = 3; System.out.println(a == b); // false 两个引用没有引用同一对象 System.out.println(a == c); // true a自动拆箱成int类型再和c比较 } }
为什么java泛型要使用引用类型而不是基本数据类型
- Java中所有的引用类型都是继承自Object类型,而基本数据类型不是,在设计泛型的时候,泛型也是继承自Object类型。
- 选择将T作为Ojbect而存在还有一种原因就是Java的兼容性问题,由于Java5之前数组都是以Object声明的,由于数组类型没法强制转换,如果选用Object作为泛型擦除后的类型,就可以避免对集合类库较大的改动,同时也保持了兼容性。但这样也使得java中的泛型不是真正的泛型,而是作为语法糖而存在的
public class Main<T> { Object[] obj = new Object[10]; public T add (T t) { obj[0] = t; return (T)obj[0]; } public static void main(String[] args) { Main<Integer> mai = new Main(); //除了这里需要声明为Integer,其它都工作正常 int i = mai.add(1); System.out.println(i); } }
String 和StringBuffer的区别
- String和StringBuffer,它们可以储存和操作字符串,即包含多个字符的字符数据。
- 这个String类提供了数值不可改变的字符串。而这个StringBuffer类提供的字符串进行修改。当你知道字符数据要改变的时候你就可以使用StringBuffer。典型地,你可以使用StringBuffers来动态构造字符数据。
基本类型
- java 中有8种基本数据类型
- 字符类型:byte、char
- 基本整型:short、int、long
- 浮点型:float、double
- 布尔类型 :boolean
String 是基本类型么
- 不是,String是final类,不可以修改。
- 操作数量较少的字符串用String,不可修改的字符串。
- 在单线程且操作大量字符串用StringBuilder,速度快,但线程不安全,可修改。
- 在多线程且操作大量字符串用StringButter,线程安全,可修改。
- String 和 StringBuffer和StringBuilder区别: String 类不同的是,StringBuffer 和 StringBuilder 类的对象能够被多次的修改,并且不产生新的未使用对象。StringBuffer 和StringBuilder区别是StringBuffer是线程安全的。
Array 和ArrayList的区别
- Array可以包含基本类型和引用类型,ArrayList只可以包含引用类型。
- Array大小是固定的,ArrayList是动态变化的。
- ArrayList 有更多的方法和特性。
- 对于基本类型数据,集合使用自动装箱来减少编码工作量。但是,当处理固定大小的基本数据类型的时候,这种方式相对比较慢。
值传递和引用传递
- 值传递是基本数据类型的,传递的是该变量的一个副本,改变副本不影响变量值,而引用传递是对象传递,会改变其原始对象。
说明符号“==”比较的是什么
- 如果两边为对象,则为内存引用的比较,指向同一个引用对象时,返回True,否则返回false;
- “==”如果两边是基本类型,就是比较数值是否相等
HashCode
- java 中的hashcode是根据一定的规则将与对象相关的信息映射成一个数值,称为散列值。包括HashSet、HashMap、HashTable等,对每一个存储的元素都有唯一对应的块编号,表示存储地址。调用contains方法,定位到元素地址。
float,double 浮点类型的数据为何不精确,银行业务用什么表示。
- float等计算机存储数据时,使用的是二进制数据的存储,只能逼近,无法准确表示,计算机采用科学技术法表示数据。(IEEE 754),使用BigDecimal来做精确运算。