java面试题有哪些?

这种专业问题去看书吧。


上元Java培训:Java精英班企业面试题(九)

1、接口是否可继承接口?抽象类是否可实现(implents)接口?抽象类是否可继承实体类?

接口可以继承接口,而且一个接口可以同时继承多个接口(这点和一个类只能继承一个类不同),抽象类也可以实现接口,抽象类可继承实体类(非final的实体类)

2、Java中的枚举类型是什么?有什么作用?

枚举类型是jdk1.5出现的,是那些由一组固定常量组成的类型,可以理解为一个特殊的类,其中的成员属性就是当前类的一些以publicstaticfinal进行修饰的实例,所以枚举也兼备了普通类的一些特点,例如,构造方法,成员属性,成员方法等定义。可以用来定义一组固定常量的集合。

例如Spring管理事务时用到的@Transactional注解中,其中涉及到事务的隔离级别,事务的传播性等属性值都是利用枚举来表示的一组固定值。

3、Java中实现多态的机制是什么?

方法的重写Overriding和重载Overloading是Java多态性的不同表现。重写Overriding

是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。另外一个父类可以有不同的子类,一个接口可以有不同的实现类,这也是一种多态的表

现,这可以使得同一个类型有不同的表现。

4、一个用throws声明可能抛出的异常的方法。如果有方法调用它,要如何处理?

如果throws声明的是检查异常,那么在调用它的方法中可以用catch捕获,也可以在调用它的方法上加上throws继续向上抛出。否则会有编译错误!

如果throws声明的是非检查异常,那么可以采用上面处理检查异常的方式进行处理,此时就算什么处理都不做,也不会出现编译错误!

以上就是Java面试题,想了解更多关于Java的知识点,欢迎随时来上元IT咨询!!!


在动力节点学了五个多月,最近刚刷完面试题准备着去面试了!!检验的时刻到了~我就把之前老师给我的面试题整理下,还是挺多的,这个学校只教Java就很专业~


公众号:Java高级架构师,回复“面试题”,获取1500份大厂面试真题!


虽然现在大厂内卷现象泛滥,而且996的传统依旧肆虐。但没有哪位程序员能架得住互联网大厂的高薪职位诱惑。特别是我还有一位在阿里工作7年多的老表,在其耳旁风之下,不断将大厂描绘的美丽风景刻画在我脑海中,也让我一直有着想进大厂镀金的梦想。

所以为了完成这次进大厂的梦想,前段时间特意拜托老表爆肝一周之后,才梳理好的这份10W字的“Java高级程序员面试精华题”也帮助我在金三银四的最后时段赶上了跳槽季的末班车,成功入职字节!

虽然金三银四黄金跳槽期虽然已过,如果你现在还想跳槽进入大厂,后面的金九银十也不失为一个好机会。利用这4-5个月的时间里好好储备下技术能力,刷一刷面试题。也为跳槽作一作万全准备。

现在我把这份文档分享出来给每位看到的有缘人,为大家节省一点找资料、翻文献、刷题的时间。

面试文档涵盖:微服务、分布式中间件、并发编程、数据库,Spring/MyBatis/Netty等主流框架,需要的小伙伴转发+关注我后直接私信【666】即可获取资料免费下载方式!

主目录展示:

常用主流框架篇

涵盖Srping、MyBatis、Netty

微服务篇

涵盖SpringBoot、Dubbo、SpringCloud及SpringCloud相关组件原理

并发编程篇

涵盖并发编程所有技术点的面试

分布式中间件合集

涵盖RPC框架、Zookeeper、Redis、Nginx、RabbitMQ、Kafka、MongDB、Mcached。

性能调优合集

涵盖JVM、MySql、Tomcat

需要文档的小伙伴转发+关注我后直接私信【666】即可获取资料免费下载方式!


感谢邀请,对不起,对此领域不是很熟悉,抱歉。我专注于考试中的高考、考研志愿填报,公务员和事业单位考试等内容。


1)什么是线程?

线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。程序员可以通过它进行多处理器编程,你可以使用多线程对运算密集型任务提速。比如,如果一个线程完成一个任务要100毫秒,那么用十个线程完成该任务只需10毫秒。

2)线程和进程有什么区别?

一个进程是一个独立(selfcontained)的运行环境,它可以被看作一个程序或者一个应用。而线程是在进程中执行的一个任务。线程是进程的子集,一个进程可以有很多线程,每条线程并行执行不同的任务。不同的进程使用不同的内存空间,而所有的线程共享一片相同的内存空间。别把它和栈内存搞混,每个线程都拥有单独的栈内存用来存储本地数据。

3)如何在Java中实现线程?

有两种创建线程的方法:一是实现Runnable接口,然后将它传递给Thread的构造函数,创建一个Thread对象;二是直接继承Thread类。

4)用Runnable还是Thread?

这个问题是上题的后续,大家都知道我们可以通过继承Thread类或者调用Runnable接口来实现线程,问题是,那个方法更好呢?什么情况下使用它?这个问题很容易回答,如果你知道Java不支持类的多重继承,但允许你调用多个接口。所以如果你要继承其他类,当然是调用Runnable接口好了。更多详细信息请点击这里。

6)Thread类中的start()和run()方法有什么区别?

start()方法被用来启动新创建的线程,使该被创建的线程状态变为可运行状态。当你调用run()方法的时候,只会是在原来的线程中调用,没有新的线程启动,start()方法才会启动新线程。如果我们调用了Thread的run()方法,它的行为就会和普通的方法一样,直接运行run()方法。为了在新的线程中执行我们的代码,必须使用Thread.start()方法。

7)Java中Runnable和Callable有什么不同?

Runnable和Callable都代表那些要在不同的线程中执行的任务。Runnable从JDK1.0开始就有了,Callable是在JDK1.5增加的。它们的主要区别是Callable的call()方法可以返回值和抛出异常,而Runnable的run()方法没有这些功能。Callable可以返回装载有计算结果的Future对象。

8)Java中CyclicBarrier和CountDownLatch有什么不同?

CyclicBarrier和CountDownLatch都可以用来让一组线程等待其它线程。与CyclicBarrier不同的是,CountdownLatch不能重新使用。

9)Java内存模型是什么?

Java内存模型规定和指引Java程序在不同的内存架构、CPU和操作系统间有确定性地行为。它在多线程的情况下尤其重要。Java内存模型对一个线程所做的变动能被其它线程可见提供了保证,它们之间是先行发生关系。这个关系定义了一些规则让程序员在并发编程时思路更清晰。比如,先行发生关系确保了:

线程内的代码能够按先后顺序执行,这被称为程序次序规则。

对于同一个锁,一个解锁操作一定要发生在时间上后发生的另一个锁定操作之前,也叫做管程锁定规则。

前一个对volatile的写操作在后一个volatile的读操作之前,也叫volatile变量规则。

一个线程内的任何操作必需在这个线程的start()调用之后,也叫作线程启动规则。

一个线程的所有操作都会在线程终止之前,线程终止规则。

一个对象的终结操作必需在这个对象构造完成之后,也叫对象终结规则。

可传递性

强烈建议大家阅读《Java并发编程实践》第十六章来加深对Java内存模型的理解。

10)Java中的volatile变量是什么?

volatile是一个特殊的修饰符,只有成员变量才能使用它。在Java并发程序缺少同步类的情况下,多线程对成员变量的操作对其它线程是透明的。volatile变量可以保证下一个读取操作会在前一个写操作之后发生。线程都会直接从内存中读取该变量并且不缓存它。这就确保了线程读取到的变量是同内存中是一致的。

11)什么是线程安全?Vector是一个线程安全类吗?

如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。一个线程安全的计数器类的同一个实例对象在被多个线程使用的情况下也不会出现计算失误。很显然你可以将集合类分成两组,线程安全和非线程安全的。Vector是用同步方法来实现线程安全的,而和它相似的ArrayList不是线程安全的。

12)Java中什么是竞态条件?

在大多数实际的多线程应用中,两个或两个以上的线程需要共享对同一数据的存取。如果i线程存取相同的对象,并且每一个线程都调用了一个修改该对象状态的方法,将会发生什么呢?可以想象,线程彼此踩了对方的脚。根据线程访问数据的次序,可能会产生讹误的对象。这样的情况通常称为竞争条件。

13)Java中如何停止一个线程?

Java提供了很丰富的API但没有为停止线程提供API。JDK1.0本来有一些像stop(),suspend()和resume()的控制方法,但是由于潜在的死锁威胁。因此在后续的JDK版本中他们被弃用了,之后JavaAPI的设计者就没有提供一个兼容且线程安全的方法来停止一个线程。当run()或者call()方法执行完的时候线程会自动结束,如果要手动结束一个线程,可以用volatile布尔变量来退出run()方法的循环或者是取消任务来中断线程。

14)一个线程运行时发生异常会怎样?

如果异常没有被捕获该线程将会停止执行。Thread.UncaughtExceptionHandler是用于处理未捕获异常造成线程突然中断情况的一个内嵌接口。当一个未捕获异常将造成线程中断的时候JVM会使用Thread.getUncaughtExceptionHandler()来查询线程的UncaughtExceptionHandler并将线程和异常作为参数传递给handler的uncaughtException()方法进行处理。

15)如何在两个线程间共享数据?

你可以通过共享对象来实现这个目的,或者是使用像阻塞队列这样并发的数据结构。这篇教程《Java线程间通信》(涉及到在两个线程间共享对象)用wait和notify方法实现了生产者消费者模型。

16)Java中notify和notifyAll有什么区别?

这又是一个刁钻的问题,因为多线程可以等待单监控锁,JavaAPI的设计人员提供了一些方法当等待条件改变的时候通知它们,但是这些方法没有完全实现。notify()方法不能唤醒某个具体的线程,所以只有一个线程在等待的时候它才有用武之地。而notifyAll()唤醒所有线程并允许他们争夺锁确保了至少有一个线程能继续运行。

17)为什么wait,notify和notifyAll这些方法不在thread类里面?

一个很明显的原因是JAVA提供的锁是对象级的而不是线程级的,每个对象都有锁,通过线程获得。如果线程需要等待某些锁那么调用对象中的wait()方法就有意义了。如果wait()方法定义在Thread类中,线程正在等待的是哪个锁就不明显了。简单的说,由于wait,notify和notifyAll都是锁级别的操作,所以把他们定义在Object类中因为锁属于对象。

18)什么是ThreadLocal变量?

ThreadLocal是Java里一种特殊的变量。每个线程都有一个ThreadLocal就是每个线程都拥有了自己独立的一个变量,竞争条件被彻底消除了。如果为每个线程提供一个自己独有的变量拷贝,将大大提高效率。首先,通过复用减少了代价高昂的对象的创建个数。其次,你在没有使用高代价的同步或者不变性的情况下获得了线程安全。

19)什么是FutureTask?

在Java并发程序中FutureTask表示一个可以取消的异步运算。它有启动和取消运算、查询运算是否完成和取回运算结果等方法。只有当运算完成的时候结果才能取回,如果运算尚未完成get方法将会阻塞。一个FutureTask对象可以对调用了Callable和Runnable的对象进行包装,由于FutureTask也是调用了Runnable接口所以它可以提交给Executor来执行。

20)Java中interrupted和isInterruptedd方法的区别?

interrupted()和isInterrupted()的主要区别是前者会将中断状态清除而后者不会。Java多线程的中断机制是用内部标识来实现的,调用Thread.interrupt()来中断一个线程就会设置中断标识为true。当中断线程调用静态方法Thread.interrupted()来检查中断状态时,中断状态会被清零。而非静态方法isInterrupted()用来查询其它线程的中断状态且不会改变中断状态标识。简单的说就是任何抛出InterruptedException异常的方法都会将中断状态清零。无论如何,一个线程的中断状态有有可能被其它线程调用中断来改变。

21)为什么wait和notify方法要在同步块中调用?

当一个线程需要调用对象的wait()方法的时候,这个线程必须拥有该对象的锁,接着它就会释放这个对象锁并进入等待状态直到其他线程调用这个对象上的notify()方法。同样的,当一个线程需要调用对象的notify()方法时,它会释放这个对象的锁,以便其他在等待的线程就可以得到这个对象锁。由于所有的这些方法都需要线程持有对象的锁,这样就只能通过同步来实现,所以他们只能在同步方法或者同步块中被调用。如果你不这么做,代码会抛出IllegalMonitorStateException异常。

22)为什么你应该在循环中检查等待条件?

处于等待状态的线程可能会收到错误警报和伪唤醒,如果不在循环中检查等待条件,程序就会在没有满足结束条件的情况下退出。因此,当一个等待线程醒来时,不能认为它原来的等待状态仍然是有效的,在notify()方法调用之后和等待线程醒来之前这段时间它可能会改变。这就是在循环中使用wait()方法效果更好的原因,你可以在Eclipse中创建模板调用wait和notify试一试。如果你想了解更多关于这个问题的内容,推荐你阅读《EffectiveJava》这本书中的线程和同步章节。

23)Java中的同步集合与并发集合有什么区别?

同步集合与并发集合都为多线程和并发提供了合适的线程安全的集合,不过并发集合的可扩展性更高。在Java1.5之前程序员们只有同步集合来用且在多线程并发的时候会导致争用,阻碍了系统的扩展性。Java5介绍了并发集合像ConcurrentHashMap,不仅提供线程安全还用锁分离和内部分区等现代技术提高了可扩展性。更多内容详见答案。

24)Java中堆和栈有什么不同?

为什么把这个问题归类在多线程和并发面试题里?因为栈是一块和线程紧密相关的内存区域。每个线程都有自己的栈内存,用于存储本地变量,方法参数和栈调用,一个线程中存储的变量对其它线程是不可见的。而堆是所有线程共享的一片公用内存区域。对象都在堆里创建,为了提升效率线程会从堆中弄一个缓存到自己的栈,如果多个线程使用该变量就可能引发问题,这时volatile变量就可以发挥作用了,它要求线程从主存中读取变量的值。

更多内容详见答案。

25)什么是线程池?为什么要使用它?

创建线程要花费昂贵的资源和时间,如果任务来了才创建线程那么响应时间会变长,而且一个进程能创建的线程数有限。为了避免这些问题,在程序启动的时候就创建若干线程来响应处理,它们被称为线程池,里面的线程叫工作线程。从JDK1.5开始,JavaAPI提供了Executor框架让你可以创建不同的线程池。比如单线程池,每次处理一个任务;数目固定的线程池或者是缓存线程池(一个适合很多生存期短的任务的程序的可扩展线程池)。

26)如何写代码来解决生产者消费者问题?

在现实中你解决的许多线程问题都属于生产者消费者模型,就是一个线程生产任务供其它线程进行消费,你必须知道怎么进行线程间通信来解决这个问题。比较低级的办法是用wait和notify来解决这个问题,比较赞的办法是用Saphore或者BlockingQueue来实现生产者消费者模型。

27)如何避免死锁?

Java多线程中的死锁

死锁是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。这是一个严重的问题,因为死锁会让你的程序挂起无法完成任务,死锁的发生必须满足以下四个条件:

互斥条件:一个资源每次只能被一个进程使用。

请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。

不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。

循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。

避免死锁最简单的方法就是阻止循环等待条件,将系统中所有的资源设置标志位、排序,规定所有的进程申请资源必须以一定的顺序(升序或降序)做操作来避免死锁。

28)Java中活锁和死锁有什么区别?

这是上题的扩展,活锁和死锁类似,不同之处在于处于活锁的线程或进程的状态是不断改变的,活锁可以认为是一种特殊的饥饿。一个现实的活锁例子是两个人在狭小的走廊碰到,两个人都试着避让对方好让彼此通过,但是因为避让的方向都一样导致最后谁都不能通过走廊。简单的说就是,活锁和死锁的主要区别是前者进程的状态可以改变但是却不能继续执行。

29)怎么检测一个线程是否拥有锁?

在java.lang.Thread中有一个方法叫holdsLock(),它返回true如果当且仅当当前线程拥有某个具体对象的锁。

30)你如何在Java中获取线程堆栈?

对于不同的操作系统,有多种方法来获得Java进程的线程堆栈。当你获取线程堆栈时,JVM会把所有线程的状态存到日志文件或者输出到控制台。在Windows你可以使用Ctrl+Break组合键来获取线程堆栈,Linux下用kill-3命令。你也可以用jstack这个工具来获取,它对线程id进行操作,你可以用jps这个工具找到id。

31)JVM中哪个参数是用来控制线程的栈堆栈小的

这个问题很简单,-Xss参数用来控制线程的堆栈大小。你可以查看JVM配置列表来了解这个参数的更多信息。

32)Java中synchronized和ReentrantLock有什么不同?

Java在过去很长一段时间只能通过synchronized关键字来实现互斥,它有一些缺点。比如你不能扩展锁之外的方法或者块边界,尝试获取锁时不能中途取消等。Java5通过Lock接口提供了更复杂的控制来解决这些问题。ReentrantLock类实现了Lock,它拥有与synchronized相同的并发性和内存语义且它还具有可扩展性。

33)有三个线程T1,T2,T3,怎么确保它们按顺序执行(确保main()方法所在的线程是Java程序最后结束的线程)?

在多线程中有多种方法让线程按特定顺序执行,你可以用线程类的join()方法在一个线程中启动另一个线程,另外一个线程完成该线程继续执行。为了确保三个线程的顺序你应该先启动最后一个(T3调用T2,T2调用T1),这样T1就会先完成而T3最后完成。

34)Thread类中的yield方法有什么作用?

yield方法可以暂停当前正在执行的线程对象,让其它有相同优先级的线程执行。它是一个静态方法而且只保证当前线程放弃CPU占用而不能保证使其它线程一定能占用CPU,执行yield()的线程有可能在进入到暂停状态后马上又被执行。点击这里查看更多yield方法的相关内容。

35)Java中ConcurrentHashMap的并发度是什么?

ConcurrentHashMap把实际map划分成若干部分来实现它的可扩展性和线程安全。这种划分是使用并发度获得的,它是ConcurrentHashMap类构造函数的一个可选参数,默认值为16,这样在多线程情况下就能避免争用。

36)Java中Saphore是什么?

Java中的Saphore是一种新的同步类,它是一个计数信号。从概念上讲,从概念上讲,信号量维护了一个许可集合。如有必要,在许可可用前会阻塞每一个acquire(),然后再获取该许可。每个release()添加一个许可,从而可能释放一个正在阻塞的获取者。但是,不使用实际的许可对象,Saphore只对可用许可的号码进行计数,并采取相应的行动。信号量常常用于多线程的代码中,比如数据库连接池。更多详细信息请点击这里。

37)如果你提交任务时,线程池队列已满。会时发会生什么?

这个问题问得很狡猾,许多程序员会认为该任务会阻塞直到线程池队列有空位。事实上如果一个任务不能被调度执行那么ThreadPoolExecutor’ssubmit()方法将会抛出一个RejectedExecutionException异常。

38)Java线程池中submit()和execute()方法有什么区别?

两个方法都可以向线程池提交任务,execute()方法的返回类型是void,它定义在Executor接口中,而submit()方法可以返回持有计算结果的Future对象,它定义在ExecutorService接口中,它扩展了Executor接口,其它线程池类像ThreadPoolExecutor和ScheduledThreadPoolExecutor都有这些方法。更多详细信息请点击这里。

39)什么是阻塞式方法?

阻塞式方法是指程序会一直等待该方法完成期间不做其他事情,ServerSocket的accept()方法就是一直等待客户端连接。这里的阻塞是指调用结果返回之前,当前线程会被挂起,直到得到结果之后才会返回。此外,还有异步和非阻塞式方法在任务完成前就返回。更多详细信息请点击这里。

40)你对线程优先级的理解是什么?

每一个线程都是有优先级的,一般来说,高优先级的线程在运行时会具有优先权,但这依赖于线程调度的实现,这个实现是和操作系统相关的(OSdependent)。我们可以定义线程的优先级,但是这并不能保证高优先级的线程会在低优先级的线程前执行。线程优先级是一个int变量(从1-10),1代表最低优先级,10代表最高优先级。

41)什么是线程调度器(ThreadScheduler)和时间分片(TimeSlicing)?

线程调度器是一个操作系统服务,它负责为Runnable状态的线程分配CPU时间。一旦我们创建一个线程并启动它,它的执行便依赖于线程调度器的实现。时间分片是指将可用的CPU时间分配给可用的Runnable线程的过程。分配CPU时间可以基于线程优先级或者线程等待的时间。线程调度并不受到Java虚拟机控制,所以由应用程序来控制它是更好的选择(也就是说不要让你的程序依赖于线程的优先级)。

42)在多线程中,什么是上下文切换(context-switching)?

上下文切换是存储和恢复CPU状态的过程,它使得线程执行能够从中断点恢复执行。上下文切换是多任务操作系统和多线程环境的基本特征。

43)如何在Java中创建Immutable对象?

Immutable对象可以在没有同步的情况下共享,降低了对该对象进行并发访问时的同步化开销。要创建不可变类,要实现下面几个步骤:通过构造方法初始化所有成员、对变量不要提供setter方法、将所有的成员声明为私有的,这样就不允许直接访问这些成员、在getter方法中,不要直接返回对象本身,而是克隆对象,并返回对象的拷贝。

44)Java中的ReadWriteLock是什么?

一般而言,读写锁是用来提升并发程序性能的锁分离技术的成果。Java中的ReadWriteLock是Java5中新增的一个接口,一个ReadWriteLock维护一对关联的锁,一个用于只读操作一个用于写。在没有写线程的情况下一个读锁可能会同时被多个读线程持有。写锁是独占的,你可以使用JDK中的ReentrantReadWriteLock来实现这个规则,它最多支持65535个写锁和65535个读锁。

45)多线程中的忙循环是什么?

忙循环就是程序员用循环让一个线程等待,不像传统方法wait(),sleep()或yield()它们都放弃了CPU控制,而忙循环不会放弃CPU,它就是在运行一个空循环。这么做的目的是为了保留CPU缓存,在多核系统中,一个等待线程醒来的时候可能会在另一个内核运行,这样会重建缓存。为了避免重建缓存和减少等待重建的时间就可以使用它了。

46)volatile变量和atomic变量有什么不同?

这是个有趣的问题。首先,volatile变量和atomic变量看起来很像,但功能却不一样。Volatile变量可以确保先行关系,即写操作会发生在后续的读操作之前,但它并不能保证原子性。例如用volatile修饰count变量那么count++操作就不是原子性的。而AtomicInteger类提供的atomic方法可以让这种操作具有原子性如getAndIncrent()方法会原子性的进行增量操作把当前值加一,其它数据类型和引用变量也可以进行相似操作。

47)如果同步块内的线程抛出异常会发生什么?

这个问题坑了很多Java程序员,若你能想到锁是否释放这条线索来回答还有点希望答对。无论你的同步块是正常还是异常退出的,里面的线程都会释放锁,所以对比锁接口我们更喜欢同步块,因为它不用花费精力去释放锁,该功能可以在finallyblock里释放锁实现。

48)单例模式的双检锁是什么?

这个问题在Java面试中经常被问到,但是面试官对回答此问题的满意度仅为50%。一半的人写不出双检锁还有一半的人说不出它的隐患和Java1.5是如何对它修正的。它其实是一个用来创建线程安全的单例的老方法,当单例实例第一次被创建时它试图用单个锁进行性能优化,但是由于太过于复杂在JDK1.4中它是失败的。

49)如何在Java中创建线程安全的Singleton?

这是上面那个问题的后续,如果你不喜欢双检锁而面试官问了创建Singleton类的替代方法,你可以利用JVM的类加载和静态变量初始化特征来创建Singleton实例,或者是利用枚举类型来创建Singleton。

50)写出3条你遵循的多线程最佳实践

以下三条最佳实践大多数Java程序员都应该遵循:

给你的线程起个有意义的名字。

这样可以方便找bug或追踪。OrderProcessor,QuoteProcessororTradeProcessor这种名字比Thread-1.Thread-2andThread-3好多了,给线程起一个和它要完成的任务相关的名字,所有的主要框架甚至JDK都遵循这个最佳实践。

避免锁定和缩小同步的范围

锁花费的代价高昂且上下文切换更耗费时间空间,试试最低限度的使用同步和锁,缩小临界区。因此相对于同步方法我更喜欢同步块,它给我拥有对锁的绝对控制权。

多用同步类少用wait和notify

首先,CountDownLatch,Saphore,CyclicBarrier和Exchanger这些同步类简化了编码操作,而用wait和notify很难实现对复杂控制流的控制。其次,这些类是由最好的企业编写和维护在后续的JDK中它们还会不断优化和完善,使用这些更高等级的同步工具你的程序可以不费吹灰之力获得优化。

多用并发集合少用同步集合

这是另外一个容易遵循且受益巨大的最佳实践,并发集合比同步集合的可扩展性更好,所以在并发编程时使用并发集合效果更好。如果下一次你需要用到map,你应该首先想到用ConcurrentHashMap。

51)如何强制启动一个线程?

这个问题就像是如何强制进行Java垃圾回收,目前还没有觉得方法,虽然你可以使用Syst.gc()来进行垃圾回收,但是不保证能成功。在Java里面没有办法强制启动一个线程,它是被线程调度器控制着且Java没有公布相关的API。

52)Java中的forkjoin框架是什么?

forkjoin框架是JDK7中出现的一款高效的工具,Java开发人员可以通过它充分利用现代服务器上的多处理器。它是专门为了那些可以递归划分成许多子模块设计的,目的是将所有可用的处理能力用来提升程序的性能。forkjoin框架一个巨大的优势是它使用了工作窃取算法,可以完成更多任务的工作线程可以从其它线程中窃取任务来执行。

53)Java多线程中调用wait()和sleep()方法有什么不同?

Java程序中wait和sleep都会造成某种形式的暂停,它们可以满足不同的需要。wait()方法用于线程间通信,如果等待条件为真且其它线程被唤醒时它会释放锁,而sleep()方法仅仅释放CPU资源或者让当前线程停止执行一段时间,但不会释放锁。需要注意的是,sleep()并不会让线程终止,一旦从休眠中唤醒线程,线程的状态将会被改变为Runnable,并且根据线程调度,它将得到执行。

54)什么是ThreadGroup?为什么不建议使用它?

ThreadGroup是一个类,它的目的是提供关于线程组的信息。

ThreadGroupAPI比较薄弱,它并没有比Thread提供了更多的功能。它有两个主要的功能:一是获取线程组中处于活跃状态线程的列表;二是设置为线程设置未捕获异常处理器(ncaughtexceptionhandler)。但在Java1.5中Thread类也添加了setUncaughtExceptionHandler(UncaughtExceptionHandlereh)方法,所以ThreadGroup是已经过时的,不建议继续使用。

55)什么是Java线程转储(ThreadDump),如何得到它?

线程转储是一个JVM活动线程的列表,它对于分析系统瓶颈和死锁非常有用。有很多方法可以获取线程转储——使用Profiler,Kill-3命令,jstack工具等等。我们更喜欢jstack工具,因为它容易使用并且是JDK自带的。由于它是一个基于终端的工具,所以我们可以编写一些脚本去定时的产生线程转储以待分析。

56)什么是JavaTimer类?如何创建一个有特定时间间隔的任务?

java.util.Timer是一个工具类,可以用于安排一个线程在未来的某个特定时间执行。Timer类可以用安排一次性任务或者周期任务。

java.util.TimerTask是一个实现了Runnable接口的抽象类,我们需要去继承这个类来创建我们自己的定时任务并使用Timer去安排它的执行。

57)什么是原子操作?在JavaConcurrencyAPI中有哪些原子类(atomicclasses)?

原子操作是指一个不受其他操作影响的操作任务单元。原子操作是在多线程环境下避免数据不一致必须的手段。

int++并不是一个原子操作,所以当一个线程读取它的值并加1时,另外一个线程有可能会读到之前的值,这就会引发错误。

在java.util.concurrent.atomic包中添加原子变量类之后,这种情况才发生了改变。所有原子变量类都公开比较并设置原语(与比较并交换类似),这些原语都是使用平台上可用的最快本机结构(比较并交换、加载链接/条件存储,最坏的情况下是旋转锁)来实现的。java.util.concurrent.atomic包中提供了原子变量的9种风格(AtomicInteger;AtomicLong;AtomicReference;AtomicBoolean;原子整型;长型;引用;及原子标记引用和戳记引用类的数组形式,其原子地更新一对值)。

58)JavaConcurrencyAPI中的Lock接口(Lockinterface)是什么?对比同步它有什么优势?

Lock接口比同步方法和同步块提供了更具扩展性的锁操作。他们允许更灵活的结构,可以具有完全不同的性质,并且可以支持多个相关类的条件对象。

它的优势有:

可以使锁更公平

可以使线程在等待锁的时候响应中断

可以让线程尝试获取锁,并在无法获取锁的时候立即返回或者等待一段时间

可以在不同的范围,以不同的顺序获取和释放锁

59)什么是Executor框架?

Executor框架同java.util.concurrent.Executor接口在Java5中被引入。Executor框架是一个根据一组执行策略调用,调度,执行和控制的异步任务的框架。

无限制的创建线程会引起应用程序内存溢出。所以创建一个线程池是个更好的的解决方案,因为可以限制线程的数量并且可以回收再利用这些线程。利用Executor框架可以非常方便的创建一个线程池。

60)Executors类是什么?

Executors为Executor,ExecutorService,ScheduledExecutorService,ThreadFactory和Callable类提供了一些工具方法。

Executors可以用于方便的创建线程池。

61)什么是阻塞队列?如何使用阻塞队列来实现生产者-消费者模型?

java.util.concurrent.BlockingQueue的特性是:当队列是空的时,从队列中获取或删除元素的操作将会被阻塞,或者当队列是满时,往队列里添加元素的操作会被阻塞。

阻塞队列不接受空值,当你尝试向队列中添加空值的时候,它会抛出NullPointerException。

阻塞队列的实现都是线程安全的,所有的查询方法都是原子的并且使用了内部锁或者其他形式的并发控制。

BlockingQueue接口是javacollections框架的一部分,它主要用于实现生产者-消费者问题。

62)什么是Callable和Future?

Java5在concurrency包中引入了java.util.concurrent.Callable接口,它和Runnable接口很相似,但它可以返回一个对象或者抛出一个异常。

Callable接口使用泛型去定义它的返回类型。Executors类提供了一些有用的方法去在线程池中执行Callable内的任务。由于Callable任务是并行的,我们必须等待它返回的结果。java.util.concurrent.Future对象为我们解决了这个问题。在线程池提交Callable任务后返回了一个Future对象,使用它我们可以知道Callable任务的状态和得到Callable返回的执行结果。Future提供了get()方法让我们可以等待Callable结束并获取它的执行结果。

63)什么是FutureTask?

FutureTask包装器是一种非常便利的机制,可将Callable转换成Future和Runnable,它同时实现两者的接口。

FutureTask类是Future的一个实现,并实现了Runnable,所以可通过Excutor(线程池)来执行。也可传递给Thread对象执行。如果在主线程中需要执行比较耗时的操作时,但又不想阻塞主线程时,可以把这些作业交给Future对象在后台完成,当主线程将来需要时,就可以通过Future对象获得后台作业的计算结果或者执行状态。

64)什么是并发容器的实现?

Java集合类都是快速失败的,这就意味着当集合被改变且一个线程在使用迭代器遍历集合的时候,迭代器的next()方法将抛出ConcurrentModificationException异常。

并发容器:并发容器是针对多个线程并发访问设计的,在jdk5.0引入了concurrent包,其中提供了很多并发容器,如ConcurrentHashMap,CopyOnWriteArrayList等。并发容器使用了与同步容器完全不同的加锁策略来提供更高的并发性和伸缩性,例如在ConcurrentHashMap中采用了一种粒度更细的加锁机制,可以称为分段锁,在这种锁机制下,允许任意数量的读线程并发地访问map,并且执行读操作的线程和写操作的线程也可以并发的访问map,同时允许一定数量的写操作线程并发地修改map,所以它可以在并发环境下实现更高的吞吐量。

65)用户线程和守护线程有什么区别?

当我们在Java程序中创建一个线程,它就被称为用户线程。一个守护线程是在后台执行并且不会阻止JVM终止的线程。当没有用户线程在运行的时候,JVM关闭程序并且退出。一个守护线程创建的子线程依然是守护线程。

66)有哪些不同的线程生命周期?

当我们在Java程序中新建一个线程时,它的状态是New。当我们调用线程的start()方法时,状态被改变为Runnable。线程调度器会为Runnable线程池中的线程分配CPU时间并且讲它们的状态改变为Running。其他的线程状态还有Waiting,Blocked和Dead。

67)线程之间是如何通信的?

当线程间是可以共享资源时,线程间通信是协调它们的重要的手段。Object类中wait()-notify()-notifyAll()方法可以用于线程间通信关于资源的锁的状态。

68)为什么Thread类的sleep()和yield()方法是静态的?

Thread类的sleep()和yield()方法将在当前正在执行的线程上运行。所以在其他处于等待状态的线程上调用这些方法是没有意义的。这就是为什么这些方法是静态的。它们可以在当前正在执行的线程中工作,并避免程序员错误的认为可以在其他非运行线程调用这些方法。

69)如何确保线程安全?

在Java中可以有很多方法来保证线程安全——同步,使用原子类(atomicconcurrentclasses),实现并发锁,使用volatile关键字,使用不变类和线程安全类。

70)同步方法和同步块,哪个是更好的选择?

同步块是更好的选择,因为它不会锁住整个对象(当然你也可以让它锁住整个对象)。同步方法会锁住整个对象,哪怕这个类中有多个不相关联的同步块,这通常会导致他们停止执行并需要等待获得这个对象上的锁。

71)如何创建守护线程?

使用Thread类的setDaon(true)方法可以将线程设置为守护线程,需要注意的是,需要在调用start()方法前调用这个方法,否则会抛出IllegalThreadStateException异常。

72)线程调度策略?

(1)抢占式调度策略

Java运行时系统的线程调度算法是抢占式的(preptive)。Java运行时系统支持一种简单的固定优先级的调度算法。如果一个优先级比其他任何处于可运行状态的线程都高的线程进入就绪状态,那么运行时系统就会选择该线程运行。新的优先级较高的线程抢占(prept)了其他线程。但是Java运行时系统并不抢占同优先级的线程。换句话说,Java运行时系统不是分时的(time-slice)。然而,基于JavaThread类的实现系统可能是支持分时的,因此编写代码时不要依赖分时。当系统中的处于就绪状态的线程都具有相同优先级时,线程调度程序采用一种简单的、非抢占式的轮转的调度顺序。

(2)时间片轮转调度策略

有些系统的线程调度采用时间片轮转(round-robin)调度策略。这种调度策略是从所有处于就绪状态的线程中选择优先级最高的线程分配一定的CPU时间运行。该时间过后再选择其他线程运行。只有当线程运行结束、放弃(yield)CPU或由于某种原因进入阻塞状态,低优先级的线程才有机会执行。如果有两个优先级相同的线程都在等待CPU,则调度程序以轮转的方式选择运行的线程。

73)在线程中你怎么处理不可捕捉异常?

Thread.UncaughtExceptionHandler是javaSE5中的新接口,它允许我们在每一个Thread对象上添加一个异常处理器


我会定时更新一些Java题库,现在好多做大的都商业化了,而且网上的面试题库有些太久了,不适合,我自己平时上下班地铁上会写一些面试题,纯粹也是为了让自己总结一下,顺便分享给大家,你可以关注看看。


作为一家有着12年教学经验且只专心教Java的培训机构,自然有很多高质量的面试题:

Java常见面试题及答案(131~140企业真题)

131、j2ee中的应用服务器有哪些?(ACD)

A.Weblogic

B.Tomcat

C.JBoss

D.WebSphere

E.IIS

132、EJB程序与普通的java程序区别有哪些?

EJB是sun的服务器端组件模型,最大的用处是部署分布式应用程序当然,还有许多方式可以实现分布式应用,类似微软的.net技术。

凭借java跨平台的优势,用EJB技术部署的分布式系统可以不限于特定的平台。EJB(EnterpriseJavaBean)是J2EE的一部分,定义了一个用于开发基于组件的企业多重应用程序的标准。其特点包括网络服务支持和核心开发工具(SDK)。

在J2EE里,EnterpriseJavaBeans(EJB)称为Java企业Bean,是Java的核心代码,分别是会话Bean(SessionBean),实体Bean(EntityBean)和消息驱动Bean(MessageDrivenBean)。

简单来讲:比如做一个工程就和盖房子,如果,你会java,那么你就拥有了基本的技能,一步一步累砖,总能把房子盖好但是EJB就是一个框架,盖房子的时候,先有这个框架,然后你根据这个框架去累砖,房子就会盖的又快又好。java是基础,EJB是在java上发展出来的模型,框架。

133、请简述什么是集群?

服务器集群就是指将很多服务器集中起来一起进行同一种服务,在客户端看来就象是只有一个服务器。集群可以利用多个计算机进行并行计算从而获得很高的计算速度,也可以用多个计算机做备份,从而使得任何一个机器坏了整个系统还是能正常运行。一旦在服务器上安装并运行了群集服务,该服务器即可加入群集。群集化操作可以减少单点故障数量,并且实现了群集化资源的高可用性。

134、字符串中有重复的内容去重例如:abbccccaaddaggb--&;abvadagb

publicclassTest

}

}

Syst.out.println(去重后的数据为&;&;&;+list.toString());

}

}

135、利用java面向对象的思路设计正方形、长方形、圆的计算面积的类圆:

classMianJi

voidzhengFangXing(floatbianChang)

voidchangFangXing(floatchang,floatkuan)

publicstaticvoidmain(String[]arg)

}

136、任何&;=6的偶数都可以分解为两个质数之和,从键盘输入一个偶数,输出其分解的质数

publicclassTestpublicstaticintinPut()returnnum;}publicstaticbooleanisPrim(intnum)}returntrue;}publicstaticvoidoutPut(intnum)}}}

137、什么叫对象?什么叫类?什么是面向对象(OOP)?

类的概念:类是具有相同属性和行为的一组对象的集合。它为属于该类的所有对象提供了统一的抽象描述,其内部包括属性和行为两个主要部分。在面向对象的编程语言中,类是一个独立的程序单位,它应该有一个类名并包括属性说明和服务说明两个主要部分。

对象的概念:对象是系统中用来描述客观事物的一个实体,它是构成系统的一个基本单位。一个对象由一组属性和对这组属性进行操作的一组服务组成。从更抽象的角度来说,对象是问题域或实现域中某些事物的一个抽象,它反映该事物在系统中需要保存的信息和发挥的作用;它是一组属性和有权对这些属性进行操作的一组服务的封装体。客观世界是由对象和对象之间的联系组成的。

类与对象的关系就如模具和铸件的关系,类的实例化结果就是对象,而对一类对象的抽象就是类。类描述了一组有相同特性(属性)和相同行为(方法)的对象。

上面大概就是它们的定义吧,也许你是刚接触面象对象的朋友,不要被概念的东西搞晕了,给你举个列子吧,如果你去中关村想买几台组装的PC机,到了那里你第一步要干什么,是不是装机的工程师和你坐在一起,按你提供的信息和你一起完成一个装机的配置单呀,这个配置单就可以想像成是类,它就是一张纸,但是它上面记录了你要买的PC机的信息,如果用这个配置单买10台机器,那么这10台机子,都是按这个配置单组成的,所以说这10台机子是一个类型的,也可以说是一类的。那么什么是对象呢,类的实例化结果就是对象,用这个配置单配置出来(实例化出来)的机子就是对象,是我们可以操作的实体,10台机子,10个对象。每台机子都是独立的,只能说明他们是同一类的,对其中一个机(对象)做任何动作都不会影响其它9台机器,但是我对类修改,也就是在这个配置单上加一个或少一个配件,那么装出来的9个机子都改变了,这是类和对象的关系(类的实例化结果就是对象)

138、JAVA中使用final修饰符,对程序有哪些影响?

●修饰类

当用final修饰一个类时,表明这个类不能被继承。也就是说,如果一个类你永远不会让他被继承,就可以用final进行修饰。final类中的成员变量可以根据需要设为final,但是要注意final类中的所有成员方法都会被隐式地指定为final方法。在使用final修饰类的时候,要注意谨慎选择,除非这个类真的在以后不会用来继承或者出于安全的考虑,尽量不要将类设计为final类。

●修饰方法

被final修饰的方法将不能被子类覆盖,主要用于:

把方法锁定,以防任何继承类修改它的含义。

在早期的Java实现版本中,会将final方法转为内嵌调用,所以效率能够提升。

●修饰变量

对于一个final变量,如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改;如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象。当用final作用于类的成员变量时,成员变量(注意是类的成员变量,局部变量只需要保证在使用之前被初始化赋值即可)必须在定义时或者构造器中进行初始化赋值,而且final变量一旦被初始化赋值之后,就不能再被赋值了。

139、写出5个你在JAVA开发中常用的包含(全名),并简述其作用。

●java.lang.*

提供利用Java编程语言进行程序设计的基础类。最重要的类是Object(它是类层次结构的根)和Class(它的实例表示正在运行的应用程序中的类)。

●java.util.*

包含集合框架、遗留的Collection类、事件模型、日期和时间设施、国际化和各种实用工具类(字符串标记生成器、随机数生成器和位数组、日期Date类、堆栈Stack类、向量Vector类等)。集合类、时间处理模式、日期时间工具等各类常用工具包。

●java.io.*

Java的核心库java.io提供了全面的IO接口。包括:文件读写、标准设备输出等。Java中IO是以流为基础进行输入输出的,所有数据被串行化写入输出流,或者从输入流读入。

●java.net.*

并非所有系统都支持IPv6协议,而当Java网络连接堆栈尝试检测它并在可用时透明地使用它时,还可以利用系统属性禁用它。在IPv6不可用或被显式禁用的情况下,Inet6Address对大多数网络连接操作都不再是有效参数。虽然可以保证在查找主机名时java.net.InetAddress.getByName之类的方法不返回Inet6Address,但仍然可能通过传递字面值来创建此类对象。在此情况下,大多数方法在使用Inet6Address调用时都将抛出异常。

●java.sql.*

提供使用JavaTM编程语言访问并处理存储在数据源(通常是一个关系数据库)中的数据的API。此API包括一个框架,凭借此框架可以动态地安装不同驱动程序来访问不同数据源。

140、方法重载(overload)需要满足什么条件,方法覆盖/方法重写(override)需要满足什么条件?

重载需要满足的条件:在同一类中定义的方法,方法名必须相同,参数一定不同。

发生覆盖的条件:“三同一不低”,子类和父类的方法名称,参数列表,返回类型必须完全相同,而且子类方法的访问修饰符的权限不能比父类低。子类方法不能抛出比父类方法更多的异常。即子类方法所抛出的异常必须和父类方法所抛出的异常一致,或者是其子类,或者什么也不抛出;被覆盖的方法不能是final类型的。因为final修饰的方法是无法覆盖的。被覆盖的方法不能为private。否则在其子类中只是新定义了一个方法,并没有对其进行覆盖。被覆盖的方法不能为static。所以如果父类中的方法为静态的,而子类中的方法不是静态的,但是两个方法除了这一点外其他都满足覆盖条件,那么会发生编译错误。反之亦然。即使父类和子类中的方法都是静态的,并且满足覆盖条件,但是仍然不会发生覆盖,因为静态方法是在编译的时候把静态方法和类的引用类型进行匹配。

重写规则:重写方法不能比被重写方法限制有更严格的访问级别。(但是可以更广泛,比如父类方法是包访问权限,子类的重写方法是public访问权限)。比如:Object类有个toString()方法,开始重写这个方法的时候我们总容易忘记public修饰符,编译器当然不会放过任何教训我们的机会。出错的原因就是:没有加任何访问修饰符的方法具有包访问权限,包访问权限比public当然要严格了,所以编译器会报错的。参数列表必须与被重写方法相同。重写有个孪生的弟弟叫重载,也就是后面要出场的。如果子类方法的参数与父类对应的方法不同,那么就是你认错人了,那是重载,不是重写。返回类型必须与被重写方法的返回类型相同。

父类方法A:voideat()子类方法B:inteat()两者虽然参数相同,可是返回类型不同,所以不是重写。

父类方法A:inteat()子类方法B:longeat()返回类型虽然兼容父类,但是不同就是不同,所以不是重写。


谢邀。一般关于面试的java框架都是根据你简历中之前项目用到的框架来问。题主没有问到具体的框架,我就谈谈目前公司招聘要求最多,也是公司用的最多的三个框架SSM。

关于Spring:

1.谈谈你对SpringIOC和DI的理解,它们有什么区别?

2.Spring配置bean实例化有哪些方式?

3.请介绍一下Spring框架中Bean的生命周期和作用域

4.Bean注入属性有哪几种方式?

5.什么是AOP,AOP的作用是什么?

6.Spring如何处理线程并发问题?

7.介绍一下Spring的事物管理

关于SpringMVC:

1.什么是SpringMVC?简单介绍下你对SpringMVC的理解?

2.说说SpringMVC的流程?

3.SpringMVC有什么优点?

4.SpringMVC怎么样设定重定向和转发的?

5.如何解决POST请求中文乱码问题,GET的又如何处理呢?

6.SpringMVC的异常处理?

7.SpringMvc的核心入口类是什么?

8.SpringMvc的控制器是不是单例模式,如果是,有什么问题,怎么解决?

9.@RequestMapping注解用在类上面有什么作用?

10.如果前台有很多个参数传入,并且这些参数都是一个对象的,那么怎么样快速得到这个对象?

11.SpringMvc如何处理视图?

关于Mybatis:

1.#和$的区别是什么?

2.当实体类中的属性名和表中的字段名不一样,怎么办?

3.聊聊你对Mybatis的了解和认识?

4.Mybatis工作原理

5.Mapper.xml映射文件中有哪些常用标签?

6.Mybatis是如何进行分页的?分页插件的原理是什么?

7.Mybatis动态sql是做什么的?都有哪些动态sql?简述一下动态sql的执行原理?

8.Mybatis是如何将sql执行结果封装为目标对象并返回的?都有哪些映射形式?

以上题目是我分享的一点点建议,希望能对你有所帮助。有兴趣还可以关注我,定期分享技术干货,在程序员进阶的路上一起学习成长。


SpringMVC

什么是SpringMVC?简单介绍下你对springMVC的理解?

SpringMVC的流程?

Springmvc的优点

SpringMVC和struts2的区别有哪些?

如何解决POST请求中文乱码问题,GET的又如何处理呢?

Spring

AOP(面向切面编程)的原理

AOP的使用场景

IOC(控制反转)的原理

Spring框架中的单例bean是线程安全的吗?

常用的注解

用到的设计模式

Spring的优点(解耦、很多主流框架的集成低侵入式设计,代码的污染极低等等)

SpringBean的作用域

事务机制

Spring的核心类,及作用如BeanFactory、ApplicationContext、BeanWrapper

Spring支持的ORM?

BeanFactory接口和ApplicationContext接口有什么区别?

依赖注入的方式有几种:接口注入、Setter注入、构造方法注入

Mybatis

什么是mybatis?

MyBatis与Hibernate有哪些不同?

Mybait的优缺点

常见的标签

分页及常用的分页插件

#和$的区别是什么?

一对一、一对多的关联查询?

Mybatis的一级、二级缓存:

Mybatis比IBatis比较大的几个改进是什么?

IBatis和MyBatis在核心处理类分别叫什么?

IBatis和MyBatis在细节上的不同有哪些?

为什么说Mybatis是半自动ORM映射工具?它与全自动的区别在哪里?

MyBatis与Hibernate有哪些不同?

Hibernate

Hibernate工作原理

Hibernate是如何延迟加载(懒加载)?

缓存机制(一级缓存、二级缓存)

Hibernate的查询方式有几种Hibernate中save、persist和saveOrUpdate这三个方法的不同之处?

get()与load()的区别

Hibernate中的SessionFactory有什么作用?SessionFactory是线程安全的吗?

SpringBoot

常用的starter有哪些

SpringBoot的配置文件有哪几种格式?它们有什么区别?

SpringBoot的核心注解是哪个?常用的注解(如@EnableEurekaClient

@EnableFeignClients@FeignClient@EnableTransactionManagent

@RestController@Configuration@Order@ControllerAdvice等)

SpringBoot需要独立的容器运行吗?(可以不需要,内置了Tomcat/Jetty等容器。)

运行SpringBoot有哪几种方式?

SpringBoot与SpringCloud的关系

SpringCloud的各类组件(Feign、Eureka、Hystrix等)的理解及使用

Nginx

Nginx作用

常用命令

负载均衡的几种常用方式?

session不同步怎么办

前端服务器集群后做负载均衡和动静分离

其他

Thymeleaf、frearker等模板引擎

NoSQL:Redis、Mcache和MongoDB等的区别、使用

xml解析(DOM解析、SAX解析、JDOM解析、DOM4J解析)

POI实现MicrosoftOffice格式档案读和写的功能

多线程、线程池的原理及实现

设计模式

Kafka、MQ等消息机制

Sql优化

jvm原理

常用搜索引擎Elasticsearch等

扎实的java基础

程序猿,他们想的是什么?他们想的永远都是技术,他们崇尚的也永远都是技术。


1.不可变对象

指对象一旦被创建状态不能再改变。任何修改都会创建一个新的对象,如String、Integer及其它包装类。

2.能否创建一个包含可变对象的不可变对象?

可以。不要共享可变对象的引用就可以了,如果需要变化就返回原对象的一个拷贝。最常见的例子是对象中包含一个日期对象的引用.

3.java创建对象的方式

采用new

通过反射

采用clone

通过序列化机制

前2者都需要显式地调用构造方法.造成耦合性最高的恰好是第一种,因此你发现无论什么框架,只要涉及到解耦必先减少new的使用.

4.switch中能否使用string做参数

在idk1.7之前,switch只能支持byte,short,char,int或者其对应的封装类以及Enum类型。从idk1.7之后switch开始支持String.

5.Object中有哪些公共方法?

equals()

clone()

getClass()

notify(),notifyAll(),wait()

6.object中定义了哪些方法?

clone(),equals(),hashCode(),toString(),notify(),notifyAll(),wait(),finalize(),getClass()

7.HashMap和HashTable的区别

HashTable是线程安全的HashMap不是

HashMap中允许存在null键和null值,HashTable中不允许

8.HashMap的实现原理

HashMap的底层实现是“基于拉链法的散列表”。

9.String是最基本的数据类型吗?

不是。Java中的基本数据类型只有8个:byte、short、int、long、float、double、char、boolean;除了基本类型(primitivetype)和枚举类型(enumerationtype),剩下的都是引用类型(referencetype)。

10.floatf=3.4;是否正确?

不正确。3.4是双精度数,将双精度型(double)赋值给浮点型(float)属于下转型(down-casting,也称为窄化)会造成精度损失,因此需要强制类型转换floatf=(float)3.4;或者写成floatf=3.4F;。

11.Java有没有goto?

goto是Java中的保留字,在目前版本的Java中没有使用。《TheJavaProgrammingLanguage》附录中有goto和const,但这两个是目前无法使用的关键字,因此有些地方将其称之为保留字,其实保留字这个词应该有更广泛的意义,因为熟悉C语言的程序员都知道,在系统类库中使用过的有特殊意义的单词或单词的组合都被视为保留字。

12.http1.0,http1.1,http2.0区别

1.0相比1.1可以一次传输多个文件,各类浏览器大概都支持3~5个请求同时发送。

http2.0主要是二进制的格式替代了原来的文本,增加了多路复用和首部压缩解决了headoflineblocking,另外还有serverpushing等新特性。

协议的东西还是建议看一看官网的说明。

13.Get/Post对缓存的影响

此题其实是问浏览器缓存对于HTTPMethod中Get和Post的请求是否支持,答案是不支持PostMethod。Get可以被浏览器缓存。

14.多态的好处

允许不同类对象对同一消息做出响应,主要优点:

可替换性:多态对已存在代码具有可替换性;

可扩充性:增加新的子类不影响已经存在的类结构;

接口性:多态是超累通过方法签名,想子类提供一个公共接口,由子类来完善或者重写它来实现的;

灵活性;

简化性。

15.代码中如何实现多态

接口实现

继承父类重写方法

同一类中进行方法重载

16.虚拟机是如何实现多态的

动态绑定技术(dynamicbinding),执行期间判断所引用对象的实际类型,根据实际类型调用对应的方法.

17.接口的意义

接口的意义用三个词就可以概括:规范,扩展,回调.

18.抽象类的意义

为其他子类提供一个公共的类型

封装子类中重复定义的内容

定义抽象方法,子类虽然有不同的实现,但是定义时一致的

19.父类的静态方法能否被子类重写

不能。子类继承父类后,有相同的静态方法和非静态,这是非静态方法覆盖父类中的方法,父类的该静态方法被隐藏,另外子类可集成父类的静态与非静态方法,至于方法重载我觉得它其中一要素就是在同一类中,不能说父类中的什么方法与子类里的什么方法是方法重载的体现。

以上19道java经典面试题。

最后

为帮助那些往想互联网方向转行想学习,却因为时间不够,资源不足而放弃的人。我搜集整理了一套完整的IT学习资料,包括运营技巧、SEO优化等,比自己在网上零散收集的结构性和连贯性更强,只为帮助那些想学习的人!需要的同学可私信!私信!回复“资料”


我也是一直做java开发很多年啦,经历过的面试很多了,大公司小公司都待过,给你一些建议吧。

java面试题面还是很广的,下面给你分类整理下来的。

1、java基础知识。比如面向对象的特征、多态、访问修饰符范围、static和final关键字、抽象类与接口、深拷贝与浅拷贝、序列化与反序列化、几种数据结构、拆箱与装箱

2、java集合相关的。比如集合框架理解、list、set、hashmap底层实现以及区别?hashmap底层原理,put和get方法怎么实现的?hashmap与hashTable区别?concurrentHashMap底层实现?

3、java异常处理。异常分类?编译时异常与运行时异常区别?举例子有哪些运行时异常?

4、jvm内存模型。以及GC垃圾回收机智和算法。

5、spring相关。解释IOC和AOP,以及他们的原理。bean生命周期

6、mysql。索引是什么?索引分类?索引优化?

7、mybaits相关。动态标签,字符串替换,防注入。

8、dubbo。dubbo服务注册与发现。服务负载均衡算法,dubbo配置与使用。

9、多线程。synchronized用法与底层原理,与lock的区别?线程池有哪些?线程池有哪些参数?线程池优化?

10、redis。redis数据类型有哪些,每个类型的使用场景?redis为什么这么快?redis怎么保证高可用?redis怎么保证与数据库数据一致?

11、消息队列。activeMQ、rabbitMQ、rocketMQ、kafka,都可以了解下,以及怎么保证高可用和处理高并发。

12、排序算法与数据结构。冒泡排序、快速排序、选择排序、插入排序等等

大概就有这么个方面的,好好准备还是有很多机会的。

我主要做java开发的,大家有什么其他问题可以关注我给我私信,或者继续在评论区和我沟通,我有java高级分布式高并发消息队列面试视频可以分享,大家一起进步

互联网高级java高并发分布式消息队列面试视频在蜻蜓FM,搜索“浅戏互联网”,喜欢的朋友可以关注一下,谢谢。


谢邀回答!!!

我认为,Java面试试题众多,重在对基础理论知识和实际操作的考核,给你分享一些面试题目(由于篇幅有限,答案省略),主要有:

1.什么是SpringMVC框架的控制器?

2.SpringMvc的控制器是不是单例模式,如果是,有什么问题,怎么解决?

3.结合项目谈谈你对MVC的理解?

4.什么是SpringMVC?SpringMVC的工作流程是什么?

5.SpringMVC的优点是什么?

6.SpringMVC与Struts2的区别?

7.Spring框架分为哪七大模块,各模块的主要功能作用是什么?

8.Spring框架中的三大核心思想是什么?

9.AOP的概念以及使用AOP机制有什么好处?

10.Java编程中实现AOP有几种方式?

11.jsp静态包含和动态包含的区别?

12.jsp有哪些内置对象?作用分别是什么?

13.Tomcat有哪几种Connector运行模式?

14.你所知道的集合类都有哪些?主要方法?

15.说出ArrayList、Vector、LinkedList的存储性能和特性?

16.Collection和Collections的区别?

17.HashMap和Hashtable的区别?

18.Arraylist与Vector区别?

19.Set里的元素是不能重复的,那么用什么方法来区分重复与否呢?

20.介绍JAVA中的CollectionFrameWork?如何写自己的数据结构?

21.EJB与JAVABEAN的区别是什么?

22.请你介绍EJB的基本架构?等等。

以上题目是我分享的一点点建议,希望能对你有所帮助和启发,也希望与你相互学习、共同进步!!!


2021大厂java面试题库:可能会有些多,建议你都自己整理答案,然后去面试,提取去高频的再好好记记,我觉得能很快找到工作的。

Java基础面试题库

说下面向对象四大特性

Java语言有些特点

什么是Java程序的主类?应用程序和小程序的主类有何不同?

访问修饰符public,private,protected,以及不写(默认)时的区别?

floatf=3.4;是否正确?

Java有没有goto?

&和&&的区别?

Math.round(11.5)等于多少?Math.round(-11.5)等于多少?

用最有效率的方法计算2乘以8?

什么是Java注释

Java有哪些数据类型

final有什么用?

finalfinallyfinalize的区别

Stringstr=i和Stringstr=newString(1)一样吗?

Java中操作字符串都有哪些类?它们之间有什么区别?

Java中为什么要用clone?

深克隆和浅克隆?

new一个对象的过程和clone一个对象的区别?

Java中实现多态的机制是什么?

谈谈你对多态的理解?

构造器(constructor)是否可被重写(override)?

两个对象值相同(x.equals(y)==true),但却可有不同的hashcode,这句话对不对?

String类的常用方法有哪些?

char型变量中能否能不能存储一个中文汉字,为什么?

this关键字的用法

super关键字的用法

this与super的区别

static存在的主要意义

static的独特之处

static应用场景

static注意事项

break,continue,return的区别及作用

在Java中定义一个不做事且没有参数的构造方法的作用

构造方法有哪些特性?

静态变量和实例变量区别

静态方法和实例方法有何不同?

什么是方法的返回值?返回值的作用是什么?

什么是内部类?

内部类的分类有哪些

Java中异常分为哪些种类?

hashCode与equals(重要)

hashCode()介绍

为什么要有hashCode

抽象类和接口(Java7)的区别

Java8的接口新增了哪些特性?

重写和重载的区别

ArrayList和LinkedList有什么区别?

HashMap是怎么实现的?

HashMap在Java7和Java8中的实现有什么不同?

HashMap有时候会死循环,你知道是什么原因吗?

ConcurrentHashMap是怎么实现的?

静态代理和动态代理的区别

JDK动态代理和CGLIB动态代理的区别

Java多线程面试题库

说说synchronized的实现原理

ReentrantLock与synchronized的区别

ReentrantLock实现原理

Java原子类AtomicInteger实现原理

Java线程池实现原理

ThreadLocal实现原理

InheritableThreadLocal原理知道吗?

说一下synchronized锁升级过程

了解过什么是“伪共享”吗?

“伪共享”出现的原因是什么?

如何避免“伪共享”?

Java里的线程有哪些状态?

什么是悲观锁?什么是乐观锁?

怎么停止一个运行中的线程?

说一下你对volatile的理解?

并发编程三要素?

线程池的优点?

CyclicBarrier和CountDownLatch的区别

什么是CAS?

CAS的问题

什么是AQS?

AQS支持几种同步方式?

什么是自旋锁?

什么是多线程的上下文切换?

什么是线程和进程?

程序计数器为什么是私有的?

虚拟机栈和本地方法栈为什么是私有的?

并发与并行的区别?

什么是线程死锁?如何避免死锁?

sleep()方法和wait()方法的区别和共同点?

为什么我们调用start()方法时会执行run()方法,为什么我们不能直接调用run()方法?

什么是线程安全问题?如何解决?

什么是活锁?

什么是线程的饥饿问题?如何解决?

什么是线程的阻塞问题?如何解决?

synchronized关键字和volatile关键字的区别

说一说几种常见的线程池及适用场景?

线程池都有哪几种工作队列?

什么是线程安全?

Java中如何获取到线程dump文件

Java中用到的线程调度算法是什么?

Thread.sleep(0)的作用是什么?

单例模式的线程安全性

Saphore有什么作用?

Hashtable的size()方法中明明只有一条语句returncount,为什么还要做同步?

同步方法和同步块,哪个是更好的选择?

高并发、任务执行时间短的业务怎样使用线程池?并发不高、任务执行时间长的业务怎样使用线程池?并发高、业务执行时间长的业务怎样使用线程池?

Java虚拟机面试题库

说一下JVM的内存结构?

栈帧里面包含哪些东西?

程序计数器有什么作用?

字符串常量存放在哪个区域?

你熟悉哪些垃圾收集算法?

Java里有哪些引用类型?

JVM怎么判断一个对象是不是要回收?

GCRoots有哪些?

你知道哪些GC类型?

对象都是优先分配在年轻代上的吗?

你了解过哪些垃圾收集器?

说说CMS垃圾收集器的工作原理

说说G1垃圾收集器的工作原理

说说ZGC垃圾收集器的工作原理

ZGC收集器中的染色指针有什么用?

说说类加载的过程

说下有哪些类加载器?

什么是双亲委派机制?

双亲委派机制可以被违背吗?请举例说明。

Tomcat是怎么打破双亲委派机制的呢?

Java对象的布局了解过吗?

什么情况下会发生栈内存溢出?

JVM新生代中为什么要分为Eden和Survivor?

JVM中一次完整的GC流程是怎样的,对象如何晋升到老年代?

什么是指令重排序?

什么是内存屏障?

什么是happen-before原则?

说说你知道的几种主要的JVM参数

怎么打出线程栈信息?

为什么需要双亲委派模式?

怎么打破双亲委派模型?

说一下堆和栈的区别

Java8为什么要将永久代(PermGen)替换为元空间(MetaSpace)呢?

说一下Java对象的创建过程

对象的访问定位有哪几种方式?

说一下堆内存中对象的分配的基本策略

MinorGc和FullGC有什么不同呢?

Java会存在内存泄漏吗?请简单描述。

如何判断一个类是无用的类?

介绍一下类文件结构吧!

说一下JVM调优的工具?

JVM调优命令有哪些?

JRE、JDK、JVM及JIT之间有什么不同?

程序计数器为什么是私有的?

如何判断一个常量是废弃常量?

JavaIO面试题库

Java中有几种类型的流?

什么是java序列化?

如何实现java序列化?

字节流和字符流的区别?

PrintStream、BufferedWriter、PrintWriter的比较?

什么是节点流,什么是处理流,它们各有什么用处,处理流的创建有什么特征?

流一般需要不需要关闭,如果关闭的话在用什么方法,一般要在那个代码块里面关闭比较好,处理流是怎么关闭的,如果有多个流互相调用传入是怎么关闭的?

什么是BIO

什么是NIO

什么是AIO

同步与异步

阻塞与非阻塞

同步、异步、阻塞、非堵塞

通道是个什么意思?

缓冲区是什么意思?

IO多路复用的底层原理

MySQL面试题库

什么是索引?

索引是个什么样的数据结构呢?

Hash索引和B+树索引有什么区别或者说优劣呢?

在建立索引的时候,都有哪些需要考虑的因素呢?

了解过哪些存储引擎?各有什么优缺点?

说一下什么是事务的ACID属性吧

事务的隔离级别了解过吗?

说说InnoDB的索引原理

说说InnoDB的MVCC机制

有了解过“回表”的概念吗?什么情况下会出现“回表”?

MySQL索引的类型

有做过MySQL的索引优化吗?

什么是聚簇索引?

InnoDB有聚簇索引吗?MyIsam呢?

MyIsam的数据是怎么存储的?

InnoDB的数据是怎么存储的?

InnoDB主键索引跟非主键索引在数据存储上的差异

InnoDB删除某条记录后,内部会怎么处理?

InnoDB如果没有设置主键的话,它内部会怎么处理?

为什么InnoDB一定会生成主键?

MySQL分库分表了解过吗?

MySQL的redo日志和undo日志分别有什么用?

MySQL的redo日志的刷盘时机

MySQL有哪些锁?以及各种锁的作用?

MySQL中varchar与char的区别以及varchar(50)中的50代表的涵义

MySQL有哪些日志,分别是什么用处?

在哪些情况下会发生针对该列创建了索引但是在查询的时候并没有使用呢?

为什么要尽量设定一个主键?

主键使用自增ID还是UUID?

字段为什么要求定义为notnull?

如果要存储用户的密码散列,应该使用什么字段进行存储?

varchar(10)和int(10)代表什么含义?

MySQL的binlog有有几种录入格式?分别有什么区别?

超大分页怎么处理?

关心过业务系统里面的sql耗时吗?统计过慢查询吗?对慢查询都怎么优化过?

什么是存储过程?有哪些优缺点?

说一说三个范式

什么情况下应不建或少建索引

什么是表分区?

表分区与分表的区别

表分区有什么好处?

MVVC了解过吗

在MVCC并发控制中,读操作可以分成哪几类?

行级锁定的优点

行级锁定的缺点

MySQL优化

key和index的区别

delete、truncate、drop区别

MySQL主从复制原理流程

自增主键最大ID记录,MyISAM和InnoDB分别是如何存储的

Mysql如何优化DISTINCT?

解释MySQL外连接、内连接与自连接的区别

Redis面试题库

什么是Redis?简述它的优缺点?

Redis相比mcached有哪些优势?

Redis有哪些数据结构?

Redis主要消耗什么物理资源?

Redis的全称是什么?

一个字符串类型的值能存储最大容量是多少?

Redis为什么那么快?

Redis如何实现分布式锁?

Redis是单线程还是多线程?

Redis官方为什么不提供Windows版本?

为什么Redis需要把所有数据放到内存中?

Redis如何设置密码及验证密码?

Redis集群如何选择数据库?

缓存失效?缓存穿透?缓存雪崩?缓存并发?

Redis中的热key怎么处理?

Redis中的大key怎么处理?

使用Redis统计网站的UV,应该怎么做?

Redis事务机制了解过吗?

Rediskey的淘汰策略有哪些?

Redis在什么情况下会触发key的回收?

Redis的持久化了解过吗?

Redis在集群种查找key的时候,是怎么定位到具体节点的?

Redis集群各个节点之间是怎么保持数据一致性的?

用Redis做延时队列,具体应该怎么实现?

RedisString的内部编码有哪些?

Redis集群方案应该怎么做?都有哪些方案?

Redis集群方案什么情况下会导致整个集群不可用?

MySQL里有2000w数据,redis中只存20w的数据,如何保证redis中的数据都是热点数据?

Redis有哪些适合的场景?

Redis和Redisson有什么关系?

Redis中的管道有什么用?

Redis如何做内存优化?

Spring面试题库

什么是spring?

使用Spring框架的好处是什么?

Spring由哪些模块组成

Spring是怎么解决循环依赖的?

SpringBoot手动装配有哪几种方式?

SpringBoot自动配置原理

谈谈自己对于SpringIOC的理解

谈谈自己对于SpringAOP的理解

SpringAOP和AspectJAOP有什么区别?

Spring中的bean的作用域有哪些?

Spring中的单例bean的线程安全问题了解吗?

Spring中的bean生命周期了解过吗?

SpringMVC的工作原理了解嘛?

Spring框架中用到了哪些设计模式?

@Component和@Bean的区别是什么?

将一个类声明为Spring的bean的注解有哪些?

Spring事务管理的方式有几种?

Spring事务中的隔离级别有哪几种?

Spring事务中有哪几种事务传播行为?

Spring事务底层原理

BeanFactory和ApplicationContext有什么区别?

Resource是如何被查找、加载的?

解释自动装配的各种模式?

有哪些不同类型的IOC(依赖注入)?

SpringAOP实现原理

ApplicationContext通常的实现是什么?

Bean工厂和Applicationcontexts有什么区别?

SpringBoot面试题库

什么是springboot

SpringBoot有哪些优点?

创建一个SpringBootProject的最简单的方法是什么?

Spring和SpringBoot有什么不同?

如何重新加载SpringBoot上的更改,而无需重新启动服务器?

SpringBoot中的监视器是什么?

如何在SpringBoot中禁用Actuator端点安全性?

怎么使用Maven来构建一个SpringBoot程序?

SpringInitializr是创建SpringBootProjects的唯一方法吗?

为什么我们需要spring-boot-maven-plugin?

什么是嵌入式服务器?我们为什么要使用嵌入式服务器呢?

如何在SpringBoot中添加通用的JS代码?

如何使用SpringBoot部署到不同的服务器?

如何使用配置文件通过SpringBoot配置特定环境的配置?

什么是Swagger?你用SpringBoot实现了吗?

如何实现SpringBoot应用程序的安全性?

比较一下SpringSecurity和Shiro各自的优缺点?

SpringBoot中如何解决跨域问题?

SpringBoot的核心注解是哪些?他由哪几个注解组成的?

保护SpringBoot应用有哪些方法?

SpringBoot2.X有哪些新特性?与1.X有什么区别?

SpringCloud面试题库

什么是springcloud?

使用SpringCloud有什么优势?

服务注册和发现是什么意思?SpringCloud如何实现?

SpringCloud由哪些组件组成?

什么是Hystrix?它如何实现容错?

什么是Hystrix断路器?我们需要它吗?

什么是NetflixFeign?它的优点是什么?

Eureka的工作原理?

说说Eureka的自我保护机制?

什么是zuul?

zuul的工作流程?

什么是服务熔断?什么是服务降级?

什么是服务雪崩效应?

ZuulFilter有哪些常用方法?

如何实现动态Zuul网关路由转发?

什么是SpringCloudBus?

SpringCloudBus原理?

SpringCloudConfig可以实现实时刷新吗?

Eureka和zookeeper都可以提供服务注册与发现的功能,两者的区别

MyBatis面试题库

什么是Mybatis?

Mybatis的优缺点?

Mybatis使用场合?

#和$的区别是什么?

当实体类的属性名和表种字段名不一致怎么办?

Mybatis是如何将sql执行结果封装为目标对象并返回的?都有哪些映射形式?

如何获取自动生成的(主)键值?

Mybatis的Xml映射文件中,不同的Xml映射文件,id是否可以重复?

Mybatis动态SQL?

说一下resultMap和resultType?

Mybatis全局配置文件中有哪些标签?分别代表什么意思?

Mybatis能执行一对一、一对多的关联查询吗?都有哪些实现方式,以及它们之间的区别。

Mybatis是否支持延迟加载?如果支持,它的实现原理是什么?

Mybatis都有哪些Executor执行器?它们之间的区别是什么?

Mybatis的一级、二级缓存

Netty面试题库

你了解过哪些IO模型?

什么是Reactor模型?Reactor的3种版本都知道吗?

了解过粘包拆包吗?为什么会出现粘包拆包?怎么处理粘包拆包?

UDP协议会有粘包拆包的问题吗?为什么?

Netty是什么?

为什么要用Netty?

Netty的应用场景了解么?

Netty的零拷贝了解么?

Netty的心跳机制了解么?

Netty中有哪些重要组件?

Netty发送消息有几种方式?

Netty支持哪些心跳类型设置?

说说Netty的执行流程?

Netty高性能体现在哪些方面?

微服务面试题库

微服务有哪些优缺点?

作为注册中心,Zookeeper和Eureka有什么区别?

ServiceMesh了解过吗?

微服务有哪些特点?

单片,SOA和微服务架构有什么区别?

SpringCloud解决了哪些问题?

服务注册和发现是什么意思?SpringCloud如何实现?

SpringCloud和dubbo的区别?

什么是微服务?

微服务之间是如何通讯的?

请谈谈对SpringBoot和SpringCloud的理解

什么是服务熔断,什么是服务降级

你所知道的微服务技术栈有哪些?

什么是Eureka服务注册与发现?

Eureka的基本架构是什么?

作为服务注册中心,Eureka比Zookeeper好在哪里?

Zookeeper面试题库

Zookeeper有哪些节点类型?

了解过Zookeeper的ZAB协议吗?

Zookeeper怎么实现分布式锁?

Zookeeper是怎么保证数据一致性的?

ZookeeperLeader选举过程是怎样的?

Zookeeper怎么实现服务注册?

ZooKeeper是什么?

ZooKeeper提供了什么?

Zookeeper文件系统

ZookeeperWatcher机制

客户端注册Watcher实现

服务端处理Watcher实现

ACL权限控制机制

服务器角色

Zookeeper下Server工作状态

数据同步

zookeeper是如何保证事务的顺序一致性的?

分布式集群中为什么会有Master?

zk节点宕机如何处理?

Zookeeper有哪几种部署模式?

集群最少要几台机器,集群规则是怎样的?

集群支持动态添加机器吗?

Zookeeper对节点的watch监听通知是永久的吗?为什么不是永久的?

ZAB和Paxos算法的联系与区别?

Zookeeper的典型应用场景

Zookeeper和Dubbo的关系?

zookeeper负载均衡和nginx负载均衡区别

消息队列面试题库

消息队列有哪些应用场景?

消息队列的弊端有哪些?

使用消息队列,怎么确保消息不丢失?

使用消息队列,如果处理重复消息?

Kafka的消息是有序的吗?如果保证Kafka消息的顺序性?

消息如何保证幂等性

消息队列积压怎么办

各种MQ的比较

如何解决消息队列的延时以及过期失效问题?消息队列满了以后该怎么处理?有几百万消息持续积压几小时怎么解决?

为什么使用消息队列?

Kafka面试题库

为什么要使用kafka?为什么要使用消息队列?

Kafka中的ISR、AR又代表什么?ISR的伸缩又指什么?

kafka中的broker是干什么的?

kafka中的zookeeper起到什么作用?可以不用zookeeper么?

kafkafollower如何与leader同步数据?

什么情况下一个broker会从ISR中被踢出去?

kafka为什么那么快?

kafkaproducer如何优化打入速度?

kafkaproducer打数据,ack为0,1,-1的时候代表啥,设置-1的时候,什么情况下,leader会认为一条消息commit了

kafkaunclean配置代表啥?会对sparkstreaming消费有什么影响?

如果leadercrash时,ISR为空怎么办?

kafka的message格式是什么样的?

kafka中consumergroup是什么概念?

Kafka中的消息是否会丢失和重复消费?

为什么Kafka不支持读写分离?

Kafka中是怎么体现消息顺序性的?

kafka如何实现延迟队列?

什么是消费者组?

解释下Kafka中位移(offset)的作用。

阐述下Kafka中的领导者副本(LeaderReplica)和追随者副本(FollowerReplica)的区别。

如何设置Kafka能接收的最大消息的大小?

监控Kafka的框架都有哪些?

Broker的HeapSize如何设置?

如何估算Kafka集群的机器数量?

Leader总是-1,怎么破?

LEO、LSO、AR、ISR、HW都表示什么含义?

Kafka能手动删除消息吗?

consumer_offsets是做什么用的?

分区Leader选举策略有几种?

Kafka的哪些场景中使用了零拷贝(ZeroCopy)?

如何调优Kafka?

Controller发生网络分区(NetworkPartitioning)时,Kafka会怎么样?

简述Follower副本消息同步的完整流程。

RabbitMQ面试题库

什么是RabbitMQ?为什么使用RabbitMQ?

RabbitMQ有什么优缺点?

什么是元数据?元数据分为哪些类型?包括哪些内容?与cluster相关的元数据有哪些?元数据是如何保存的?元数据在cluster中是如何分布的?

在单node系统和多node构成的cluster系统中声明queue、exchange,以及进行binding会有什么不同?

客户端连接到cluster中的任意node上是否都能正常工作?

若cluster中拥有某个queue的ownernode失效了,且该queue被声明具有durable属性,是否能够成功从其他node上重新声明该queue?

RabbitMQ的消息是怎么发送的?

RabbitMQ怎么避免消息丢失?

RabbitMQ的使用场景有哪些?

RabbitMQ有哪些重要的角色?

如何确保消息正确地发送至RabbitMQ?如何确保消息接收方消费了消息?

要保证消息持久化成功的条件有哪些?

RabbitMQ有几种广播类型?

vhost是什么?起什么作用?

消息基于什么传输?

消息如何分发?

消息怎么路由?

如何确保消息接收方消费了消息?

如何避免消息重复投递或重复消费?

死信队列和延迟队列的使用

计算机网络面试题库

请简述TCP/UDP的区别

TCP对应的协议和UDP对应的协议

有哪些私有(保留)地址?

你能说一说OSI七层模型?

说一说TCP/IP四层模型

简述IP地址的分类?

简述ARP地址解析协议工作原理

简述ICMP、TFTP、HTTP、NAT、DHCP协议

说一说TCP的三次握手

为什么TCP要三次握手

TCP建立连接时为什么要传回SYN

TCP为什么要四次挥手

滑动窗口和流量控制

拥塞控制

HTTP协议包括哪些请求?

TCPtime_wait状态是主动断开方才有,还是被动断开方才有?还是两边都有?

TCP的keepalive机制了解过吗?

HTTP的keepalive和TCP的keepalive,有什么区别?

TCP与UDP的区别?

简述HTTP1.0/1.1/2.0的区别

HTTPS的原理了解过吗?

TCP里Nagle算法了解过吗?可以禁用吗?在Java里怎么禁用?

HTTP协议为什么无法实现服务端推送?

websocket协议升级过程了解过吗?

websocket帧结构了解过吗?

数据结构与算法面试题库

什么是算法?

TreeMap和TreeSet在排序时如何比较元素?Collections工具类中的sort()方法如何比较元素?

如何知道二叉树的深度?

介绍一下,堆排序的原理是什么?

数组和链表的区别

二分查找了解过吗?

说下你熟悉的排序算法

布隆过滤器了解过吗?

一致性hash算法了解过吗?

如何在一个1到100的整数数组中找到丢失的数字?

请你讲讲LRU算法的实现原理?

为什么要设计后缀表达式,有什么好处?

什么是B树?

什么是B+树?

谈一谈,id全局唯一且自增,如何实现?

设计模式面试题库

接口是什么?为什么要使用接口而不是直接使用具体类?

设计模式六大原则?

Java怎么实现单例模式?

什么是代理模式?什么是动态代理?Java中动态代理有哪些实现方式?

设计模式的类型

说说你所熟悉或听说过的j2ee中的几种常用模式?

简述一下你了解的Java设计模式(总结)

适配器模式是什么?什么时候使用?

适配器模式与装饰器模式有什么区别?

适配器模式和代理模式之间有什么不同?

什么是模板方法模式?试举例说明。

OOP中的组合、聚合和关联有什么区别?

给我一个符合开闭原则的设计模式的例子?

工厂模式与抽象工厂模式的区别?

举出一个例子,在这种情况你会更倾向于使用抽象类,而不是接口?

Dubbo源码使用了哪些设计模式?

Spring当中用到了哪些设计模式?

分布式面试题库

分布式id如何生成?

雪花算法了解过吗?

什么是CAP定理?

分布式事务了解过吗?

什么是二阶段提交(2PC)?什么是三阶段提交(3PC)?

TCC了解过吗?

Paxos算法了解过吗?

Zookeeper的Zab协议了解过吗?

知道什么是Gossip协议吗?

了解过哪些负载均衡算法?

负载均衡的实现方案有哪些?

正向代理和反向代理的区别

分布式Session了解过吗?如何实现?

如何防止表单重复提交?

如何设计一个秒杀系统?

分布式系统的接口幂等性设计

如何保障请求执行顺序

BASE理论了解过吗?

SOA和微服务架构有哪些区别?

Linux面试题库

vim有几种工作模式?

find命令如何使用?

如何在/usr目录下找出大小超过10MB的文件?

如何在/var目录下找出90天之内未被访问过的文件?

如何在/home目录下找出120天之前被修改过的文件?

在整个目录树下查找文件“core”,如发现则无需提示直接删除它们?

ls命令

df命令

rm命令

mv命令

cp命令

tail命令

grep命令

sed命令

用sed命令将指定的路径/usr/local/http替换成为/usr/src/local/http?

awk命令

打印/etc/passwd的1到3行?

vim命令

diff命令

sort命令

xargs命令

把当前目录下所有后缀名为.txt的文件的权限修改为777?

tar命令

gzip命令

bzip2命令

unzip命令

export命令

yum命令

rpm命令

shutdown命令

service命令

whereis命令

用一条命令显示本机eth0网卡的IP地址,不显示其它字符?

如何禁止服务器被ping?

设置DNS需要修改哪个配置文件?

在Linux下如何指定dns服务器,来解析某个域名?

Docker面试题库

什么Docker

Docker与虚拟机有何不同

什么是Docker镜像

什么是Docker容器

Docker容器有几种状态

DockerFile中最常见的指定是什么?

Docker的常用命令?

容器与主机之间的数据拷贝命令?

启动nginx容器(随机端口映射),并挂载本地文件目录到容器html的命令?

如何使用Docker技术创建与环境无关的容器系统?

有什么方法确定一个Docker容器运行状态

DockerImage和DockerLayer(层)有什么不同

如何停止所有正在运行的容器?

如何清理批量后台停止的容器?

如何临时退出一个正在交互的容器的终端,而不终止它?

Docker群(Swarm)是什么

在使用Docker技术的产品中如何监控其运行

什么是孤儿卷及如何删除它?

在Windows系统上可以运行原生的Docker容器吗?

在非Linux操作系统平台上如何运行Docker?

Dubbo面试题库

Dubbo是什么?

为什么要用Dubbo?

Dubbo和Dubbox有什么区别?

dubbo都支持什么协议,推荐用哪种?

Dubbo需要Web容器吗?

Dubbo内置了哪几种服务容器?

Dubbo默认使用什么注册中心,还有别的选择吗?

Dubbo有哪几种配置方式?

在Provider上可以配置的Consumer端的属性有哪些?

Dubbo启动时如果依赖的服务不可用会怎样?

Dubbo推荐使用什么序列化框架,你知道的还有哪些?

Dubbo默认使用的是什么通信框架,还有别的选择吗?

注册了多个同一样的服务,如果测试指定的某一个服务呢?

Dubbo支持服务多协议吗?

当一个服务接口有多种实现时怎么做?

服务上线怎么兼容旧版本?

Dubbo可以对结果进行缓存吗?

Dubbo服务之间的调用是阻塞的吗?

Dubbo支持分布式事务吗?

Dubbo支持服务降级吗?

Dubbo如何优雅停机?

服务提供者能实现失效踢出是什么原理?

如何解决服务调用链过长的问题?

服务读写推荐的容错策略是怎样的?

Dubbo必须依赖的包有哪些?

Dubbo的管理控制台能做什么?

说说Dubbo服务暴露的过程。

Elasticsearch面试题库

为什么要使用Elasticsearch?

Elasticsearch是如何实现Master选举的?

Elasticsearch中的节点(比如共20个),其中的10个选了一个master,另外10个选了另一个master,怎么办?

详细描述一下Elasticsearch索引文档的过程。

详细描述一下Elasticsearch更新和删除文档的过程

详细描述一下Elasticsearch搜索的过程

Elasticsearch对于大数据量(上亿量级)的聚合如何实现?

在并发情况下,Elasticsearch如果保证读写一致?

ElasticSearch中的集群、节点、索引、文档、类型是什么?

ElasticSearch中的分片是什么?

什么是ElasticSearch?

Elasticsearch中的倒排索引是什么?

Elasticsearch中的分析器是什么?

说说Elasticsearch常用的调优手段?

Elasticsearch在部署时,对Linux的设置有哪些优化方法?

客户端在和集群连接时,如何选择特定的节点执行请求?

在Elasticsearch中,是怎么根据一个词找到对应的倒排索引的?

对于GC方面,在使用Elasticsearch时要注意什么?

在并发情况下,Elasticsearch如果保证读写一致?

如何监控Elasticsearch集群状态?

Java集合面试题库

常见的集合有哪些?

常见的集合底层实现

HashMap与HashTable的区别?

ConcurrentHashMap和Hashtable的区别?

ConcurrentHashMap实现原理

ArrayList和Vector的区别?

ArrayList和LinkedList的区别?

HashMap默认的初始化长度是多少?

谈谈对HashMap构造方法中初始容量、加载因子的理解

Java集合框架是什么?说出一些集合框架的优点?

集合框架中的泛型有什么优点?

为何Collection不从Cloneable和Serializable接口继承?

为何Map接口不继承Collection接口?

Iterator是什么?

Enumeration和Iterator接口的区别?

Iterater和ListIterator之间有什么区别?

fail-fast与fail-safe有什么区别?

hashCode()和equals()方法有何重要性?

我们能否使用任何类作为Map的key?

如何决定选用HashMap还是TreeMap?

哪些集合类提供对元素的随机访问?

BlockingQueue是什么?

队列和栈是什么,列出它们的区别?

Collections类是什么?

Comparable和Comparator接口有何区别?

Java高并发面试题库

什么是进程

什么是线程

进程间如何通讯

线程间如何通讯

同步和异步有何不同,在什么情况下分别使用它们?举例说明

进程调度算法

Java中Unsafe类详解

如何测试并发量?

有三个线程T1,T2,T3,怎么确保它们按顺序执行?

什么是线程调度器(ThreadScheduler)和时间分片(TimeSlicing)?

数据库死锁?

什么是锁顺序死锁?

死锁的避免与诊断?

常见的并发容器?

常见的同步工具类?

Nginx多进程模型是如何实现高并发的?

CopyOnWriteArrayList

AQS

Java里的阻塞队列

Fork/Join框架

Kubernetes面试题库

什么是Kubernetes?

Kubernetes与Docker有什么关系?

什么是ContainerOrchestration?

Kubernetes如何简化容器化部署?

什么是Google容器引擎?

什么是Heapster?

什么是Minikube?

什么是Kubectl?

什么是Kubelet?

KubernetesArchitecture的不同组件有哪些?

你对Kube-proxy有什么了解?

您能否介绍一下Kubernetes中主节点的工作情况?

kube-apiserver和kube-scheduler的作用是什么?

你能简要介绍一下Kubernetes控制管理器吗?

什么是etcd?

你对Kubernetes的负载均衡器有什么了解?

什么是Ingress网络,它是如何工作的?

您对云控制器管理器有何了解?

什么是Container资源监控?

ReplicaSet和ReplicationController之间有什么区别?

Maven面试题库

maven是什么?

使用Maven好处

Maven的坐标和依赖

Maven的⽣命周期

你们项目为什么选用Maven进行构建?

Maven规约是什么?

Maven常用命令

Maven有哪些优点和缺点

Maven版本规则?

对于一个多模块项目,如果管理项目依赖的版本?

Maven依赖原则?

如何解决jar冲突?

什么是Maven插件?

Maven依赖冲突

依赖的解析机制

MongoDB面试题库

什么是MongoDB?

MongoDB的优势有哪些

什么是集合(表)?

什么是文档(记录)

为什么用MOngoDB?

在哪些场景使用MongoDB

MongoDB中的命名空间是什么意思?

MongoDB中的分片什么意思

为什么要在MongoDB中使用分析器

MongoDB支持主键外键关系吗

MongoDB支持哪些数据类型

为什么要在MongoDB中用Code数据类型

为什么要在MongoDB中用RegularExpression数据类型

为什么在MongoDB中使用ObjectID数据类型

ObjectID有哪些部分组成

在MongoDb中什么是索引

在MongoDB中什么是副本集

MongoDB支持存储过程吗?如果支持的话,怎么用?

如何理解MongoDB中的GridFS机制,MongoDB为何使用GridFS来存储文件?

为什么MongoDB的数据文件很大?

Jenkins面试题库

什么是Jenkins?

Maven,Ant和Jenkins有什么区别?

Jenkins支持哪些SCM工具?

在Jenkins中,什么是持续集成?

Jenkins的优势是什么?

可以使用哪些命令手动启动Jenkins?

如何在Jenkins中创建备份和复制文件?

如何通过Jenkins克隆Git存储库?

什么是jenkinsfile?为什么使用jenkinsfile

什么是BlueOcean

Mycat面试题库

Mycat是什么?

什么叫混合切分

在项目组中,切分后的库从哪里而来?

搭建mycat的核心配置文件有哪些?

mycat分库可以分成100个库吗?

进行库表拆分时,拆分规则怎么取舍?

Mycat中全局ID方案有哪些?程序自定义全局ID的方案有哪些?

Mycat的在分库分表之后,它是怎么支持联表查询的?

配置文件不会变多,配置的节点主机会变多?

你们项目中分片的实现方式是什么?

Nginx面试题库

请解释一下什么是Nginx?

为什么要用Nginx?

Nginx怎么处理请求的?

Nginx的优缺点?

Nginx应用场景?

使用“反向代理服务器”的优点是什么?

列举Nginx服务器的最佳用途。

请解释Nginx如何处理HTTP请求。

在Nginx中,如何使用未定义的服务器名称来阻止处理请求?

在Nginx中如何在URL中保留双斜线?

ngx_http_upstream_module的作用是什么?

fastcgi与cgi的区别?

Nginx常用命令?

Nginx常用配置?

请陈述stub_status和sub_filter指令的作用是什么?

RocketMQ面试题库

RocketMQ中的Topic和JMS的queue有什么区别?

RocketMQBroker中的消息被消费后会立即删除吗?

RocketMQ消费模式有几种?

消费消息是push还是pull?

broker如何处理拉取请求的?

RocketMQ如何做负载均衡?

消息重复消费如何解决?

如何让RocketMQ保证消息的顺序消费?

RocketMQ如何保证消息不丢失?

rocketMQ的消息堆积如何处理

RocketMQ在分布式事务支持这块机制的底层原理?

如果让你来动手实现一个分布式消息中间件,整体架构你会如何设计实现?

高吞吐量下如何优化生产者和消费者的性能?

再说说RocketMQ是如何保证数据的高容错性的?

任何一台Broker突然宕机了怎么办?

shiro面试题库

什么是shiro

解释下Shiro的核心概念:Subject、SecurityManager、Realm

Shiro的优点

Shiro有哪些组件?

说下Authentication身份验证的流程

Authorization授权的方式和流程是怎样的?

Cryptography加密的过程是这样的?

Realm域如何使用?

shiro拦截器的执行流程

SessionManager会话管理介绍一下

Servlet面试题库

Servlet的生命周期?

Servlet和JSP的区别?

Servlet的基本架构

什么情况下调用doGet()和doPost()?

页面间对象传递的方法

四种会话跟踪技术

Request对象的主要方法

如何配置Servlet的初始化参数?

如何读取Servlet的初始化参数?

init(ServletConfig)方法执行次数

init(ServletConfig)方法与异常

Tomcat面试题库

Tomcat的缺省端口是多少,怎么修改?

tomcat有哪几种Connector运行模式(优化)?

Tomcat有几种部署方式?

tomcat容器是如何创建servlet类实例?用到了什么原理?

tomcat如何优化?

tomcat内存调优了解过吗?

tomcat垃圾回收策略调优了解吗?

tomcat共享session如何处理?

如何添加JMS远程监控

Tomcat一个请求的完整过程

java8面试题库

Java8新特性简介:

抽象类和接口的异同?

Java8支持函数编程是什么意思?

Java8中的可选项是什么?

hashMap原理,java8做的改变

解释Java8-中间操作与终端操作?

什么是Lambda表达式?

Lambda函数的优点:

什么是Java8中的MetaSpace?它与PermGenSpace有何不同?

是什么使JavaSE8优于其他?

Lambda表达式的参数列表与Lambda箭头运算符有何不同?

密码学面试题库

什么是base64

MD5

SHA

HMAC

密码的常用术语

单向加密算法

复杂的对称加密(DES、PBE)、非对称加密算法

非对称加密

DES

操作系统面试题库

说下进程的状态

说下进程和线程的联系与区别

为什么进程上下文切换比线程上下文切换代价高?

说下你对进程同步的理解

进程的通信方式有哪些

进程调度的种类有哪些?

非抢占式调度与抢占式调度的区别是什么?

说下你知道的调度算法

一个程序从开始运行到结束的完整过程(四个过程)

死锁出现的条件?

如何处理死锁问题

如何处理死锁问题

什么是临界资源

介绍一下内存池、进程池、线程池

动态链接库与静态链接库的区别

说下对虚拟内存的理解

页面置换算法了解多少?

中断与系统调用了解吗?

用户态切换到内核态的方式有哪些?

用户态和核心态(内核态)之间的区别是什么呢?

内部碎片与外部碎片分别是什么?

系统调用与库函数的区别

守护、僵尸、孤儿进程的概念

编译原理面试题库

词法分析

语法分析

语义分析

中间代码生成

目标代码生成

表格管理程序

出错处理

句型、句子、语言

有穷自动机(有限自动机)

全局优化

计算机组成原理

计算机系统由哪两部分组成?计算机系统性能取决于什么?

计算机系统5层层次结构从下到上由哪五层组成?哪些是物理机,哪些是虚拟机?

在计算机系统结构中,什么是翻译?什么是解释?

什么是计算机体系结构?什么是计算机组成?以乘法指令为例说明二者区别。

冯诺依曼机器的主要特点?

程序访问的局部性

字长

Cache的基本工作原理

Cache和主存之间的映射方式

Cache中主存块的替换算法

二进制一般使用什么方法转换成十进制?

计算机直接使用原码计算有什么缺点?

请计算12、124、1023、-1、-127的二进制原码。

计算机的补码解决了什么问题?

什么是溢出?什么是上溢?什么是下溢?

浮点数之间做加减法运算需要几个步骤?每个步骤都是必须的吗?为什么?

虚拟存储器的基本概念

页式虚拟存储器

段式虚拟存储器

段页式虚拟存储器


肝了一个月的面试题终于来啦,大家开心不。

2020年最新Java面试题整理,全网最全一份,包含各个技术栈,Java基础,Java集合,多线程,Java异常,spring,springMVC,springboot,springcloud,netty,dubbo,activq,Javaweb,jvm,kafka,MongoDB,mybatis,MySQL,Nginx,rabbitmq,Redis,Tomcat,zookeeper,设计模式,数据结构,算法,分布式,限流,降级,cap原理等等知识点

话不多说,直接上图

总共80多个PDF

【BAT必备】计算机网络面试题:

链接:s/1hFggmtdL1ZmE4utBlo8S1g提取码:qfkh

【BAT必备】设计模式面试题

链接:s/1eXJveIVvQe-m3MdvLcT-fQ提取码:j0kx

【BAT必备】数据结构算法面试题:

链接:s/1daFN9jY03fXsqwc9LeKi2w提取码:5ab7

【BAT必备】多线程面试题:

链接:s/1GdvsNESoHPBjWKN2h-iK7Q提取码:cqib

【BAT必备】并发编程锁面试题:

链接:s/1hXPPtMY2dvz-g7QcSTc3PA提取码:zhmy

【BAT必备】tomcat面试题:

链接:s/1qPZXx4lmLynmaF0XjRTzpQ提取码:5m16

【BAT必备】zookeeper面试题:

链接:s/1EhOee9e1Qe-Q6RC8KlthxA提取码:p2am

【BAT必备】spring全家桶面试题:

链接:s/1DXGO-N5P6QIGKLZ8LIVOuQ提取码:m9v7

【BAT必备】rocketMq面试题:

链接:s/1TEF3yUR4OOaIpj-4ud_79A提取码:3g3d

【BAT必备】redis面试题:

链接:s/1qlanxWBfwvKUObnHulCQiA提取码:rjo7

【BAT必备】rabbitMq面试题:

链接:s/1ywLiq3IUJVyZosPLNrmyTA提取码:0td4

【BAT必备】netty面试题:

链接:s/1Pbv4aelqOt1dUPA2SwEB_Q提取码:2w1e

【BAT必备】Nginx面试题:

链接:s/1r8YNyOz0N6MJ9F0045lEZw提取码:49tl

【BAT必备】MySQL面试题:

链接:s/1GeX6Fs4nNi6fTUHKxJ2SZw提取码:8pow

【BAT必备】mybatis面试题:

链接:s/1xOYiaiQ2JpPt2jb6GdWjaA提取码:aqd3

【BAT必备】MongoDB面试题:

链接:s/1QTVx1TF8tDn6LUJr7wdfOQ提取码:j1qt

【BAT必备】Linux面试题:

链接:s/1veZ3dBJmz1PduCE5tl-e1A提取码:txpf

【BAT必备】kafka面试题:

链接:s/1SWhiBCswleYGsDupSGzE6g提取码:o1gv

【BAT必备】jvm面试题:

链接:s/1xi-QLq_I75kha439EGqELw提取码:kxde

【BAT必备】javaweb面试题:

链接:s/1r3Bupn9qhJbw5ebR_6h94A提取码:qba4

【BAT必备】Java基础面试题:

链接:s/1J40nYKIoV_VMCumoRpIyhQ提取码:5xo7

【BAT必备】dubbo面试题:

链接:s/10flnh7Tb0Oxd3yZPQOnjsA提取码:5gc9

【BAT必备】activeMQ面试题:

链接:s/1igNB64dpMCjCQkRzvqCXpQ提取码:006a

【BAT必备】分布式相关面试题大全面试题:

链接:s/1ZcpJDh07B2NPAL4_4VC6jQ提取码:w4mw

【BAT必备】java面试题大全:

链接:s/11jw0Ua4CZiI8-S6EadM_iQ提取码:epmp

【BAT必备】Java面试汇总

链接:s/1vG9_cNoiYBW5TY32S4wGnQ提取码:k087

【BAT必备】2020年多家公司整理的350道Java面试题手册

链接:s/1FEGQVTgiyKG0kCasYn-n2g提取码:f7y1

【BAT必备】Java全部核心知识点整理

链接:s/1StG-ib70TDAE1Hb4NVLQRQ提取码:5rp1

整理这些非常辛苦,大家点个赞在走吧


原始地址:/paihang/38919.html