每日面试题

18. java 容器都有哪些?
  • Collection
    • List
      • ArrayList
      • LinkedList
      • Vector
    • Queue
      • PriorityQueue
      • LinkedList
    • Set
      • TreeSet
      • HashSet
  • Map
    • TreeMap
    • HashMap
      • LinkedHashMap
19. Collection 和 Collections 有什么区别?

Collection是集合的一个上级接口,Collections是集合类的一个工具类。

20. List、Set、Map 之间的区别是什么?

List:有序、可重复
Set:无序、不重复
Map:键值对形式的集合,key不重复,value可以重复

21. HashMap 和 Hashtable 有什么区别?
  • HashMap线程不安全,HashTable线程安全
  • HashMap的key、value可以为null,HashTable不可以
22. 如何决定使用 HashMap 还是 TreeMap?

TreeMap的Key是有序的,当你需要有序遍历Key值的时候可以使用TreeMap

23. 说一下 HashMap 的实现原理?

HashMap底层是一个链表散列的数据结构,使用一个链表数组存储数据。
通过Key值的HashCode计算数组下标,如果发生了Hash碰撞,那么在对应位置上的元素以链表的形式存放,新加入的放在头部。
在Jdk1.8中,当链表长度超过8以后会转换成红黑树,提升查询效率。

24. 说一下 HashSet 的实现原理?

HashSet底层使用一个HashMap实现。

25. ArrayList 和 LinkedList 的区别是什么?
  • ArrayList支持随机查找,查询效率高于LinkedList
  • LinkedList的新增、删除效率高于ArrayList
27. ArrayList 和 Vector 的区别是什么?
  • Vector线程安全,ArrayList线程不安全
28. Array 和 ArrayList 有何区别?
  • Array可以存放基本数据类型和引用数据类型,ArrayList只能存放引用数据类型
  • Array是指定长度的,ArrayList长度可以自动变化
  • ArrayList功能更丰富
29. 在 Queue 中 poll()和 remove()有什么区别?
  • 当Queue中没有对应元素时,remove会报错
30. 哪些集合类是线程安全的?
  • Vector
  • HashTable

今日知识点总结

JavaBean是指符合如下标准的Java类

  • 类是公共的
  • 有一个无参的公共造器
  • 有属性,且有对应的get、set方法

UML类图

统一建模语言(Unified Modeling Language,UML)是一种为面向对象系统的产品进行说明、可视化和编制文档的一种标准语言,是非专利的第三代建模和规约语言。UML使用面向对象设计的的建模工具,但独立于任何具体程序设计语言。

MVC设计模式

MVC是常用的设计模式之一,将整个程序分为三个层次:视图模型层、控制器层、数据模型层。这种将程序输入输出、数据处理,以及数据的展示分离开来的设计模式使程序结构变得灵活而且清晰,同时也描述了程序各个对象间的通信方式,降低了程序的耦合性。

继承的优点

  • 减少代码的冗余,提高代码的可复用性
  • 便于功能的拓展
  • 为多态的使用,提供了前提

下面的代码运行结果如何,为什么?

Integer i = 128;
Integer j = 128; 
System.out.println(i=j);

false,因为Integer内部有一个cache,保存了-128~127范围的数字。128超出了范围,所以会new新的对象,因此false。

静态变量

  • 静态变量随着类的加载而加载
  • 静态变量的加载要早于对象的创建
  • 由于类只会加载一次,则静态变量在内存中也只存在一份,存在方法区的静态域中

单例模式

单例设计模式,即某个类在整个系统中只能有一个实例对象可被获取和使用的代码模式。以下几种实现方式:

/**
 * @author Xie Chenxi
 * @date 2020-03-15 16:51
 */
public class Singleton {


}

/**
 * 饿汉模式
 * 线程安全、不能延迟加载浪费空间
 */
class EHan {

    private final static EHan INSTANCE = new EHan();

    private EHan() {
    }

    public static EHan getInstance() {
        return INSTANCE;
    }
}

/**
 * 懒汉
 * 延迟加载、线程不安全
 */
class LHan {
    private static LHan instance;

    private LHan() {
    }

    public static LHan getInstance() {
        if (instance == null) {
            instance = new LHan();
        }
        return instance;
    }
}

/**
 * 双检锁,又叫双重校验锁,综合了懒汉式和饿汉式两者的优缺点整合而成。
 * 看上面代码实现中,特点是在synchronized关键字内外都加了一层 if 条件判断,
 * 这样既保证了线程安全,又比直接上锁提高了执行效率,还节省了内存空间。
 */
class DoubleCheck {

    private static DoubleCheck instance;

    private DoubleCheck() {
    }

    public static DoubleCheck getInstance() {
        if (instance == null) {
            synchronized (DoubleCheck.class) {
                if (instance == null) {
                    instance = new DoubleCheck();
                }
            }
        }

        return instance;
    }
}

/**
 * 静态内部类
 * 静态内部类的方式效果类似双检锁,但实现更简单。
 * 但这种方式只适用于静态域的情况,双检锁方式可在实例域需要延迟初始化时使用。
 */
class InnerSingleton {

    private static class Inner {
        private final static InnerSingleton INSTANCE = new InnerSingleton();
    }

    private InnerSingleton() {
    }

    public static InnerSingleton getInstance() {
        return Inner.INSTANCE;
    }
}

面向对象基本原则

  • 单一职责原则 SRP (Single Responsibility Principle)

一个类的功能尽可能单一,不要太臃肿了。

  • 开放封闭原则 OCP (Open-Close Principle)

对扩展开放,对修改关闭。

  • 里式替换原则 LSP (the Liskov Substitution Principle LSP)

任何使用到父类的地方,都可以替换成子类。

  • 依赖倒置原则 DIP (the Dependency Inversion Principle DIP)

类与类之间不应该直接依赖细节,应该依赖抽象。

  • 接口分离原则 ISP (the Interface Segregation Principle ISP)

接口功能应该尽可能单一,不要太臃肿。

  • 迪米特原则 LOD (Law of Demeter)

一个类应该对其它的类尽可能少的了解。