爱代码

做一个最单纯的人 || 走一段最幸福的路

    已关注
    关注我

粉丝: 2 关注: 1

微信公众号搜索 未来技术网 关注我们 支付宝首页搜索:“ 7151684 ” 即可领取最高99元红包

java面试题集

  2018-07-09 21:47     56


1.java基础;

2.java数据类型

    byte:Java中最小的数据类型,在内存中占8位(bit),即1个字节,取值范围-128~127,默认值0

    short:短整型,在内存中占16位,即2个字节,取值范围-32768~32717,默认值0

    int:整型,用于存储整数,在内在中占32位,即4个字节,取值范围-2147483648~2147483647,默认值0

    long:长整型,在内存中占64位,即8个字节-2^63~2^63-1,默认值0L

    float:浮点型,在内存中占32位,即4个字节,用于存储带小数点的数字(与double的区别在于float类型有效小数点只有6~7位),默认值0

    double:双精度浮点型,用于存储带有小数点的数字,在内存中占64位,即8个字节,默认值0

    char:字符型,用于存储单个字符,占16位,即2个字节,取值范围0~65535,默认值为空

    boolean:布尔类型,占1个字节,用于判断真或假(仅有两个值,即true、false),默认值false

3. ==” 跟 “equals” 的区别

  1)对于==,如果作用于基本数据类型的变量,则直接比较其存储的 “值”是否相等;

    如果作用于引用类型的变量,则比较的是所指向的对象的地址

  2)对于equals方法,注意:equals方法不能作用于基本数据类型的变量

    如果没有对equals方法进行重写,则比较的是引用类型的变量所指向的对象的地址;

    诸如String、Date等类对equals方法进行了重写的话,比较的是所指向的对象的内容。


4.jvm 的性能调优(三年以上的工作经历问的比较多)最好多掌握

https://blog.csdn.net/zhangjin530/article/details/53306708

https://www.cnblogs.com/csniper/p/5592593.html



6.arrayList  LinkedList  Vector  的区别   底层问的多


7. 红叉树数据结构考试题出的多

.红黑树(Red Black Tree) 是一种自平衡二叉查找树,是在计算机科学中用到的一种数据结构,典型的用途是实现关联数组

8. Set   hashset   跟 treeset  

相同点:

单列集合,元素不可重复

不同点

1. 底层存储的数据结构不同

    HashSet底层用的是HashMap哈希表结构存储,而TreeSet底层用的是TreeMap树结构存储

2.存储时保证数据唯一性依据不同

   HashSet是通过复写hashCode()方法和equals()方法来保证的,而HashSet通过Compareable接口的compareTo()方法来保证的

3.有序性不一样

 HashSet无序,TreeSet有序

9. treeset 两种实现排序的底层方法

https://www.cnblogs.com/wl0000-03/p/6019627.html


A:自然排序:在当前类中实现Comparerable<T>接口  ,并且重写compareTo方法

B:比较器排序:新建类并实现Comparetor<t>接口,重写compare方法


comparerable 与 comparetor 的区别?

https://www.cnblogs.com/xujian2014/p/5215082.html



10.HashMap  HashTable  区别      HashMap 的底层实现原理

  1. 两者最主要的区别在于Hashtable是线程安全,而HashMap则非线程安全
    Hashtable的实现方法里面都添加了synchronized关键字来确保线程同步,因此相对而言HashMap性能会高一些,我们平时使用时若无特殊需求建议使用HashMap,在多线程环境下若使用HashMap需要使用Collections.synchronizedMap()方法来获取一个线程安全的集合(Collections.synchronizedMap()实现原理是Collections定义了一个SynchronizedMap的内部类,这个类实现了Map接口,在调用方法时使用synchronized来保证线程同步,当然了实际上操作的还是我们传入的HashMap实例,简单的说就是Collections.synchronizedMap()方法帮我们在操作HashMap时自动添加了synchronized来实现线程同步,类似的其它Collections.synchronizedXX方法也是类似原理

  2. HashMap可以使用null作为key,而Hashtable则不允许null作为key
    虽说HashMap支持null值作为key,不过建议还是尽量避免这样使用,因为一旦不小心使用了,若因此引发一些问题,排查起来很是费事
    HashMap以null作为key时,总是存储在table数组的第一个节点上

  3. HashMap是对Map接口的实现,HashTable实现了Map接口和Dictionary抽象类

  4. HashMap的初始容量为16,Hashtable初始容量为11,两者的填充因子默认都是0.75
    HashMap扩容时是当前容量翻倍即:capacity*2,Hashtable扩容时是容量翻倍+1即:capacity*2+1

  5. 两者计算hash的方法不同
    Hashtable计算hash是直接使用key的hashcode对table数组的长度直接进行取模

  6. HashMap计算hash对key的hashcode进行了二次hash,以获得更好的散列值,然后对table数组长度取摸

  7. HashMap和Hashtable的底层实现都是数组+链表结构实现


    11.ConcurrentHashMap 的实现原理  

        HashMap 跟 ConcurrentHashMap 

    ConcurrentHashMap使用了线程锁分段技术,每次访问只允许一个线程修改哈希表的映射关系,所以是线程安全的


    12.TreeMap  LinkedHashMap  HashMap 的区别

  TreeMap实现SortMap接口,能够把它保存的记录根据键排序。
  默认是按键值的升序排序,也可以指定排序的比较器,当用Iterator 遍历TreeMap时,得到的记录是排过序的。


 13.java 中的线程问题  

https://www.cnblogs.com/Jixiangwei/p/6822334.html


 14.synchronized   跟 volatile  区别

1)volatile本质是在告诉jvm当前变量在寄存器中的值是不确定的,需要从主存中读取,synchronized则是锁定当前变量,只有当前线程可以访问该变量,其他线程被阻塞住.
2)volatile仅能使用在变量级别,synchronized则可以使用在变量,方法.
3)volatile仅能实现变量的修改可见性,而synchronized则可以保证变量的修改可见性和原子性.

  《Java编程思想》上说,定义long或double变量时,如果使用volatile关键字,就会获得(简单的赋值与返回操作)原子性
4)volatile不会造成线程的阻塞,而synchronized可能会造成线程的阻塞.

5、当一个域的值依赖于它之前的值时,volatile就无法工作了,如n=n+1,n++等。如果某个域的值受到其他域的值的限制,那么volatile也无法工作,如Range类的lower和upper边界,必须遵循lower<=upper的限制。

6、使用volatile而不是synchronized的唯一安全的情况是类中只有一个可变的域。


15.实现创建新线程的方法 3种   有返回值实现方式好处

   https://blog.csdn.net/hellorichen/article/details/53127719


 16.线程池:

 https://blog.csdn.net/u012459345/article/details/51179578



   三年以上工作经历  常见的设计模式(多说设计模式种类) 最好能说出我们的spring、      tomcat中底层的一些实现那些功能 用到哪几种设计模式(bean 的注入跟管理)


  17.spring中的两大核心  依赖注入aop   跟 控制反转 ioc 需要仔细琢磨透

https://blog.csdn.net/ghost_t/article/details/5852865


  springmvc 跟 struts2.0 区别  


 mybatis 跟 hibernate、 jdbc  的区别    优缺点


  springmvc 的流程   一个请求request请求, 经历了那些 ; 最好能画出 springmvc的流程图

18.SpringMVC流程

1、  用户发送请求至前端控制器DispatcherServlet。

2、  DispatcherServlet收到请求调用HandlerMapping处理器映射器。

3、  处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。

4、  DispatcherServlet调用HandlerAdapter处理器适配器。

5、  HandlerAdapter经过适配调用具体的处理器(Controller,也叫后端控制器)。

6、  Controller执行完成返回ModelAndView。

7、  HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet。

8、  DispatcherServlet将ModelAndView传给ViewReslover视图解析器。

9、  ViewReslover解析后返回具体View。

10、DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)。

11、 DispatcherServlet响应用户。

组件说明:

以下组件通常使用框架提供实现:

DispatcherServlet:作为前端控制器,整个流程控制的中心,控制其它组件执行,统一调度,降低组件之间的耦合性,提高每个组件的扩展性。

HandlerMapping:通过扩展处理器映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等。 

HandlAdapter:通过扩展处理器适配器,支持更多类型的处理器。

ViewResolver:通过扩展视图解析器,支持更多类型的视图解析,例如:jsp、freemarker、pdf、excel等。


  我们都知道spring 是单利 如果实现多利; 怎么做?


  spring中问的东西    对你的面试效果权重很高;

  applicationContext通常实现什么

  bean工厂


  spring  那些注解 需要掌握


 19. spring事务管理机制

https://blog.csdn.net/donggua3694857/article/details/69858827


  20.spring底层原理 需要掌握;3年以上

https://blog.csdn.net/u014753629/article/details/78510179


  动态代理 跟 继承jdk 两种实现  最好能写其中一种动态代理的代码。


 21. java  IO 跟NIO的区别  我面试过程没有遇到过, 可以相应的了解


   https://blog.csdn.net/qq_35280514/article/details/77542158

   java8的新特性 需要掌握

    mysql的存储过程

     sql 语句  

      分页问的特别多; mysql  orcle也要知道

      sql底层些东西  最好了解

     一般面试官会问你  简单的介绍下 redis

      对redis的很熟悉面试官 基本会问这些


   redis的存储策略

https://blog.csdn.net/u010785685/article/details/52366977



22.redis的集中数据类型 (需要很熟)

https://www.cnblogs.com/mrhgw/p/6278619.html

23.redis的容灾机制

       https://blog.csdn.net/Irean_Lau/article/details/51360277?locationNum=10&fps=1

24. redis的有个map 数据类型 key 是否可以是任意类型  还有它的长度有无限制

    https://blog.csdn.net/u013905744/article/details/52787467/

       redis的key和string类型value限制均为512MB。


 25.  redis在业务上 可以实现那些功能  

https://blog.csdn.net/ljp812184246/article/details/17614621


26.什么是redis

redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。

Redis 是一个高性能的key-value数据库。 redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部 分场合可以对关系数据库起到很好的补充作用。它提供了Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang等客户端,使用很方便。 [1] 

Redis支持主从同步。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。这使得Redis可执行单层树复制。存盘可以有意无意的对数据进行写操作。由于完全实现了发布/订阅机制,使得从数据库在任何地方同步树时,



27.redis的基本操作命令  设置过期时间 expir等

https://www.cnblogs.com/wudequn/p/8080078.html


   redis 问的频率很高; 需要多了解

  电商方面问题(由于我写了电商项目)


  dubbo+zookeeper(zookeeper最少三台因为它有投票机制) 面试官当时问我这个电商项目用到几台

 zookeeper ;都是奇数;最少3台


  28.dubbo + zookeeper的底层

  dubbo :https://blog.csdn.net/zehonghe/article/details/62216118

  zookeeper:https://blog.csdn.net/yinbucheng/article/details/71189771


29.如何解决高并发问题?

缓存
静态页面
图片服务器分离
优化数据库结构,多做索引
数据库集群和库表散列

不要频繁得使用new对象,能使用单例模式就使用, 对于utility类型的类通过静态方法来访问。
使用线程安全的集合对象vector  hashtable
使用线程池

尽量使用缓存,包括用户缓存,信息缓存等,多花点内存来做缓存,可以大量减少与数据库的交互,提高性能。
用jprofiler等工具找出性能瓶颈,减少额外的开销。
优化数据库查询语句,减少直接使用hibernate等工具的直接生成语句(仅耗时较长的查询做优化)。
优化数据库结构,多做索引,提高查询效率。
统计的功能尽量做缓存,或按每天一统计或定时统计相关报表,避免需要时进行统计的功能。
能使用静态页面的地方尽量使用,减少容器的解析(尽量将动态内容生成静态html来显示)。
解决以上问题后,使用服务器集群来解决单台的瓶颈问题。


html静态化也是某些缓存策略使用的手段,对于系统中频繁使用数据库查询但是内容更新很小的应用,可以考虑使用html静态化来实现,比如论坛中论坛的公用设置信息,这些信息目前的主流论坛都可以进行后台管理并且存储再数据库中,这些信息其实大量被前台程序调用,但是更新频率很小,可以考虑将这部分内容进行后台更新的时候进行静态化,这样避免了大量的数据库访问请求。


30.如何优化sql?

https://blog.csdn.net/jie_liang/article/details/77340905



   单点登入


   session共享


   js跨域问题


   静态缓存的问题; 你们项目是怎么很好的解决静态资源缓存问题


   solr全文检索问到过一次


   两点一线 得需要知道是什么  

  cookie 跟 session的区别

  cookie 的值 在网页中的请求头 请求体 还是 在哪儿


  nginx 问的不多  我们了解足够应付过去(nginx这个东西实在是太优秀了)



  运维方面上的就是 linux一些操作命令  设置权限等



  并发工具包:


 java.util.concurrent 下面几个常用的


欢迎评论处留言补充


查看评论
发表评论
官方公众号