【面试题】最新大数据面试题总结之Java(持续更新)

文章目录

    • -- Java中不可变字符串和常量的区别
    • -- Thread线程中wait方法和sleep方法的区别
    • -- HashMap底层源码,数据结构
    • -- Java自带哪几种线程池?
    • -- HashMap和HashTable区别


– Java中不可变字符串和常量的区别

  • 不可变字符串只是说内存的地址不可变而已,所在地址的内容其实是可以通过反射进行改变的,不能直接叫常量,常量内容是没法改的。

– Thread线程中wait方法和sleep方法的区别

  • 用以下代码举例
public static void main(String[] args) throws Exception {
        Thread t1 = new Thread();
        Thread t2 = new Thread();
        t1.start();
        t2.start();
		t1.sleep(1000);
		t2.wait();
    }
  • 核心区别:IDEA字体

 ①sleep方法是斜体字,表示为静态方法,静态的方法和类相关,和对象无关,即sleep方法和调用该方法的对象t1无关,此时就不可能让t1休眠,只能让当前正在执行的类的线程(main)休眠,类的对象都没有,当然sleep也就无法释放对象锁。

 ②wait方法不是斜体字,表示为成员方法,成员方法只与对象相关,wait方法和对象t2相关,所以能够让t2等待,而且wait释放对象锁,不过得先通过同步关键字拿到对象(锁)。

 ③简述就是sleep方法不能释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法(锁代码块和方法锁)。以上如果想让t1线程休眠需要在run方法里面调用Thread.sleep(time)方法。

  • 其他区别:
  1. wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用(使用范围不同),sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常。
  2. sleep方法属于Thread类中静态方法,表示让一个线程进入睡眠状态,等待一定的时间之后,自动醒来进入到可运行状态,不会马上进入运行状态,因为线程调度机制恢复线程的运行也需要时间,一个线程对象调用了sleep方法之后,并不会释放他所持有的所有对象锁,所以也就不会影响其他进程对象的运行。【面试题】最新大数据面试题总结之Java(持续更新)_第1张图片
  3. wait属于Object的成员方法,一旦一个对象调用了wait方法,必须要采用notify()和notifyAll()方法唤醒该进程;如果线程拥有某个或某些对象的同步锁,那么在调用了wait()后这个线程就会释放它持有的所有同步资源,而不限于调用了wait()方法的对象
  4. wait可以指定时间也可以不指定,指定时间 wait(time) 则在 time时间内有别的线程 notifyAll() 是不会唤醒它的 ,sleep 则必须指定时间。

– HashMap底层源码,数据结构

  • hashMap的底层结构在jdk1.7中由数组+链表实现,在jdk1.8中由数组+链表+红黑树实现,以数组+链表的结构为例。
    【面试题】最新大数据面试题总结之Java(持续更新)_第2张图片
    【面试题】最新大数据面试题总结之Java(持续更新)_第3张图片

  • JDK1.8之前Put方法:
    【面试题】最新大数据面试题总结之Java(持续更新)_第4张图片

  • JDK1.8之后Put方法:
    【面试题】最新大数据面试题总结之Java(持续更新)_第5张图片

– Java自带哪几种线程池?

1)newCachedThreadPool

  • 创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。这种类型的线程池特点是:
  • 工作线程的创建数量几乎没有限制(其实也有限制的,数目为Interger. MAX_VALUE), 这样可灵活的往线程池中添加线程。
  • 如果长时间没有往线程池中提交任务,即如果工作线程空闲了指定的时间(默认为1分钟),则该工作线程将自动终止。终止后,如果你又提交了新的任务,则线程池重新创建一个工作线程。
  • 在使用CachedThreadPool时,一定要注意控制任务的数量,否则,由于大量线程同时运行,很有会造成系统瘫痪。

2)newFixedThreadPool

  • 创建一个指定工作线程数量的线程池。每当提交一个任务就创建一个工作线程,如果工作线程数量达到线程池初始的最大数,则将提交的任务存入到池队列中。FixedThreadPool是一个典型且优秀的线程池,它具有线程池提高程序效率和节省创建线程时所耗的开销的优点。但是,在线程池空闲时,即线程池中没有可运行任务时,它不会释放工作线程,还会占用一定的系统资源。

3)newSingleThreadExecutor

  • 创建一个单线程化的Executor,即只创建唯一的工作者线程来执行任务,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。如果这个线程异常结束,会有另一个取代它,保证顺序执行。单工作线程最大的特点是可保证顺序地执行各个任务,并且在任意给定的时间不会有多个线程是活动的。

4)newScheduleThreadPool

  • 创建一个定长的线程池,而且支持定时的以及周期性的任务执行,支持定时及周期性任务执行。延迟3秒执行。

– HashMap和HashTable区别

1)线程安全性不同

  • HashMap是线程不安全的,HashTable是线程安全的,其中的方法是Synchronize的,在多线程并发的情况下,可以直接使用HashTabl,但是使用HashMap时必须自己增加同步处理。

2)是否提供contains方法

  • HashMap只有containsValue和containsKey方法;HashTable有contains、containsKey和containsValue三个方法,其中contains和containsValue方法功能相同。

3)key和value是否允许null值

  • Hashtable中,key和value都不允许出现null值。HashMap中,null可以作为键,这样的键只有一个;可以有一个或多个键所对应的值为null。

4)数组初始化和扩容机制

  • HashTable在不指定容量的情况下的默认容量为11,而HashMap为16,Hashtable不要求底层数组的容量一定要为2的整数次幂,而HashMap则要求一定为2的整数次幂。
    Hashtable扩容时,将容量变为原来的2倍加1,而HashMap扩容时,将容量变为原来的2倍。

你可能感兴趣的:(大数据面试题,#,Java,java,面试)