1、HashSet和TreeSet的区别

  • 实现方式

HashSet:HashSet是哈希表实现的。

TreeSet:TreeSet是二差树实现的。

  • 数据是否有序

HashSet:HashSet中的数据是无序的。

TreeSet:Treeset中的数据是自动排好序的。

  • 是否可以放入null值

HashSet:可以放入null,但只能放入一个null。 

TreeSet:不允许放入null值。

2、死锁例子。

public class DeadLock implements Runnable{
        public static Object obj1 = new Object();
        public static Object obj2 = new Object();
        //标志位
        public int flag = 1;

        @Override
        public void run() {
            if(flag==1){
                synchronized (obj1){
                    System.out.println("flag: "+ flag + ", 锁住了资源obj1");
                    try{
                        Thread.sleep(1000);
                    }catch (InterruptedException e){
                        e.printStackTrace();
                    }
                    System.out.println("flag: "+ flag + ", 等待获取资源obj2");
                    synchronized (obj2){
                        System.out.println("flag:" + ", 获得资源obj2");
                    }
                }
            }else if(flag==2){
                synchronized (obj2){
                    System.out.println("flag: "+ flag + ", 锁住了资源obj2");
                    try{
                        Thread.sleep(1000);
                    }catch (InterruptedException e){
                        e.printStackTrace();
                    }
                    System.out.println("flag: "+ flag + ", 等待获取资源obj1");
                    synchronized (obj1){
                        System.out.println("flag:" + ", 获得资源obj1");
                    }
                }
            }
        }
    public static void main(String[] args) {
        DeadLock lock1 = new DeadLock();
        DeadLock lock2 = new DeadLock();
        lock1.flag=1;
        lock2.flag=2;

        new Thread(lock1).start();
        new Thread(lock2).start();
    }
}

3、HashMap和TreeMap的区别

HashMap:数组方式存储key/value,线程非安全,允许null作为key和value,key不可以重复,value允许重复,不保证元素迭代顺序是按照插入时的顺序,key的hash值是先计算key的hashcode值,然后再进行计算,每次容量扩容会重新计算所以key的hash值,会消耗资源,要求key必须重写equals和hashcode方法

TreeMap:基于红黑二叉树的NavigableMap的实现,线程非安全,不允许null,key不可以重复,value允许重复,存入TreeMap的元素应当实现Comparable接口或者实现Comparator接口,会按照排序后的顺序迭代元素,两个相比较的key不得抛出classCastException。主要用于存入元素的时候对元素进行自动排序,迭代输出的时候就按排序顺序输出

4、线程有几种状态?

线程通常都有五种状态,创建、就绪、运行、阻塞和死亡。

5、异常

Exception又包含了运行时异常(RuntimeException, 又叫非检查异常)和非运行时异常(又叫检查异常)

  • Error是程序无法处理了, 如果OutOfMemoryError、StackOverFlowError等等, 这些异常发生时, java虚拟机一般会终止线程。
  • 运行时异常都是RuntimeException类及其子类,如 NullPointerException、IndexOutOfBoundsException、ClassNotFoundException、IllegalArgumentException等, 这些异常是不检查的异常, 是在程序运行的时候可能会发生的, 所以程序可以捕捉, 也可以不捕捉. 这些错误一般是由程序的逻辑错误引起的, 程序应该从逻辑角度去尽量避免。
  • 检查异常是运行时异常以外的异常, 也是Exception及其子类, 这些异常从程序的角度来说是必须经过捕捉检查处理的, 否则不能通过编译. 如IOException、SQLException等。