java面试题

作者: 江湖非良人 | 来源:发表于2019-07-20 16:14 被阅读200次

    持续更新

    问题:请解释Runnable和Callable的区别?
     1)Runnable是在JDK1.0时提出的多线程实现接口,而Callable是JDK1.5后提出的;
     2)java.lang.Runnable接口之中只提供一个run()方法,并且没有返回值;
     3)java.util.concurrent.Callable接口提供有call()方法,可以有返回值;

    问题:请解释volatile与synchronized的区别
     1)volatile主要在属性上使用,而synchronized是在代码块与方法上使用;
     2)volatile无法描述同步的处理,它只是一种直接内存的处理,避免了副本的操作,而synchronized是实现同步的。

    问题:请解释String、StringBuffer、StringBuilder的区别?
     1)String类是字符串的首选类型,其最大的特点是内容不允许修改;
     2)StringBuffer与StringBuilder类的内容允许修改;
     3)StringBuffer是在JDK1.0时提供的,属于线程安全的操作,而StringBuilder是JDK1.5之后提供的,属于非线程安全的操作;

    问题:请问什么是GC?如何处理?
      GC(Garbage Collector)垃圾收集器,是可以由系统自动调用的垃圾释放功能,或者使用Runtime类中的gc()手工调用。

    问题:请解释Comparable和Comparator的区别?
     1)java.lang.Comparable是在类定义的时候实现的父接口,主要用于定义排序规则,里面只有一个compareTo()方法;
     2)java.util.Comparator是用来挽救的比较器操作,需要设置单独的比较器规则类实现排序,里面有一个compare()方法;

    问题:请编写单例设计模式
      直接编写一个饿汉式的单例设计模式,并且实现构造方法私有化;

    问题:在Java中哪里使用到了单例设计模式?
      Runtime类、Pattern类等等;

    问题:懒汉式单例模式的问题
      单例设计模式的最大特点是在整体的运行程序中只允许产生一个实例化对象,但当有了若干个线程之后,实际上当前的程序就会产生多个实例化对象了,此时就不是单例设计模式了。此时问题造成的关键在于代码本身出现了不同步的情况,而要想解决的关键核心就在于需要使用synchronized关键字进行同步处理。

    问题:请问ArrayList与LinkedList有什么区别?
     1)ArrayList是数组实现的集合操作,而LinkedList是链表实现的集合操作;
     2)在使用List集合中的get()方法根据索引获取数据时,ArrayList的时间复杂度为“O(1)”、而LinkedList时间复杂度为“O(n)”(n为集合的长度);
     3)ArrayList在使用时默认的初始化对象数组的大小长度为0,如果空间不足则会采用1.5倍形式进行容量的扩充,如果保存大数据量时可能会造成垃圾数组空间的产生以及性能的下降,这时候可以使用LinkedList类保存。

    问题:请解释Collection.remove()与Iterator.remove()的区别?
     在进行迭代输出时,如果使用了Collection.remove()则会造成并发更新的异常,导致程序删除出错,而此时只能够利用Iterator接口中remove()方法实现正常的删除处理。

    问题:在进行HashMap的put()操作时,是如何实现容量扩充的?
     1)在HashMap类中提供了一个“DEFAULT_INITIAL_CAPACITY=16”常量,作为初始化的容量配置,而后这个常量的默认大小为16个元素,也就是说默认的可以保存的最大内容时16;
     2)当保存的内容的容量超过了一个阈值(DEFAULT_LOAD_FACTOR=0.75f),相当于“容量*阈值=12”保存12个元素时就会进行容量的扩充;
     3)在进行扩充时HashMap采用的是成倍的扩充模式,即:每一次都扩充两倍的容量。

    问题:请解释HashMap的工作原理(JDK1.8+)
     1)在HashMap中进行数据存储的是利用Node类完成的。(能使用的数据结构只有两种:链表(时间复杂度“O(n)”)、二叉树(时间复杂度“O(logn)”);)
     2)从JDK1.8开始,HashMap的实现出现了改变,因为其要适应于大数据时代的数据问题,所以对其存储发生了变化,并且在HashMap类的内部提供了一个常量:static final int TREEIFY_THRESHOLD = 8;,在使用HashMap进行数据保存时,如果保存的数据没有超过阈值8(TREEIFY_THRESHOLD),那么会按照链表的形式进行存储,如果超过了阈值,则会将链表转为红黑树以实现树的平衡,并且利用左旋和右旋保证数据的查询性能。

    问题:请解释HashMap与HashTable的区别?
     1)HashMap中的方法都属于异步操作,非线程安全,HashMap允许保存key或者value为null的数据;
     2)HashTable都属于同步方法(线程安全),HashTable不允许key或者value为null;

    问题:如果HashMap在进行数据操作的时候出现了hash冲突(hash码相同),HashMap是如何解决的?
     当hash冲突之后为了保证程序的正常执行,会在冲突的位置上将所有Hash冲突的内容转为链表保存。

    问题:请解释Collection与Collections的区别?
     1)Collection是集合的接口,允许保存单值对象。
     2)Collections是集合操作的工具类。

    问题:说一下对类集
     类集是Java实现的数据结构应用,如果单从类集的使用上来说,类集非常简单,因为类集的核心接口:List、Set、Map、Iterator、Enumeration。
     1)List子接口:是可以根据索引号取得内容;
     2)Set子接口:排序子类、HashSet与hashCode()和equals()的关系;
      - HashSet:重复判断依靠的是hashCode()和equals(),但是它是无序的;
      - TreeSet:是有序的,依靠的是Comparable排序;
      - LinkedHashSet:继承了HashSet的特点,但是属于有序(增加顺序为保存顺序)
     3)Map子接口:Map.Entry、Iterator、HashMap、WeakHashMap(弱引用);

    问题:字符串hash相等,equals相等吗?反过来呢?
     一般来说,字符串的hashCode()相同,那么equals一定相同,反过来说如果equals()相同,hashCode()也是相同的。

    问题:Spring工作原理,控制反转如何实现的?自己写过滤器过滤编码怎么实现?
     1)Spring核心组成:IOC&DI(工厂设计)与AOP(代理设计、动态代理设计)
      - Spring中针对于XML的解析处理采用的是DOM4J实现的。>  - Annotation必须要求有一个容器;
     2)对于编码过滤需要考虑两种情况:
      - Struts1.x、SpringMVC、JSP+Servlet:都可以直接通过过滤器完成;
      - Struts2.x:必须通过拦截器完成;
      - 实现:考虑到可扩展性的配置,所以在配置文件中设置编码,在程序运行时动态获取设置的编码进行操作,但是需要设置两个操作:请求编码、响应编码;

    问题:框架的源码有没有看过
    不要回答“没有”,即使真没看过,也别回答没有
     框架的核心思想:反射+XML(Annotation):
      - Struts2.x:请求交由过滤器执行,而后过滤器交给控制器完成(Action),后面由于将所有的跳转路径等信息都写在了配置文件或者Annotation中,所以还需要进行这部分内容的加载;
      - SpringMVC:它是基于方法的请求处理,所有的参数都提交到方法上,本质上还是一个DispatcherServlet;
      - Hibernate:就是反射和DOM4J解析处理流程;
    除了Struts2.x,其他的开发框架源代码操作就是所有请求交给Servlet中的doGet和doPost,经过反射做分发,分发之后跳转到各自的目标页面,成功处理一次操作。

    问题:动态代理是怎么实现的
     1)直接使用InvocationHandler接口进行实现,同时利用Proxy类设置动态请求对象;
     2)使用CGLIB来避免对于“代理设计模式需要使用接口实现的限制”;

    问题:action是单实例还是多实例
     1)Struts2.x和SpringMVC中的Action都可以是多实例的,SpringMVC默认是单例的;
     2)Struts1.x中的Action是单实例的;
     3)Struts2.x和SpringMVC的是否单实例可以控制,只要交由Spring管理Action类,都可以通过“@Scope="prototype(多实例)、singleton(单例)"”来进行控制

    问题:怎么配置bean
     1)在Spring中,重点由xml和Annotation的扫描负责:
      -xml中直接使用“<bean>”,这样在Spring容器启动的时候就可以通过容器进行初始化;
      -Annotation必须设置context命名空间,而后进行扫描包的配置

    问题:修改单实例多实例
     通过“@Scope="prototype(多实例)、singleton(单例)"”来进行控制

    问题:JAVA的设计模式
     工厂设计模式、代理设计模式、单例设计模式(Runtime)、合成设计模式、门面设计模式(JDBC)、装饰设计模式(PrintWriter)、模板设计模式(Servlet)

    问题:事务的控制
     1)MySQL数据库如果想要使用事务,必须使用innodb这个数据引擎;
     2)事务的核心控制:commit、rollback;
     3)在Spring中,利用AspectJ可以设置AOP切面,而后进行声明式事务控制。

    问题:脏读、幻读、不可重复读
     1)脏读:脏读就是指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也在访问这个数据,然后使用了这个数据。
     2)不可重复读:是指在一个事务内,多次读同一数据。在这个事务还没有结束时,另外一个事务也访问该同一数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改,那么第一个事务读到的数据可能是不一样的,这样就发生了在一个事务内两次读到的数据时不一样的,因此称为不可以重复读。
     3)幻读:是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行,同时,第二个事务向表中插入一行新数据,那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好像发生了幻觉一般。

    问题:Spring事务的传播属性


    Spring事务的传播属性

    问题:购物车是如何实现的
    购物车的实现可以基于:
     1)Session:浏览器关闭后失效
     2)Cookie:数据保存到本地,如果清空本地Cookie或者切换别的浏览器则失效
     3)数据库:可以在不同的终端上持续操作
    实现:Ajax处理操作,处理购物车的应用,考虑到用户很多的情况下,并且访问量频繁,则需要单独设计一个购物车的子系统模块。

    问题:统计一天的订单量
     1)如果一天的订单量预估在1万条,统计查询上没有什么要求;
     2)如果一天订单量几百几千万条,绝对不可以使用count()和where,可以采用分时统计,如果系统设计到位,可以单独配置一个文件进行计数(需要考虑同步,一同步就会慢),不应该出现在抢购或者秒杀环节中。

    问题:IN、HAVING、EXSIT
     1)IN:是判断具体的几项数据;
     2)HAVING:是针对于分组后的数据的筛选,依然要使用统计函数处理;
     3)EXSIT:只是需要判断子查询中是否有数据。

    问题:有没有用过定时任务
     Java本身提供有定时任务:TimerTask、Timer,但是此类操作对于定时很难完成,它只能做频率,但是这个频率不准,所以在定时开发中一般使用quartz组件,且Spring中也提供有定时实现,这个实现的好处是可以在准确的时间上进行触发;

    问题:JVM内存管理
    内存分为:栈(JAVA虚拟机栈)、堆、程序计数器(类似于寄存器)、方法区、本地方法栈;
    所谓的垃圾处理操作指的是堆内存:年轻代、老年代、永生代(JDK1.8后移除)。会直接牵扯到JVM内存的调优问题。

    问题:堆内存、栈内存溢出
    栈溢出:栈帧,所有的方法调用都是通过栈帧的形式控制的。栈如果保存的数据过多,那么就会产生栈内存溢出。如果在堆内存中产生的数据里过大,那么就有可能造成堆内存溢出“OutOfMemoryError”错误。

    问题:说一下缓存
    缓存的主要目的是提高查询的效率,常见的两种缓存组件:EhCache(数据库)、OSCache(页面),除了这样的操作之外,还有缓存数据库redis、memcached,其中redis可以将数据保存在磁盘上,并且支持的数据类型要多于memcached。这种redis的数据库每秒并发的访问量可以达到15万次。

    问题:统计所有的重名用户
    还是需要考虑数据量问题 ,如果数据量大,考虑使用位图索引,如果数据量小,直接分组统计即可。

    问题:使用InputStream用什么方法?
    共三个方法:
    1、public abstract int read() throws IOException
    2、public int read(byte[] b) throws IOException
    3、public int read(byte[] b, int off,int len) throws IOException

    问题:在JQuery中如何绑定一个事件
    on('click',function)

    问题:在JQuery中使用的Ajax函数有哪些?
    .post()、.get()、.ajax()、jsonp()

    问题:在Spring中控制层的方法返回值是什么?
    String、ModelAndView

    问题:简单描述一下WebService是什么?
    Web服务调用,结合WSDL与SOAP形成远程方法调用;现在的实现有两种:CXF、Jersey。

    问题:描述一下什么叫RPC?
    RPC是一个远程过程调用,实际上WebService就是RPC的一种实现机制,只不过RPC是最原始的概念。

    问题:Spring的自动注入注解有哪些?
    @Comment、@Service、@Repository、@Controller

    相关文章

      网友评论

        本文标题:java面试题

        本文链接:https://www.haomeiwen.com/subject/orjulctx.html