java工程师面试题(一)

来源:互联网 发布:win10如何美化成mac 编辑:程序博客网 时间:2024/06/05 01:11
一、jdk版本的区别
1、jdk1.5
(1)自动装箱和拆箱 基本数据类型和引用类型的自动转换
(2)枚举enmu
(3)静态导入 import static
(4)可变参数  int...args  方法中的最后一个参数,参数类型和参数名之间空格可有可无,数组遍历
(5)泛型
(6)内省 Introspector,PropertyDescriptor
(7)For-Each循环
(8)注释Annotation @Override,@Deprecated,@SuppressWarnings


2、jdk1.6
(1)AWT增加两个类  Desktop(可以打开默认浏览器浏览指定的url等),SystemTray
(2)JAXB2 实现对象与XML之间的映射
(3)StAX 利用拉模式解析XML
(4)Compiler API 动态编译java源文件
(5)Console开发控制台程序
(6)Common Annotation


3、jdk1.7
(1)集合可以直接采用[]{}存入对象,[]通过索引或键值获取对象
(2)switch支持字符串
(3)数字可以用_分隔
(4)try{}catch{}多个异常用|分隔
(5)try()内部定义使用的资源
(6)支持二进制文字


4、jdk1.8
(1)Lambda表达式 ->
(2)接口有默认非抽象方法 default关键字
(3)多重注解
(4):: 关键字




二、Hashtable
1、Hashtable 与 HashMap的区别
(1)Hashtable 继承 Dictionary类,HashMap继承AbstractMap
(2)Hashtable 线程安全 方法synchronized,HashMap非线程安全
(3)HashMap允许键值为null,Hashtable不允许


2、HashMap的工作原理


(1)HashMap是基于hashing的原理,我们使用put(key, value)存储对象到HashMap中,使用get(key)从HashMap中获取对象。当我们给put()方法传递键和值时,我们先对键调用hashCode()方法,返回的hashCode用于找到bucket位置来储存Entry对象,HashMap是在bucket     中储存键对象和值对象,作为Map.Entry。
(2)“当两个对象的hashcode相同会发生什么?” 因为hashcode相同,所以它们的bucket位置相同,‘碰撞’会发生。因为HashMap使用链表存储对象,这个Entry(包含有键值对的Map.Entry对象)会存储在链表中。
(3)“如果两个键的hashcode相同,你如何获取值对象?” 当我们调用get()方法,HashMap会使用键对象的hashcode找到bucket位置,将会遍历链表,调用keys.equals()方法去找到链表中正确的节点,最终找到要找的值对象


三、final关键字 


1、final成员变量必须在声明的时候初始化或者在构造器中初始化,否则就会报编译错误。一旦初始化,不能被更改
2、在匿名类中所有变量都必须是final变量。
3、final方法不能被重写,可以重载
4、final类不能被继承。
5、final关键字不同于finally关键字,后者用于异常处理。
6、final关键字容易与finalize()方法搞混,后者是在Object类中定义的方法,是在垃圾回收之前被JVM调用的方法。
7、接口中声明的所有变量本身是final的。
8、final和abstract这两个关键字是反相关的,final类就不可能是abstract的。
9、按照Java代码惯例,final变量就是常量,而且通常常量名要大写:
    private final int COUNT = 10;
10、对于集合对象声明为final指的是引用不能被更改,但是你可以向其中增加,删除或者改变内容。譬如:
    private final List loans = new ArrayList();
    loans.add(“home loan”);  //valid
    Loans.add("personal loan"); //valid
    loans= new Vector();  //not valid


四、抽象类和接口的区别


1、抽象类和接口都不能直接实例化,如果要实例化,抽象类变量必须指向实现所有抽象方法的子类对象,接口变量必须指向实现所有接口方法的类对象。
2、抽象类要被子类继承,接口要被类实现。
3、接口只能做方法申明,抽象类中可以做方法申明,也可以做方法实现
4、接口里定义的变量只能是公共的静态的常量,抽象类中的变量是普通变量。
5、抽象类里的抽象方法必须全部被子类所实现,如果子类不能全部实现父类抽象方法,那么该子类只能是抽象类。同样,一个实现接口的时候,如不能全部实现接口方法,那么该类也只能为抽象类。
6、抽象方法只能申明,不能实现。abstract void abc();不能写成abstract void abc(){}。
7、抽象类里可以没有抽象方法
8、如果一个类里有抽象方法,那么这个类只能是抽象类
9、抽象方法要被实现,所以不能是静态的,也不能是私有的。
10、接口可继承接口,并可多继承接口,但类只能单根继承。




四、SpringMVC
1、SpringMVC工作流程
 ①:DispatcherServlet是springmvc中的前端控制器(front controller),负责接收request并将request转发给对应的处理组件.
 ②:HanlerMapping是springmvc中完成url到controller映射的组件.DispatcherServlet接收request,然后从HandlerMapping查找处理request的controller.
 ③:Cntroller处理request,并返回ModelAndView对象,Controller是springmvc中负责处理request的组件(类似于struts2中的Action),ModelAndView是封装结果视图的组件.
  ④ ⑤ ⑥:视图解析器(ViewResolver)解析ModelAndView对象并返回对应的视图(view)给客户端


2、SpringMVC工作机制
(1)在容器初始化时,springmvc会遍历容器中的bean,获取每一个controller中的所有方法访问的url,然后将url和controller保存到一个Map中;
(2)拼接controller的url(controller上@RequestMapping的值)和方法的url(method上@RequestMapping的值),与request的url进行匹配,找到匹配的那个方法
(3)参数绑定① 通过注解进行绑定,@RequestParam 
             ② 通过参数名称进行绑定.Java反射只提供了获取方法的参数的类型,并没有提供获取参数名称的方法.springmvc解决这个问题的方法是用asm框架读取字节码文件


五、Redis,Memcached的区别
(1)Redis只使用单核,Memcached可以使用多核,Redis在存储小数据时比Memcached性能更高;存储大数据时,Memcached性能要高于Redis
(2)Memcached支持简单的K/V类型的数据,而Redis支持多种数据结构的存储如String,List,Set,Hash,Sorted Set
(3)Memcached将数据全部存在内存中,断电后会挂掉;Redis支持数据的持久化以及主从复制






六、JVM结构,GC工作机制


1、JVM结构 
   JVM包含四个部分:类加载器,执行引擎,内存区,本地方法接口。
  (1)类加载器:在JVM启动时或者在类运行时将需要的class加载到JVM中
  (2)执行引擎:负责执行class文件中包含的字节码指令
  (3)内存区:包含5个区域,1.方法区(Method Area) 2.java堆(Heap) 3.java栈(Stack)4.程序计数器(PC Register)5.本地方法栈
       1.方法区:用于存储类结构信息的地方,包括常量池,静态变量,构造函数等
       2.Heap:存储java实例或者对象的地方  (方法区和堆是被所有线程共享的)
       3.Stack:总是和线程关联到一起,每当创建一个线程时,JVM就会为这个线程创建一个对应的java栈
       4.PC Register:用于保存当前线程执行的内存地址。由于JVM程序是多线程执行的(线程轮流切换),所以为了保证线程切换回来后,还能恢复到原先状态,就需要一个独立的计数器,记录之前中断的地方,可见程序计数器也是线程私有的。
       5.本地方法栈
  (4)本地方法接口:主要是调用C实现的本地方法及返回结果
2、GC工作机制
   java内存:静态内存(Stack,PC Register,本地方法栈中),动态内存(Method Area,Heap)
  (1)检测垃圾方法 1.引用计数法 2.可达性分析算法
  (2)回收算法 1.标记-清除   标记所有需要回收的对象,然后统一回收;会产生大量碎片
                2.复制        此算法把内存空间划为两个相等的区域,每次只使用其中一个区域。垃圾回收时,遍历当前使用区域,把正在使用中的对象复制到另外一个区域中;需要两倍内存空间
                3.标记-整理   第一阶段从根节点开始标记所有被引用对象,第二阶段遍历整个堆,把清除未标记对象并且把存活对象“压缩”到堆的其中一块,按顺序排放
                4.分代收集算法 (年轻代,年考代,持久代)






 



 
 







原创粉丝点击