在家已经待了一个多星期了,最近学到的东西一直没有梳理,这次变梳理边分享出来,说是分享其实就是搬运一下。
Java 基础知识
基本数据类型
问:7 种基本数据类型:整型、浮点型、布尔型、字符型?
答:四类八种基本类型,int、short、byte、long、float、double 、char、boolean。
问:整型中 byte、short、int、long 的取值范围?
答:byte,-2的7次方(-128)—2的7次方-1(127);short,-2的15次方(-32768)--2的15次方-1(32767);int,-2的31次方—2的31次方-1;long,-2的63次方—2的63次方-1。
问:什么是浮点型?什么是单精度和双精度?为什么不能用浮点型表示金额?
答:单精度浮点型(float )专指占用32位存储空间的单精度(single-precision )值;双精度型,正如它的关键字"double "表示的,占用64位的存储空间。 java中进行金额的计算经常浮点数丢失精度,造成这种问题的原因应该与cpu对浮点数的计算方式有关,有的浮点数转换成为二进制时是一个无穷循环小数,用BigDecimal进行运算。
自动拆装箱
问:什么是自动拆装箱?
答:把Long,Integer,Double,Float 等将基本数据类型的首字母大写的相应的引用类型转化为基本数据类型的动作就叫拆箱,比如将Integer对象转换成int类型值;把byte,int,short, long,double,float,boolean,char 这些Java的基本数据类型在定义数据类型时不声明为相对应的引用类型,在编译器的处理下自动转化为引用类型的动作就叫做装箱。比如将int的变量转换成Integer对象。原始类型 byte、short、char、int、long、float、double 和 boolean 对应的封装类为 Byte、Short、Character、Integer、Long、Float、Double、Boolean。
问:Integer 的缓存机制?
答:在Java 中,== 比较的是对象引用,而 equals 比较的是值。在 Java 5 中,为 Integer 的操作引入了一个新的特性,用来节省内存和提高性能。整型对象在内部实现中通过使用相同的对象引用实现了缓存和重用。上面的规则适用于整数区间 -128 到 +127。这种 Integer 缓存策略仅在自动装箱(autoboxing)的时候有用,使用构造器创建的 Integer 对象不能被缓存。Java 编译器把原始类型自动转换为封装类的过程称为自动装箱(autoboxing),这相当于调用 valueOf 方法。
String
问:字符串的不可变性?
答:对象一旦创建,在整个进程的生命周期中是不可变的,无法对其进行加长、缩短、改变等操作,既然它不会变,所以也就不存在线程同步的问题; 因为字符串具有不可以变性,当我们给一个字符串变量,重新赋值的时候,字符串原来的值还存在于堆中,只是栈中的指向地址改变了。这个时候,有一个问题,如果我们需要对一个字符串进行大量的赋值操作,这样的话内存中就会存在很多无用的垃圾.当程序结束的时候,GC扫描整个内存,如果发现空间没有被指向.就会销毁这个空间。
问:JDK 6 和 JDK 7 中 substring 的原理及区别?replaceFirst、replaceAll、replace 区别?
答:substring(int beginIndex, int endIndex)方法截取字符串并返回其[beginIndex,endIndex-1]范围内的内容。在JDK6中,如果你有一个很长很长的字符串,但是当你使用substring进行切割的时候你只需要很短的一段。这可能导致性能问题,因为你需要的只是一小段字符序列,但是你却引用了整个字符串(因为这个非常长的字符数组一直在被引用,所以无法被回收,就可能导致内存泄露),这个问题在jdk 7中得到解决。在jdk 7 中,substring方法会在堆内存中创建一个新的数组。
问:String 对“+”的重载、字符串拼接的几种方式和区别?
答:String的+操作根本不是重载,他只是JVM做的有个简化操作,实际上还是调用了StringBuilder进行相加。在Java语言中,操作符重载是不被允许的,但是对String对象而言,它是可以直接+将两个String对象的字符串值相加。乍看起来这是对+的重载,但我们可以通过class文件看出,这只是JVM做的语法糖。
问:String.valueOf 和 Integer.toString 的区别?
答:ValueOf()方法比如说 Integer.valueOf() 是把String类型转化为Integer类型,toString()可以把一个引用类型转化为String字符串类型。
问:switch 对 String 的支持?
答:在比较的时候,先是通过hashcode来比较,如果hashcode一样,就再通过equals方法来比较。所以本质上还是没有脱离int比较的原则。综上所述,java的switch对String的支持,实际上是通过编译器做了一次优化。
熟悉 Java 中各种关键字
问:transient、instanceof、final、static、volatile、synchronized、const 原理及用法?
答:transient:当对象被序列化时(写入字节序列到目标文件)时,transient阻止实例中那些用此关键字声明的变量持久化;当对象被反序列化时(从源文件读取字节序列进行重构),这样的实例变量值不会被持久化和恢复。例如,当反序列化对象——数据流(例如,文件)可能不存在时,原因是你的对象中存在类型为java.io.InputStream的变量,序列化时这些变量引用的输入流无法被打开;Instanceof:判断其左边对象是否为其右边类的实例,返回的是boolean类型的数据。用它来判断某个对象是否是某个Class类的实例;final:表明这个类不能被继承;static:static最常用的功能就是修饰类的属性和方法,让他们成为类的成员属性和方法,我们通常将用static修饰的成员称为类成员或者静态成员;volatile:是Java提供的一种轻量级的同步机制,当写一个volatile变量时,JVM会把该线程对应的本地内存中的变量强制刷新到主内存中去,这个写会操作会导致其他线程中的缓存无效,禁止指令重排序优化;synchronized:synchronized关键字可以作为函数的修饰符,也可作为函数内的语句,也就是平时说的同步方法和同步语句块。如果 再细的分类,synchronized可作用于instance变量、object reference(对象引用)、static函数和class literals(类名称字面常量)身上。无论synchronized关键字加在方法上还是对象上,它取得的锁都是对象,而不是把一段代码或函数当作锁――而且同步方法很可能还会被其他线程的对象访问。每个对象只有一个锁(lock)与之相关联。实现同步是要很大的系统开销作为代价的,甚至可能造成死锁,所以尽量避免无谓的同步控制。
集合类
问:常用集合类的使用、ArrayList 和 LinkedList 和 Vector 的区别 、SynchronizedList 和 Vector 的区别、HashMap、HashTable、ConcurrentHashMap 区别?
答:HashMap 和 Hashtable 的 6 个区别:
1、线程安全Hashtable 是线程安全的,HashMap 不是线程安全的。为什么说 HashTable 是线程安全的?看下 Hashtable 的源码,Hashtable 所有的元素操作都是 synchronized 修饰的,而 HashMap 并没有。
2、性能优劣,既然 Hashtable 是线程安全的,每个方法都要阻塞其他线程,所以 Hashtable 性能较差,HashMap 性能较好,使用更广。
3、Hashtable 是不允许键或值为 null 的,HashMap 的键值则都可以为 null。那么问题来了,为什么 Hashtable 是不允许 KEY 和 VALUE 为 null, 而 HashMap 则可以?Hashtable key 为 null 会直接抛出空指针