您的位置:首页 > 职场人生

java面试题汇总

2018-03-12 20:45 169 查看

基础篇

基本功

面向对象的特征:抽象,继承,封装,多态。
final, finally, finalize 的区别:
        final:   final修饰类或者变量,被final修饰的类不能被继承,被final修饰的方法可以被调用,不能被覆盖,但可以被重载,被final修饰的变量不能被改变。
        finally:  主要使用场景在代码中抛出一个异常,方法中剩余的代码将无法继续执行,打个比方,我们开始执行个文件,当文件执行过程中发生异常,但是此时文件资源还没有关闭,此时便涉及到一个资源回收的问题,此时我们便可以将关闭资源的方法放到finally中,这个方法始终都会被执行。
        finalize:一个方法,用于垃圾回收器将对象从内存中清除出去执行的必要的清理工作。
int 和 Integer 有什么区别
    integer是int的包装类型,int是一个基本数据类型。
    integer必须实例化才可以使用,int基本数据类型可以直接使用。
    intergr的默认值为null,int的默认值为0                                
重载和重写的区别
    重写必须继承,重载不用。
    重写的方法名,参数数目都必须相同,而重载方法名不同,参数列表不同。
    重写方法的修饰符子类必须大于等于父类的方法,重载和修饰符无关。(修饰符大小关系:public>protected>  dafault>private)      
抽象类和接口有什么区别
    抽象类和接口的选择:先不管他是一个类还是一个接口,如果他的子类或者接口实现类方法在子类中用到的比较多,为了提高代码的可复用性,那么这种情况下,使用抽象类好点。
       而如果想为一个类新增方法,而这个类已经继承了其他类,由于java中只能单继承,而可以多实现,那么可以创建一个接口,让该类实现此接口。
    关键词不同:抽象类为abstract,接口为interface
    抽象类中可以有抽象方法,也可以没有抽象方法。接口中全部都是抽象方法。
说说反射的用途及实现
   反射的用途:(1)运行时构造一个类的对象,eg:Class mclass = Class.forName("org.legend.reflect.UserInfo"); 
        (2)判断一个类所具有的成员变量(eg: Field[] fileds=mclass.getDeclaredFields()和方法(eg:Method [] methods=mclass.getDeclaredMethods())
说说自定义注解的场景及实现
HTTP 请求的 GET 与 POST 方式的区别
       GET是从服务器获取数据,而POST是向服务器提交数据。
       GET是显性传输,传输的数据地址栏可见,所以不安全。POST为隐性传输,传输的数据地址栏不可见,比较安全。
       服务器接收方式不同:GET方式,服务器用Request.getQueryString方式接收数据。Post用Request.Form方式接收数据。
       GET传输的数据量较小,一般不大于2KB,POST传输的数据量较大,不受限制。
session 与 cookie 区别
       存放位置:cookie存放在客户端,而session存放在服务器端。
       安全性:cookie以明文的方式存放在客户端,不安全。session存放在服务器端,比较安全。
       生命周期(20分钟为例):cookie的生命周期是累计的,从创建开始开始计时,到20分钟时间自动销毁。session的生命周期是间隔的,20分钟之内,哪怕第19分钟用得到session,那么他的生命周期时间重新计时。
       关机会造成session销毁,但是对cookie没有影响。
session 分布式处理
JDBC 流程
       注册驱动:Class.forName("oracle.jdbc.OracleDriver");
  连接数据库:String url ="XX",String username="XX",String password = "XX",Connection conn=DriverManage.getConnection(url,username,password);
       创建搬运工 statement:Statement  state =conn.creatStatement(); 
       搬运数据,执行sql:String  sql="XXXXXXXXXX";ResoultSet rs = state.executeQuery(sql);
       处理结果集:while(rs.next){
                                  int id=rs.getInt("id");
                                  String name = rs.getString(2);
                            }
      关闭连接:rs.close;   state.close;   conn.close;

MVC 设计思想
equals 与 == 的区别
     equals用于比较基本数据类型,而==用于比较对象。
     如过用equals比较两个对象,则比较的是两个对象是否指向同一个内存地址。

集合

List 和 Set 区别
    相同点:他们都是继承自CollectIon接口。
    不同点:List的存储有序可重复,而Set存储无序不可重复。
List 和 Map 区别
    List是Collection的子接口,Map是单独的一个接口。
    List是按照索引存储,而Map是按照键值对进行存储。
Arraylist 与 LinkedList 区别
     相同点:他们都是Collection的子接口
    不同点:底层方式不同,Arraylist是基于动态数组的数据结构,有索引,方便查询与修改。而LinkedList是基于链表结构,方便添加与删除。
ArrayList 与 Vector 区别
HashMap 和 Hashtable 的区别
HashSet 和 HashMap 区别
HashMap 和 ConcurrentHashMap 的区别
HashMap 的工作原理及代码实现
ConcurrentHashMap 的工作原理及代码实现

线程

创建线程的方式及实现
   创建线程的方式:继承Thread和实现Runnable的方式
sleep() 、wait,join()、yield()有什么区别
     sleep()方法需要指定等待的时间,它可以让当前正在执行的线程在指定的时间内暂停执行,进入阻塞状态,但他不会释放对象锁,也就是说有synchronzed代码同步块,其他线程仍反不能访问共享数据。如果没有ynchronzed代码块,其他低优先级的线程得到执行的机会,也可以使同优先级或者更高优先级的线程得到执行的机会。此方法需要捕获异常。
     wait()方法与sleep()方法不同的是,它会释放锁标志,它必须与notify()或者notifyAll(
4000
)一起连用,它的作用是协调多个线程对共享数据的存取,所以必须在synchronized语句块内使用,也就是说调用wait,notify,notifyAll方法的前提必须是拥有对象的锁。
    yield()方法与sleep方法相似,他不会释放锁标志,区别在于,他没有参数,即yield方法会使当前线程重新回到可执行状态,所以执行yield的线程有可能被重新置为可执行状态之后马上执行,同时yield()方法会使同优先级或者更高优先级的线程得到执行的机会。
    join():当前正在执行的线程会等待调用join()方法的线程执行完毕后继续执行。

说说 CountDownLatch 原理
说说 CyclicBarrier 原理
说说 Semaphore 原理
说说 Exchanger 原理
说说 CountDownLatch 与 CyclicBarrier 区别
ThreadLocal 原理分析
讲讲线程池的实现原理
线程池的几种方式
线程的生命周期
       新建(NEW):新创建线程对象。
       可运行(RUNNABLE):线程对象创建后,其他线程调用该线程对象的start()方法,该状态的线程位于可运行的线程池中,等待被线程调度选中,获的CPU的使用权。
       运行(RUNNING):可运行的线程获得CPU的时间片(timelice),执行程序代码。
       阻塞(BLOCKED):阻塞是指线程因为某种原因放弃了CPU的使用权,也即将让出 cpu timelice,
       死亡(DEAD):线程执行结束或者因为异常退出退出run()方法,则该线程结生命周期,死亡的线程不可复活。

锁机制

说说线程安全问题
    常见的线程安全与线程不安全:
                       ArrayList是非线程安全的,Vector是线程安全的;
                       HashMap是非线程安全的,HashTable是线程安全的;
                       StringBuilder是非线程安全的,StringBuffer是线程安全的。
    线程安全是指多个线程对同一对象进行访问时,进行了加锁机制,当一个线程正在访问该类的某个数据时,进行保护,其     他线程不能访问,直到当前正在执行的线程读取完毕后,其他线程才能访问。
         举个例子:创建100线程,每个线程分别往ArrayList里面添加100个元素,多执行几次,你会发现最终结果ArrayList的长度有几次不一样,而用Vector则每次结构都一样。
volatile 实现原理
synchronize 实现原理
  
synchronized 与 lock 的区别
CAS 乐观锁
ABA 问题
乐观锁的业务场景及实现方式

设计模式

你实际开发中最常用的设计模式以及使用场景
     单例模式
    (1)懒汉设计模式:在类加载时不初始化,使用时初始化
                   范例代码:public  class LanHanDemo{
                                           private static LanHanDemo lanhanDemo;
                                           private LanHanDemo(){};
                                           public  LanHanDemo getLanHanDemo(){
                                                    if(lanhanDemo==null){
                                                            lanhanDemo=new LanHanDemo();
                                                    }
                                                    return   lanhanDemo;
                                           }
                                   }
      (2)  饿汉设计模式:在类加载时就初始化
                    范例代码:public  class EHanDemo{
                                           private static EHanDemo ehanDemo = new EHanDemo();
                                           private EHanDemo(){};
                                           public  EHanDemo getEHanDemo(){ 
                                                    return   ehanDemo;
                                           }
                                   }
工厂模式:
       使用场景:举个例子:A类中使用到B类中的某个方法,这时就需要在A类中创建一个B类的实例,后面一旦系统重构,调整为A类需要调用C类的方法,程序不得不更改A类代码。
代码例子:代码思想范例:
      我想买个车,有国产车和进口车区别,
            代码:public intterface car{
                             public void price(); 
                       }
       国产车
            代码:public class GuoChan implements car {
                             public void price(){
                                 System.out.println("你的钱可以买个进口车");
                             }
                      }
       进口车
             代码:public class JinKou implements car {
                             public void price(){
                                 System.out.println("你的钱只能买个国产车");
                             }
                      }
       现在有个汽车大型卖场,看你想买那种车:
              代码: public class carFactory{
                                  public static car buyCar(String type) throws Exception{
                                        if(type.equals("GuoChan")){
                                                return GuoChan.class.instance();
                                        }
                                        if(type.equals("JinKou")){
                                                return JinKou.class.instance();
                                        }
                                  }
                         }

IO

核心篇

数据存储

MySQL 索引使用的注意事项
说说反模式设计
说说分库与分表设计
分库与分表带来的分布式困境与应对之策
说说 SQL 优化之道
MySQL 遇到的死锁问题
存储引擎的 InnoDB 与 MyISAM
数据库索引的原理
为什么要用 B-tree
聚集索引与非聚集索引的区别
limit 20000 加载很慢怎么解决
选择合适的分布式主键方案
选择合适的数据存储方案
ObjectId 规则
聊聊 MongoDB 使用场景
倒排索引
聊聊 ElasticSearch 使用场景

缓存使用

Redis 有哪些类型
Redis 内部结构
聊聊 Redis 使用场景
Redis 持久化机制
Redis 如何实现持久化
Redis 集群方案与实现
Redis 为什么是单线程的
缓存奔溃
缓存降级
使用缓存的合理性问题

消息队列

消息队列的使用场景
消息的重发补偿解决思路
消息的幂等性解决思路
消息的堆积解决思路
自己如何实现消息队列
如何保证消息的有序性

框架篇

Spring

BeanFactory 和 ApplicationContext 有什么区别
Spring Bean 的生命周期
Spring IOC 如何实现
说说 Spring AOP
Spring AOP 实现原理
动态代理(cglib 与 JDK)
Spring 事务实现方式
Spring 事务底层原理
如何自定义注解实现功能
Spring MVC 运行流程
Spring MVC 启动流程
Spring 的单例实现原理
Spring 框架中用到了哪些设计模式
Spring 其他产品(Srping Boot、Spring Cloud、Spring Secuirity、Spring Data、Spring AMQP 等)

Netty

为什么选择 Netty
说说业务中,Netty 的使用场景
原生的 NIO 在 JDK 1.7 版本存在 epoll bug
什么是TCP 粘包/拆包
TCP粘包/拆包的解决办法
Netty 线程模型
说说 Netty 的零拷贝
Netty 内部执行流程
Netty 重连实现

微服务篇

微服务

前后端分离是如何做的
微服务哪些框架
你怎么理解 RPC 框架
说说 RPC 的实现原理
说说 Dubbo 的实现原理
你怎么理解 RESTful
说说如何设计一个良好的 API
如何理解 RESTful API 的幂等性
如何保证接口的幂等性
说说 CAP 定理、 BASE 理论
怎么考虑数据一致性问题
说说最终一致性的实现方案
你怎么看待微服务
微服务与 SOA 的区别
如何拆分服务
微服务如何进行数据库管理
如何应对微服务的链式调用异常
对于快速追踪与定位问题
微服务的安全

分布式

谈谈业务中使用分布式的场景
Session 分布式方案
分布式锁的场景
分布是锁的实现方案
分布式事务
集群与负载均衡的算法与实现
说说分库与分表设计
分库与分表带来的分布式困境与应对之策

安全问题

安全要素与 STRIDE 威胁
防范常见的 Web 攻击
服务端通信安全攻防
HTTPS 原理剖析
HTTPS 降级攻击
授权与认证
基于角色的访问控制
基于数据的访问控制

性能优化

性能指标有哪些
如何发现性能瓶颈
性能调优的常见手段
说说你在项目中如何进行性能调优

工程篇

需求分析

你如何对需求原型进行理解和拆分
说说你对功能性需求的理解
说说你对非功能性需求的理解
你针对产品提出哪些交互和改进意见
你如何理解用户痛点

设计能力

说说你在项目中使用过的 UML 图
你如何考虑组件化
你如何考虑服务化
你如何进行领域建模
你如何划分领域边界
说说你项目中的领域建模
说说概要设计

设计模式

你项目中有使用哪些设计模式
说说常用开源框架中设计模式使用分析
说说你对设计原则的理解
23种设计模式的设计理念
设计模式之间的异同,例如策略模式与状态模式的区别
设计模式之间的结合,例如策略模式+简单工厂模式的实践
设计模式的性能,例如单例模式哪种性能更好。

业务工程

你系统中的前后端分离是如何做的
说说你的开发流程
你和团队是如何沟通的
你如何进行代码评审
说说你对技术与业务的理解
说说你在项目中经常遇到的 Exception
说说你在项目中遇到感觉最难Bug,怎么解决的
说说你在项目中遇到印象最深困难,怎么解决的
你觉得你们项目还有哪些不足的地方
你是否遇到过 CPU 100% ,如何排查与解决
你是否遇到过 内存 OOM ,如何排查与解决
说说你对敏捷开发的实践
说说你对开发运维的实践
介绍下工作中的一个对自己最有价值的项目,以及在这个过程中的角色

软实力

说说你的亮点
说说你最近在看什么书
说说你觉得最有意义的技术书籍
工作之余做什么事情
说说个人发展方向方面的思考
说说你认为的服务端开发工程师应该具备哪些能力
说说你认为的架构师是什么样的,架构师主要做什么
说说你所理解的技术专家
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  面试