码迷,mamicode.com
首页 > 编程语言 > 详细

面试的java题目

时间:2019-01-05 16:32:34      阅读:166      评论:0      收藏:0      [点我收藏+]

标签:实现原理   框架   基础   加载   nbsp   eth   code   超过   内容   

1.哈希表有哪些实现类,哈希表原理是什么?

实现的类:HashMap  HashTable等

HashMap的实现原理:

  1. 利用key的hashCode重新hash计算出当前对象的元素在数组中的下标
  2. 存储时,如果出现hash值相同的key,此时有两种情况。(1)如果key相同,则覆盖原始值;(2)如果key不同(出现冲突),则将当前的key-value放入链表中
  3. 获取时,直接找到hash值对应的下标,在进一步判断key是否相同,从而找到对应值。
  4. 理解了以上过程就不难明白HashMap是如何解决hash冲突的问题,核心就是使用了数组的存储方式,然后将冲突的key的对象放入链表中,一旦发现冲突就在链表中做进一步的对比

 

 

2.String,StringBuffer与StringBuilder的区别

String:String的值是不可变的,这就导致每次对String的操作都会生成新的String对象,不仅效率低下,而且浪费大量优先的内存空间

StringBuffer :StringBuffer是可变类,和线程安全的在多线程操作字符串的类,任何对它指向的字符串的操作都不会产生新的对象。每个 StringBuffer对象都有一定的缓冲区容量,当字符串大小没有超过容量时,不会分配新的容量,当字符串大小超过容量时,会自动增加容量。

StringBuilder:StringBuilder可变类,速度快。线程不安全,在单线程下操作字符串。

 

3.反射原理及应用场景

 

反射机制是一种程序自我分析的能力。用于获取一个类的类变量,构造函数,方法,修饰符。

 

优点:运行期类型的判断,动态类加载,动态代理使用反射。

 

缺点:性能是一个问题,反射相当于一系列解释操作,通知jvm要做的事情,性能比直接的java代码要慢很多。

Class类是反射机制的起源,我们得到Class类对象有三种方法:

1.Class.forName()   2.Object.getClass()  3.类字面常量.class

 

应用场景:

1)Java的反射机制在做基础框架的时候非常有用,有一句话这么说来着:反射机制是很多Java框架的基石。而一般应用层面很少用,不过这种东西,现在很多开源框架基本都已经给你封装好了,自己基本用不着写。典型的除了Hibernate之外,还有Spring也用到很多反射机制。经典的就是在xml文件或者properties里面写好了配置,然后在Java类里面解析xml或properties里面的内容,得到一个字符串,然后用反射机制,根据这个字符串获得某个类的Class实例,这样就可以动态配置一些东西,不用每一次都要在代码里面去new或者做其他的事情,以后要改的话直接改配置文件,代码维护起来就很方便了,同时有时候要适应某些需求,Java类里面不一定能直接调用另外的方法,这时候也可以通过反射机制来实现。
总的来说,自己写的很少,具体什么时候要用那要看需求,反射机制无非就是根据一个String来得到你要的实体对象,然后调用它原来的东西。但是如果是要自己写框架的话,那就会用得比较多了。

2)当你做一个软件可以安装插件的功能,你连插件的类型名称都不知道,你怎么实例化这个对象呢?因为程序是支持插件的(第三方的),在开发的时候并不知道 。所以无法在代码中 New出来 ,但反射可以,通过反射,动态加载程序集,然后读出类,检查标记之后再实例化对象,就可以获得正确的类实例。

3)在编码阶段不知道那个类名,要在运行期从配置文件读取类名, 这时候就没有办法硬编码new ClassName(),而必须用到反射才能创建这个对象.反射的目的就是为了扩展未知的应用。比如你写了一个程序,这个程序定义了一些接口,只要实现了这些接口的dll都可以作为插件来插入到这个程序中。那么怎么实现呢?就可以通过反射来实现。就是把dll加载进内存,然后通过反射的方式来调用dll中的方法。很多工厂模式就是使用的反射。 
(额外提升:https://www.cnblogs.com/AaronCui/p/4911123.html)

 

 

4.线程池的应用

一、线程池使用场景

?单个任务处理时间短

?将需处理的任务数量大

二、使用Java线程池好处

1、使用new Thread()创建线程的弊端:

?每次通过new Thread()创建对象性能不佳。

?线程缺乏统一管理,可能无限制新建线程,相互之间竞争,及可能占用过多系统资源导致死机或oom。

?缺乏更多功能,如定时执行、定期执行、线程中断。

2、使用Java线程池的好处:

?重用存在的线程,减少对象创建、消亡的开销,提升性能。

?可有效控制最大并发线程数,提高系统资源的使用率,同时避免过多资源竞争,避免堵塞。

?提供定时执行、定期执行、单线程、并发数控制等功能。

 

三 Java通过Executors提供四种线程池,分别为:

newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。
newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。

 

面试的java题目

标签:实现原理   框架   基础   加载   nbsp   eth   code   超过   内容   

原文地址:https://www.cnblogs.com/chenshuyong/p/10224738.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!