Java底层基础题
一、Java底层基础题
1、SpringMVC的原理以及返回数据如何渲染到jsp/html上?
答:Spring MVC的核心就是DispatcherServlet , 一个请求经过DispatcherServlet ,转发给HandlerMapping ,然后经反射,对应 Controller及其里面方法的@RequestMapping地址,最后经ModelAndView和ViewResoler返回给对应视图 。
2、一个类对象属性发生改变时,如何让调用者知道?
答:Java event时间监听 ,即在set方法改变属性时,触发 ,这种模式也可以理解为观察者模式。
3、重写equals为何要重写hashCode?
答:判断两个对象是否相等,比较的就是其hashCode, 如果你重载了equals,比如说是基于对象的内容实现的,而保留hashCode的实现不变,那么很可能某两个对象明明是“相等”,而hashCode却不一样。 hashcode不一样,就无法认定两个对象相等了
4、谈谈你对JVM的理解?
答:Java语言的一个非常重要的特点就是与平台的无关性。而使用Java虚拟机是实现这一特点的关键。Java编译器只要面向JVM,生成JVM能理解的代码或字节码文件。Java源文件经编译成字节码程序,通过JVM将每一条指令翻译成不同平台机器码,通过特定平台运行。
JVM执行程序的过程 :I.加载。class文件 ,II.管理并分配内存 ,III.执行垃圾收集
JRE(java运行时环境)由JVM构造的java程序的运行环境

5、Mysql的事物隔离级别?
答:Mysql的事物隔离级别 其实跟 Spring的事物隔离级别一样,都是1、Read Uncommitted(读取未提交内容), 2、Read Committed(读取提交内容),3、Repeatable Read(可重读),4、Serializable(可串行化)。
6、Spring的原理
答:Spring的核心是IOC和AOP ,IOC是依赖注入和控制反转, 其注入方式可分为set注入、构造器注入、接口注入等等。IOC就是一个容器,负责实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。简单理解就是:JAVA每个业务逻辑处理至少需要两个或者以上的对象协作进行工作,但是每个对象在使用它的合作对象的时候,都需要频繁的new 对象来实现,你就会发现,对象间的耦合度高了。而IOC的思想是:Spring容器来管理这些,对象只需要处理本身业务关系就好了。至于什么是控制反转,就是获得依赖对象的方式反转了。
Spring提供了对AOP技术的良好封装, AOP称为面向切面编程,就是系统中有很多各不相干的类的方法,在这些众多方法中要加入某种系统功能的代码,例如,加入日志,加入权限判断,加入异常处理,这种应用称为AOP。实现AOP功能采用的是代理技术,客户端程序不再调用目标,而调用代理类,代理类与目标类对外具有相同的方法声明,有两种方式可以实现相同的方法声明,一是实现相同的接口,二是作为目标的子类在,JDK中采用Proxy类产生动态代理的方式为某个接口生成实现类,如果要为某个类生成子类,则可以用CGLI B。在生成的代理类的方法中加入系统功能和调用目标类的相应方法,系统功能的代理以Advice对象进行提供,显然要创建出代理对象,至少需要目标类和Advice类。spring提供了这种支持,只需要在spring配置文件中配置这两个元素即可实现代理和aop功能,例如,
<bean id=”proxy” type=”org.spring.framework.aop.ProxyBeanFactory”>
<property name=”target” ref=””></property>
<property name=”advisor” ref=””></property>
</bean>
7、谈谈你对NIO的理解
答:IO是面向流,NIO是面向缓冲 ,(Tomcat三种运行模式之一,还有bio、apr两种) 性能方面 bio<nio<apr.
8、ArrayList和LinkedList、Vector的区别?
答:总得来说可以理解为:.
1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。
2.对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。
3.对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据
Vector和ArrayList类似,但属于强同步类,即线程安全的。
9、随便说说几个单例模式,并选择一种线程安全的
答:单例的类别:懒汉、饿汉、枚举、静态内部类、双重校验锁 等等 , 选择线程安全我选最后一种,双重校验锁。
10、谈谈红黑树
答:算法和数据结构一直是我薄弱之处,这方面说自己补吧,成效不大。
11、举例说说几个排序,并说明其排序原理
答:这里我就不细说了。
12、Mysql索引的原理
答:
1. 什么是索引:我们拿出一本新华字典,它的目录实际上就是一种索引:非聚集索引。我们可以通过目录迅速定位我们要查的字。而字典的内容部分一般都是按照拼音排序的,这实际上又是一种索引:聚集索引。
2:用不用索引
索引至少会带来如下的overhead
额外的创建时间
额外的存储空间(单列索引占原表5%至15%空间,想象一下如果为一个表创建三四个索引)
额外的维护时间
这一切只为了一个目的:减少在small range query的情况下的query time。如果是大range query 返回1%以上的数据,这情况下索引的意义不大。
3. 用什么索引:
low selectivity情况下 比如parent column为性别,bitmap index什么的可以考虑
high selectivity可以用btree什么的来维持二分查找的查找效率
13、序列化的原理和作用
答:Serialization(序列化)是一种将对象以一连串的字节描述的过程;反序列化deserialization是一种将这些字节重建成一个对象的过程,主要用于HTTP或者WebService接口传输过程中对象参数的传播。
二、并发及项目调优
1、说说线程安全的几种实现方式?
答:什么是线程安全? 我的理解是这样的,一个对象被多个线程同时访问,还能保持其内部属性的顺序性及同步性,则认定为线程安全。实现线程安全的三种方式:被volatile、synchronized等关键字修饰,或者使用java.util.concurrent下面的类库。 至于前两者的关系。
答:我们知道异步其实就是让另一个线程去跑,那么如何创建线程? 第一种直接new Thread ,第二种new 一个实现Runnable接口的实现类。 第三种,通过线程池来管理创建等 ,这里说到更好的实现异步,那就是说我们在方法内部避免频繁的new 线程,就可以考虑线程池了。 那么线程池如何创建? 这里可以new 一个线程池,但是需要考虑单例,或者在程序初始启东时,就创建一个线程池,让他跑着,然后在具体方法的时候,通过线程池来创建线程,实现异步
3、项目中为何要用缓存?如何理解nginx + tomcat + redis 集群缓存?
答1:最直接的表现就是减轻数据库的压力。避免因为数据读取频繁或过大而影响数据库性能,降低程序宕机的可能性
答2:nginx常用做静态内容服务和代理服务器,直面外来请求转发给后面的应用服务。nginx本身也能做缓存,比如静态页面的缓存什么的。而tomcat是应用服务器,处理JAVA WEB程序功能等等 。你也可以这么理解,假设把用户的请求当做是一条河流,那么nginx就相当于一个水利工程,tomcat相当于一条条分流的支流,而redis 相当于支流旁边的一个个水库。 当你洪水来了,nginx根据你每条支流的承受力度分发不同的水流量,在确保程序正常运行的情况下,分发给每条支流(tomcat)不同的水流量。而redis相当于一个个支流的水库,存储水源,降低压力,让后面的水量平稳。
4、日常项目中,如果你接手,你准备从哪些方面调优?
答:这个呢首先是了解哪些需要优化,需要优化肯定是项目性能遭遇瓶颈或者猜测即将遭遇了,我们才会去考虑优化。那么怎么优化?
a、扩容 ,扩容的理解,就是扩充服务器并行处理的能力,简单来说就是加服务器,增加处理请求的能力,例如增加nginx 、tomcat等应用服务器的个数,或者物理服务器的个数,还有加大服务器带宽等等,这里考虑的是硬件方面
b、调优 ,调优,包括系统调优和代码调优 。 系统调优就是说加快处理速度,比如我们所提到的CDN、ehcache、redis等缓存技术,消息队列等等,加快服务间的响应速度,增加系统吞吐量,避免并发,至于代码调优,这些就需要多积累了,比如重构、工厂等, 数据库调优的话这个我不是很懂,只知道索引和存储过程。
5、谈谈你对分布式的理解
答:个人理解:分布式就是把一个系统/业务 拆分成多个子系统/子业务 去协同处理,这个过程就叫分布式。
6、Redis实现消息队列
答:Redis实现消息队列 、参考2
7、另总结多线程相关面试题50道
8、分享一个调优工具和方案:如何利用 JConsole观察分析Java程序的运行,进行排错调优
9、乐观锁和悲观锁的理解及如何实现,有哪些实现方式?
乐观锁,每次操作时不加锁而是假设没有冲突而去完成某项操作,如果因为冲突失败就重试,直到成功为止
悲观锁是会导致其它所有需要锁的线程挂起,等待持有锁的线程释放锁。
乐观锁可以使用volatile+CAS原语实现
悲观锁可以使用synchronize的以及Lock。
三、手写代码题(包含sql题)
1、假设商户表A(id , city ) ,交易流水表B (aid, amount , time) 这里的time代表交易时间, 请用sql写出查询每个城市每个月的销售业绩(答案可在评论里回复)
2、假设有一个数组 A ,int[] A = { 1 , 3 , -1 ,0 , 2 , 1 , -4 , 2 , 0 ,1 ... N}; 原来是需要查出大于0的数组,但是由于传参错误或者其他原因,导致查出0和负数了,现在要求在不使用新数组和新集合的情况下(即只使用这个A数组,因数组数据比较大,且只能用一次循环) 实现正数放到数组的前面,小于等于0的数放到数组的末尾(答案可在评论里回复)
总结:
暂时就先总结这些,后续再补充吧,面试题千变万化,不变的是知识点和技术根本。基础很重要,故不积跬步,无以至千里;不积小流,无以成江海。学好基础,把握好技术的原理,然后去实践,这样才能深入了解一门技术,学不可以已!
另外,面试过程中,保持自信,不会的咱大胆的说不会,没啥好丢脸的,不会不是说你真的不会,也许是忘了,也许是没注意到,记住面试题目,回来自己补充资料和相关的信息,相信你肯定会越来越从容,要记住不是为了面试而面试,而是为了未来的工作而面试,如果能一直保持这个状态,没有什么事情拿不下的。
拿我自己来说,很多不会,关键在于你愿不愿意去学,愿不愿意去付诸行动。
Java底层基础题的更多相关文章
- java面试基础题(三)
		
程序员面试之九阴真经 谈谈final, finally, finalize的区别: final:::修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承.因此 ...
 - java面试基础题------》Java 中的父子类静态代码块,代码块,构造方法执行顺序
		
4.指出下面程序的运行结果. class A { static { System.out.print("1"); } public A() { System.out.print(& ...
 - java面试基础题------》抽象类和接口有什么异同
		
划重点!!!! 1.抽象类(abstract class)和接口(interface)有什么异同? 相同点 * 都不能被直接实例化,都可以通过继承实现其抽象方法. * 都是面向抽象编程的技术基础,实现 ...
 - java面试基础题------》Java 中List、Set、Map异同点
		
借鉴地址:http://blog.csdn.net/speedme/article/details/22398395 几句喜欢的话,拷贝下来: 世间上本来没有集合,(只有数组参考C语言)但有人想要,所 ...
 - java面试基础题------》Java 中的final关键字有哪些用法
		
(1)修饰类:表示该类不能被继承: (2)修饰方法:表示方法不能被重写: (3)修饰变量:表示变量只能一次赋值以后值不能被修改(常量).
 - java面试基础题------》int Integer Integer.valueOf
		
在jdk1.5的环境下,有如下4条语句: 1 2 3 4 Integer i01 = 59; int i02 = 59; Integer i03 =Integer.valueOf(59); Integ ...
 - java面试题及答案(基础题122道,代码题19道)
		
JAVA相关基础知识 1.面向对象的特征有哪些方面 1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象并不打算了解全部问题,而只是选择其中的一部分, ...
 - Java面试题以及答案精选(架构师面试题)-基础题1
		
基础题 一.String,StringBuffer, StringBuilder 的区别是什么?String为什么是不可变的?1. String是字符串常量,StringBuffer和StringBu ...
 - 四道java语言练习基础题:
		
一.==符的使 首先看一段比较有意思的代码 Integer a = 1000,b=1000; Integer c = 100,d=100; public void mRun(final String ...
 
随机推荐
- Python中输出字体的颜色设置
			
1.实现过程 终端的字符颜色是用转义序列控制的,是文本模式下的系统显示功能,和具体的语言无关.控制字符颜色的转义序列是以ESC开头,即用\033来完成 2.书写过程 开头部分: \033[显示方式;前 ...
 - NET Core中使用Dapper操作Oracle存储过程
			
.NET Core中使用Dapper操作Oracle存储过程最佳实践 为什么说是最佳实践呢?因为在实际开发中踩坑了,而且发现网上大多数文章给出的解决方法都不能很好地解决问题.尤其是在获取类型为Or ...
 - 运行node提示:events.js:160  throw er; // Unhandled 'error' event
			
运行node时遇到下述提示: events.js:160 throw er; // Unhandled 'error' event或者events.js:160 throw er; // ...
 - [HNOI 2012]三角形覆盖问题
			
Description 二维平面中,给定 N个等腰直角三角形(每个三角形的两条直角边分别 平行于坐标轴,斜边从左上到右下).我们用三个非负整数( x, y, d)来描 述这样一个三角形 ...
 - MVC FileResult
			
你如何将文件传送给用户取决于你最开始如何存储它,如果你将文件存入数据库,你会用流的方式将文件返还给用户,如果你将文件存在硬盘中,你只需要提供一个超链接即可,或者也可以以流的方式.每当你需要以流的方式将 ...
 - 第12届D2前端技术论坛
			
第12届D2前端技术论坛 最近参加了阿里的D2前端技术论坛,听了一天的报告,收获良多,下面对几场报告做一个记录. 自己选择听的主线也是从: 实践应用 -> 管理 -> 性能 -> 新 ...
 - JS将人民币小写金额转换为大写
			
/** 数字金额大写转换(可以处理整数,小数,负数) */ function smalltoBIG(n) { var fraction = ['角', '分']; var digit = ['零', ...
 - ZR#330. 【18 提高 3】矿石(容斥)
			
题意 题目链接 Sol 挺显然的,首先对每个矿排序 那么答案就是$2^x - 2^y$ $x$表示能覆盖到它的区间,$y$表示的是能覆盖到它且覆盖到上一个的区间 第一个可以差分维护 第二个直接vect ...
 - Vuforia切换回识别场景后黑屏解决
			
使用Vuforia SDK开发时,如果从其他非识别场景切换回识别场景,可能会出现黑屏问题. 解决方法是在切换到其他场景时,先将当前场景的Tracker信息全部Stop.代码如下: IEnumerato ...
 - 【LeetCode】2.Add Two Numbers 链表数相加
			
题目: You are given two linked lists representing two non-negative numbers. The digits are stored in r ...