Java基础篇--复习、面试

一、Java中数据类型:

 Java基础篇--复习、面试

Java基础篇--复习、面试Java基础篇--复习、面试

Java基础篇--复习、面试

二、String, Stringbuffer, StringBuilder 的区别

String 不可变字符串序列,常量 (final修饰,不可被继承),String是常量,当创建之后即不能更改。

StringBuffer 可变字符串序列,变量,效率低,线程安全。

StringBuilder 可变字符串序列,变量,效率高,线程不安全。

使用场景:

(1)如果要操作少量的数据用 String;

(2)多线程操作字符串缓冲区下操作大量数据 StringBuffer;

(3)单线程操作字符串缓冲区下操作大量数据 StringBuilder

三者继承结构:

Java基础篇--复习、面试

三、ArrayList 和 LinkedList 有什么区别

ArrayList底层是一个数组,所以查询速度快,但新增、删除就比较慢了;(查询用下标很快能查询;增、删需要创建新数组然后重新排列速度就慢;)相对所占内存较小;

LinkedList底层是一个链表,所以查询比较慢,但新增、删除就比较快了;(查询需要找到上一个数据指针和下一个数据指针,增、删只要定位到指针,修改指向就行了);LinkedList比ArrayList更占内存,因为LinkedList为每一个节点存储了两个引用,一个指向前一个元素,一个指向下一个元素;

四、Map和HashMap的区别

Map是一个接口interface,而HashMap是Map的一个实现;

扩展:HashMap线程不安全的,HashMap是数组+链表+红黑树(JDK1.8增加了红黑树部分)实现的,采用哈希表来存储的。如果需要满足线程安全,可以用 Collections的synchronizedMap方法使HashMap具有线程安全的能力,或者使用ConcurrentHashMap。Hashtable是遗留类,很多映射的常用功能与HashMap类似,不同的是它承自Dictionary类,并且是线程安全的,任一时间只有一个线程能写Hashtable,并发性不如ConcurrentHashMap。HashMap的迭代器(Iterator)是fail-fast迭代器,而Hashtable的enumerator迭代器不是fail-fast的。LinkedHashMap是HashMap的一个子类,保存了记录的插入顺序,在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的,也可以在构造时带参数,按照访问次序排序。下面是HashMap的put流程图:(仅供参考)-有兴趣可看HashMap的源码;

Java基础篇--复习、面试

五,接口和抽象类的区别

抽象类

抽象类必须用 abstract 修饰,子类必须实现抽象类中的抽象方法,如果有未实现的,那么子类也必须用 abstract 修饰。抽象类默认的权限修饰符为 public,可以定义为 public 或 procted,如果定义为 private,那么子类则无法继承。抽象类不能创建对象

抽象类和普通类的区别

  1. 抽象类必须用public、procted 修饰(如果为private修饰,那么子类则无法继承,也就无法实现其抽象方法)。默认缺省为 public
  2. 抽象类无法创建对象
  3. 如果一个子类继承抽象类,那么必须实现其所有的抽象方法。如果有未实现的抽象方法,那么必须定义为 abstract

接口

接口中的变量隐式的使用 public static final 修饰,并且需要给出初始值。方法隐式的使用 public abstract 修饰(并且只能是 public ,如果是 private,procted,那么就编译报错)。接口中的方法默认不能有具体的实现(JDK1.8开始可以有默认的实现)

接口和抽象类的区别

  1. 抽象类只能继承一次,但是可以实现多个接口
  2. 接口和抽象类必须实现其中所有的方法,抽象类中如果有未实现的抽象方法,那么子类也需要定义为抽象类。抽象类中可以有非抽象的方法
  3. 接口中的变量必须用 public static final 修饰,并且需要给出初始值。所以实现类不能重新定义,也不能改变其值。
  4. 接口中的方法默认是 public abstract,也只能是这个类型。不能是 static,接口中的方法也不允许子类覆写,抽象类中允许有static 的方法