2018年面试题大全
JAVA 基础知识什么是 Java 虚拟机?为什么 Java 被称作是 “ 平台无关的编程语言 ” ? Java 虚拟机是一个可以执行 Java 字节码的虚拟机进程。 Java 源文件被编译成能被 Java 虚拟机执行的字节码文件。 Java 被设计成允许应用程序可以运行在任意的平台,而不需要程序员为每一个平台单独重写或者是重新编译。 Java 被设计成...
JAVA 基础知识
什么是 Java 虚拟机?为什么 Java 被称作是 “ 平台无关的编程语言 ” ?
Java 虚拟机是一个可以执行 Java 字节码的虚拟机进程。 Java 源文件被编译成能被 Java 虚拟机执行的字节码文件。
Java 被设计成允许应用程序可以运行在任意的平台,而不需要程序员为每一个平台单独重写或者是重新编译。
Java 被设计成允许应用程序可以运行在任意的平台,而不需要程序员为每一个平台单独重写或者是重新编译。
Java 虚拟机让这个变为可能,因为它知道底层硬件平台的指令长度和其他特性。
简述JAVA类加载机制?
虚拟机把描述类的数据从 Class 文件加载到内存,并对数据进行校验,解析和初始化,最终形成可以被虚拟机直接使用的 java 类型。
Java中常用的类,包,接口,请各举5个
常用类:java.lang.Object、java.lang.String、java.lang.StringBuffer、java.lang.Math、java.lang.System,java.util.Vector,java.util.Date,java.text.DecimalFormate
常用包:java.lang,java.io,java.util,java.util.zip,java.net (java.lang.reflect,java.awt.image,java.wat.peer ,java.aplet , java.corba,java.corba.orb,java..awt.datatransfer,java.awt,java.awt.event,java.sql)
常用接口:Comparable ,Collection,set,Map,List,Runnable
请说一下final,finally和finalize的区别?
final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。
finally是异常处理语句结构的一部分,表示总是执行。
finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等
数组有没有length()方法,String有没有length属性?
数组有length属性,String有length方法
String s = new String("xyz"),创建了几个对象。
创建了两个对象,一个是静态区的。
”static”关键字是什么意思?Java中是否可以覆盖一个private或者是static的方法?
如果一个类的变量或者方法前面有static修饰,那么表明这个方法或者变量属于这个类,也就是说可以在不创建对象的情况下直接使用
当父类的方法被private修饰时,表明该方法为父类私有,对其他任何类都是不可见的,因此如果子类定了一个与父类一样的方法,这对于子类来说相当于是一个新的私有方法,且如果要进行向上转型,然后去调用该“覆盖方法”,会产生编译错误
class Parent { private fun() { ... } } class Child extends Parent { private fun() { ... } } class Test { public static void main(String[] args) { Parent c = new Child(); c.fun(); //编译出错 } }
static方法时编译时静态绑定的,属于类,而覆盖是运行时动态绑定的(动态绑定的多态),因此不能覆盖.
Java支持的基本数据类型有哪些?
java支持的基本数据类型有以下9种:byte,shot,int,long,float,double,char,boolean,void.
自动拆装箱是java从jdk1.5引用,目的是将原始类型自动的装换为相对应的对象,也可以逆向进行,即拆箱。这也体现java中一切皆对象的宗旨。
所谓自动装箱就是将原始类型自动的转换为对应的对象,而拆箱就是将对象类型转换为基本类型。java中的自动拆装箱通常发生在变量赋值的过程中,如:
Integer object = 3; //自动装箱 int o = object; //拆箱
在java中,应该注意自动拆装箱,因为有时可能因为java自动装箱机制,而导致创建了许多对象,对于内存小的平台会造成压力。
Math.round(11.5) 等于多少? Math.round(-11.5)等于多少?
Math.round(11.5)==12 Math.round(-11.5)==-11 round 方法返回与参数 最接近的长整数,参数加 1/2 后求其 floor.
String, StringBuffer StringBuilder的区别。
String 的长度是不可变的;
StringBuffer的长度是可变的,如果你对字符串中的内容经常进行操作,特别是内容要修改时,那么使用 StringBuffer,如果最后需要 >String,那么使用 StringBuffer 的 toString() 方法;线程安全;
StringBuilder 是从 JDK 5 开始,为StringBuffer该类补充了一个单个线程使用的等价类;通常应该优先使用 StringBuilder 类,因>为它支持所有相同的操作,但由于它不执行同步,所以速度更快。
使用字符串的时候要特别小心,如果对一个字符串要经常改变的话,就一定不要用String,否则会创建许多无用的对象出来.
来看一下比较
String s = "hello"+"world"+"i love you";
StringBuffer Sb = new StringBuilder("hello").append("world").append("i love you");
这个时候s有多个字符串进行拼接,按理来说会有多个对象产生,但是jvm会对此进行一个优化,也就是说只创建了一个对象,此时它的执行速度要比StringBuffer拼接快.再看下面这个:
String s2 = "hello";
String s3 = "world";
String s4 = "i love you";
String s1 = s2 + s3 + s4
上面这种情况,就会多创建出来三个对象,造成了内存空间的浪费
equals()和hashCode()区别?
-
equals()相等的两个对象,hashcode()一定相等,equals()不相等的两个对象,却并不能证明他们的hashcode()不相等。换句话说,equals()方法不相等的两个对象,hashCode()有可能相等。(我的理解是由于哈希码在生成的时候产生冲突造成的)
-
反过来:hashcode()不等,一定能推出equals()也不等;hashcode()相等,equals()可能相等,也可能不等。在object类中,hashcode()方法是本地方法,返回的是对象的地址值,而object类中的equals()方法比较的也是两个对象的地址值,如果equals()相等,说明两个对象地址值也相等,当然hashcode() 也就相等了;
什么时候该使用什么样的集合
Collection
我们需要保存若干个对象的时候使用集合。
List
如果我们需要保留存储顺序, 并且保留重复元素, 使用List.
如果查询较多, 那么使用ArrayList
如果存取较多, 那么使用LinkedList
如果需要线程安全, 那么使用Vector
Set
如果我们不需要保留存储顺序, 并且需要去掉重复元素, 使用Set.
如果我们需要将元素排序, 那么使用TreeSet
如果我们不需要排序, 使用HashSet, HashSet比
TreeSet效率高.
如果我们需要保留存储顺序, 又要过滤重复元素, 那么使用LinkedHashSet
Array 和 ArrayList 有何区别?什么时候更适合用 Array ?
1. Array 可以容纳基本类型和对象,而 ArrayList 只能容纳对象。
2. Array 是指定大小的,而 ArrayList 大小是固定的
ArrayList 和LinkedList 的优缺点
ArrayList是基于数组实现的,而LinkedList是基于链表实现的;如果应用需要快速访问数据,很少或不插入和删除元素,就应该用数组,也就是ArrayList;如果应用需要经常插入和删除元素你就需要用链表数据结构了,也就是LinkedList。
HashMap的工作原理
一,存储方式: Java中的HashMap是以键值对(key-value)的形式存储元素的。
二,调用原理: HashMap需要一个hash函数,它使用hashCode()和equals()方法来向集合/从集合添加和检索元素。当调用put()方法的时候,HashMap会计算key的hash值,然后把键值对存储在集合中合适的索引上。如果key已经存在了,value会被更新成新值。
三,其他热性: HashMap的一些重要的特性是它的容量(capacity),负载因子(load factor)和扩容极限(threshold resizing)。
HashMap和HashTable的区别
HashMap是非线程同步的,HashTable是线程同步的。
HashMap允许null作为键或者值,HashTable不允许
HashTable中有个一个contains方法,HashMap去掉了此方法效率上来讲,HashMap因为是非线程安全的,因此效率比HashTable高
set接口特点如下:
- 不允许出现重复元素;
- 集合中的元素位置无顺序;
- 有且只有一个值为null的元素。因为java中的set接口模仿了数学上的set抽象,所以,对应的数学上set的特性为:
- 互异性:一个集合中,任何两个元素都认为是不相同的,即每个元素只能出现一次。
- 无序性:一个集合中,每个元素的地位都是相同的,元素之间是无序的。集合上可以定义序关系,定义了序关系后,元素之间就可以按照序关系排序。但就集合本身的特性而言,元素之间没有必然的序。
- 空集的性质:空集是一切集合的子集。
override重写,overloadding重载
重写是子类重新定义了父类的方法,重写必有相同的方法名,参数列表和返回值类型。
重载是发生在同一个类里面的两个或多个方法名相同,但参数不同的情况
Iterator,ListIterator
Iterator可以遍历set和list集合,但是ListInterator只能用来遍历List
Itertator只能向前遍历,ListIterator既可以向前也可以向后,
ListIterator实现了Iterator接口。
线程相关:
关键字synchronized 、static、abstract、final
- synchronized:用于方法或代码块前,使此方法或者代码块编程同步的。
- static:用于声明静态变量,static关键字可以修饰变量,方法,静态代码块。
静态变量:由static修饰的变量称为静态变量
静态变量属于类,而不属于某个对象
静态变量它的副本只有一个(静态变量在类中只加载一)
静态方法: 在静态方法中只能调用静态变量和静态方法
在非静态方法中,可以调用静态方法或者变量。
在静态方法中不能使用this和super关键字。
静态代码块
作用:用来给静态成员变量初始化
- abstract:用于定义抽象类或者方法
- final:用于声明常量,即只能赋一次值
- volatile:用来确保将变量的跟新操作通知到其他线程,当把变量声明为volatile类型后,编译器与运行时都会注意到这个变量是共享的,因此不会将该变量上的操作与其他内存操作一起重排序。然而,在访问volatile变量时不会执行加锁操作,因此也就不会使执行线程阻塞,因此volatile变量是一种比 synchronized关键字更轻量级的同步机制。
- serialize:Java 对象序列化为二进制文件
JAVA中如何实现序列化以及实现序列化的意义
实现Serializable接口
意义:可以将硫化后的对象进行读写操作,也可用于网络之间对象传输,序列化是为了解决对象流读写坐 坐时引发的问题。
List 元素是有序的、可重复
ArrayList、Vector默认初始容量为10
Vector:线程安全,但速度慢
底层数据结构是数组结构
加载因子为1:即当 元素个数 超过 容量长度 时,进行扩容
扩容增量:原容量的 1倍
如 Vector的容量为10,一次扩容后是容量为20
ArrayList:线程不安全,查询速度快
底层数据结构是数组结构
扩容增量:原容量的 0.5倍+1
如 ArrayList的容量为10,一次扩容后是容量为16
Set(集) 元素无序的、不可重复。
HashSet:线程不安全,存取速度快
底层实现是一个HashMap(保存数据),实现Set接口
默认初始容量为16(为何是16,见下方对HashMap的描述)
加载因子为0.75:即当 元素个数 超过 容量长度的0.75倍 时,进行扩容
扩容增量:原容量的 1 倍
如 HashSet的容量为16,一次扩容后是容量为32
Map是一个双列集合
HashMap:默认初始容量为16
(为何是16:16是2^4,可以提高查询效率,另外,32=16<<1 -->至于详细的原因可另行分析,或分析源代码)
加载因子为0.75:即当 元素个数 超过 容量长度的0.75倍 时,进行扩容
扩容增量:原容量的 1 倍
如 HashSet的容量为16,一次扩容后是容量为32
SpringMVC的生命周期 (执行流程)
第一步:用户发起请求到前端控制器(DispatcherServlet)
第二步:前端控制器请求处理器映射器(HandlerMappering)去查找处理器(Handle):通过xml配置或者注解进行查找
第三步:找到以后处理器映射器(HandlerMappering)像前端控制器返回执行链(HandlerExecutionChain)
第四步:前端控制器(DispatcherServlet)调用处理器适配器(HandlerAdapter)去执行处理器(Handler)
第五步:处理器适配器去执行Handler
第六步:Handler执行完给处理器适配器返回ModelAndView
第七步:处理器适配器向前端控制器返回ModelAndView(ModelAndView是springmvc框架的一个底层对象,包括 Model和view)
第八步:前端控制器请求视图解析器(ViewResolver)去进行视图解析根据逻辑视图名解析成真正的视图(jsp)
第九步:视图解析器像前端控制器返回View
第十步:前端控制器对视图进行渲染视图渲染将模型数据(在ModelAndView对象中)填充到request域
第十一步:前端控制器向用户响应结果
Hibernate中提供了两级缓存,一级缓存是Session级别的缓存,它属于事务范围的缓存,该级缓存由hibernate管理,应用程序无需干预;二级缓存是SessionFactory级别的缓存,该级缓存可以进行配置和更改,并且可以动态加载和卸载,hibernate还为查询结果提供了一个查询缓存,它依赖于二级缓存;
Struts2是单列还是多列?
struts 2的Action是多实例的并非单例,也就是每次请求产生一个Action的对象。原因是:struts 2的Action中包含数据,例如你在页面填写的数据就会包含在Action的成员变量里面。如果Action是单实例的话,这些数据在多线程的环境下就会相互影响,例如造成别人填写的数据被你看到了。
而struts 1的Action是单实例的,因为它的数据保存在Form类中,多线程环境下,Action只负责处理一些逻辑,并没有数据,也就是大家把它当做一个工具使用。同样servlet也是单实例的。
Struts2框架执行流程步骤如下:
1、 客户端初始化一个指向Servlet容器(例如Tomcat)的请求
2、 这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助,例如:SiteMesh Plugin)
3、 接着FilterDispatcher(现已过时)被调用,FilterDispatcher询问ActionMapper来决定这个请是否需要调用某个Action
4、 如果ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy
5、 ActionProxy通过Configuration Manager询问框架的配置文件,找到需要调用的Action类
6、 ActionProxy创建一个ActionInvocation的实例。
7、 ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用。
8、 一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。返回结果通常是(但不总是,也可 能是另外的一个Action链)一个需要被表示的JSP或者FreeMarker的模版。在表示的过程中可以使用Struts2 框架中继承的标签。在这个过程中需要涉及到ActionMapper
说说Cookie和Session的区别?
1、Cookie和Session都是会话技术,Cookie是运行在客户端,Session是运行在服务器端。
2、session中保存的是对象,cookie中保存的是字符串。
3、Cookie有大小限制以及浏览器在存cookie的个数也有限制,Session是没有大小限制和服务器的内存大小有关。
4、Cookie有安全隐患,通过拦截或本地文件找得到你的cookie后可以进行攻击。
5、Session是保存在服务器端上会存在一段时间才会消失,如果session过多会增加服务器的压力。
友友们如果那里写的不对请留言交流,希望能帮到友友们!
更多推荐
所有评论(0)