@[TOC]目录
JAVA面试、笔试题
@目录 一、 CoreJava部分 7
- java为什么能够跨平台运行? 8
- 整型数据转换成字符串的方式? 8
- String是基本数据类型吗?我可不可以写个类继承于String? 8
- 谈谈&和&&的区别? 8
- Switch语句里面的条件可不可以是byte、long、String?使用时候还应注意什么? 8
- short s1=1;s1=s1+1;有什么错?short s1 = 1;s1+=1 有什么错? 8
- char为什么能存贮一个汉字? 9
- 用最效率的办法算出2乘以8等于几? 9
- final修饰变量时,该变量是对象时,对象的值可不可以改变? 9
- 静态变量和实例变量的区别? 9
- 面向对象的基本特征是什么? 9
- 作用域public,private,protected,以及不写时的区别? 9
- Overload和Override的区别。 10
- 构造器可不可以被重载或重写? 10
- 抽象类和接口的区别? 10
- java中实现多态的机制是什么? 10
- int和integer的区别? 10
- String和StringBuffer的区别?StringBuffer和StringBuilder区别? 10
- String s=new String(“xyz”);创建了几个String Object? 11
- 数组中有没有length()方法,String中有没有length()方法? 11
- try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后? 11
- final, finally, finalize的区别。 11
- ‘==’和equals的区别? 11
- error和exception有什么区别? 11
- JAVA 的checked异常和unchecked异常 11
- java中有几种方法可以实现一个线程?用什么关键字修饰同步方法? stop()和suspend()方法为何不推荐使用? 12
- sleep() 和 wait() 有什么区别? 12
- 当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法? 12
- 线程的基本概念、线程的基本状态以及状态之间的关系 12
- ArrayList和Vector的区别? 13
- List、Set和Map的区别? 13
- Collection 和 Collections的区别。 14
- Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别? 14
- 什么是java序列化,如何实现java序列化? 14
- heap和stack有什么区别。 14
- 编写一个程序,将d:java目录下的所有.java文件复制到d:jad目录下,并将原来文件的扩展名从.java改为.jad。 15
- 说明生活中遇到的二叉树,用java实现二叉树 17
- 第1个人10,第2个比第1个人大2岁,依次递推,请用递归方式计算出第8个人多大? 22
- 排序都有哪几种方法?请列举。用JAVA实现一个快速排序。 22
- 金额转换,阿拉伯数字的金额转换成中国传统的形式如:(¥1011)->(一千零一拾一元整)输出。 23
- 什么是内部类?分为哪几种?有什么作用? 24
- 为什么需要内部类? 24
- 内部类可以引用它的包含类的成员吗?有没有什么限制? 25
- Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)? 25
- java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类? 25
- 字节流与字符流的区别 25
- 复制文件到指定路径 27
二、 数据库部分 27 - 触发器的作用? 27
- 什么是存储过程?用什么来调用? 27
- 删除表的方式 27
Delete truncate drop 27 - 索引的作用?和它的优点缺点是什么? 27
- 什么是事务?什么是锁? 28
- 什么叫视图?游标是什么? 28
- 列举几种表连接方式,有什么区别? 28
- 主键和外键的区别? 29
- 在数据库中查询语句速度很慢,如何优化? 29
- 数据库三范式是什么? 29
- union和union all有什么不同? 30
- 用JDBC如何调用存储过程 30
- JDBC中的PreparedStatement相比Statement的好处 31
- 什么是sql注入? 31
- 写一个用jdbc连接实例。 31
- 现在有表: 33
- 现有表: 33
- 怎样把这样一个表(表名:tmp_table_201307) 34
- 数据库中有一张表ismg_icp_flow,结构如下 35
- Oracle和Mysql的区别? 35
- Varchar2和varchar有什么区别? 36
- Statement和preparedstatement有什么区别? 36
三、 XML部分 36 - xml有哪些解析技术?区别是什么? 36
- 你在项目中用到了xml技术的哪些方面?如何实现的? 37
- 编程用JAVA解析XML的方式. 37
- XML文档定义有几种形式?它们之间有何本质区别? 39
- XML和HTML的区别? 39
- XML文件和普通文件相比有哪些优点? 39
- 关于JSON 39
四、 HTML&CSS部分 40 - HTML中定义表格的宽度用80px和80%的区别是什么? 40
- CSS样式定义优先级顺序是? 40
- div和span的区别? 40
- CSS选择器包括? 40
- 用css3语法中,如何实现一个矩形框的圆角效果和50%红色透明效果?,请写出关键脚本 40
五、 Javascript和ajax部分 41 - 请写一段Javascript程序,对以下程序的用户输入日期的有效性进行判断,如果格式错误就提示用户。在程序的恰当位置注明怎样调用你写的程序。日期格式为:年年年年月月日日小时,例如2003010812。 41
- Java和Javascript区别在哪? 42
- 列举javascript的3种主要数据类型,2种复合数据类型和2种特殊数据类型。 43
- 谈谈你的JS的理解? 43
- ajax的优点? 43
- JS里Ajax的原理 44
- 简述一下ajax调试代码查找错误的方法? 44
- 简述ajax中Js脚本缓存问题该如何解决? 44
- Ajax应用和传统的web应用有何不同? 44
- javascript的作用? 44
- 为什么要有jquery? 44
- jquery选择器有哪些优势? 45
- 你是如何使用jquery中的ajax的? 45
- jquery中的.post请求区别? 45
- jquery中如何操作样式的? 45
- 如何设置和获取HTML和文本的值? 45
- Jquery能做些什么? 45
- 在ajax中data主要有哪几种? 45
六、 web部分 46 - Tomcat的优化经验 46
- 解释一下什么是servlet;什么是servlet容器; 46
- 说一说Servlet的生命周期? 46
- HTTP请求的GET与POST方式的区别 46
- 请写一个Servlet的基本架构。 46
- forward 和redirect的区别? 47
- 过滤器有哪些作用? 47
- JSP的常用指令? 47
- JSP和Servlet中的请求转发分别如何实现? 47
- JSP乱码如何解决? 48
- session 和 application的区别? 48
- jsp有哪些内置对象?作用分别是什么? 48
- Jsp有哪些动作?作用分别是什么? 48
- JSP中动态INCLUDE与静态INCLUDE的区别? 49
- JSP和Servlet有哪些相同点和不同点,他们之间的联系是什么? 49
- MVC的各个部分都有那些技术来实现?如何实现? 49
- 页面传递对象的方法? 49
- cookied和session区别? 49
七、 框架部分 50 - 谈谈你对Struts2的理解。 50
- 谈谈你对Hibernate的理解。 50
- 你对Spring的理解。 50
- Struts2优缺点 51
- 说说struts1与struts2的区别。 52
- struts的核心组件有哪些? 53
- struts2获取request的方式? 53
- Strus2的执行过程 53
- 为什么要使用struts2? 53
- Struts2的优缺点? 53
- 拦截器的作用?拦截器和过滤器的区别? 54
- struts.xml中result的type有哪些类型? 55
- 一般情况下,关系数据模型与对象模型之间有哪些匹配关系? 55
- hibernate 数据的三个状态 55
- Hibernate中load和get的区别? 56
- getCurrentSession与openSession的区别 56
- Hibernate的工作原理? 56
- 为什么要用hibernate? 56
- Hibernate是如何延迟加载的? 57
- hibernate的缓存 57
- 如何优化Hibernate? 58
- 什么是ORM? 58
- Hibernate的主键生成策略? 58
- Hibernate的级联操作 58
- Hibernate有哪5个核心接口? 59
- 什么是重量级?什么是轻量级? 59
- 谈谈Spring的IOC和DI 59
- 解释Spring的IoC? 几种注入依赖的方式?Spring的优点? 60
- 什么是AOP? 60
- Spring的通知类型有哪些? 60
- springMVC的运行原理。 61
八、 设计模式 61
请写出你所知道的设计模式? 61
九、 经典案例 62 - 说明生活中遇到的二叉树,用java实现二叉树 62
- 从类似如下的文本文件中读取出所有的姓名,并打印出重复的姓名和重复的次数,并按重复次数排序: 67
- 写一个Singleton出来。 71
- 古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 73
一、CoreJava部分
Java基础是在面试过程中最常问到的,因为刚刚出去的我们对项目认知并不
很深,对于后框架的知识并没有达到精通,所以基础最重要。如果你有不怕
死的精神可以尝试让面试官问问你框架的。
byte、short、int、long、float、double、char、boolean
Java的反射非常强大,传递class, 可以动态的生成该类、取得这个类的所有信息,包括里面的属性、方法以及构造函数等,甚至可以取得其父类或父接口里面的内容。
obj.getClass().getDeclaredMethods();//取得obj类中自己定义的方法, 包括私有的方法。
obj.getClass().getMethods();//取得obj类中自己定义的方法及继承过来的方法, 但私有方法得不到。
class a
{
a(String a){
System.out.println(“父类1参数”);
}
}
public class Hope extends a{
Hope(){
super(“s”);//由于父类没有无参构造方法,所以这里必须明确调用父类中的有参构造,不然会编译错误
System.out.println(“Hope类无参数”);
}
Hope(String s){
super(“s”);//由于父类没有无参构造方法,所以这里必须明确调用父类中的有参构造,不然会编译错误
System.out.println(“Hope类1参数”);
}
public static void main(String args[]){
Hope hope=new Hope(“s”);
}
}
因为Java程序编译之后的代码不是能被硬件系统直接运行的代码,而是一种“中间码”——字节码。然后不同的硬件平台上安装有不同的Java虚拟机(JVM),由JVM来把字节码再“翻译”成所对应的硬件平台能够执行的代码。因此对于Java编程者来说,不需要考虑硬件平台是什么。所以Java可以跨平台。
1、 直接在数字后面加上空格;
2、 使用String.valueOf(int i);
3、 Integer.toString(i);
不是,Strng是引用类型;String是final的类,是不可以被继承的。
&和&&都可以用作逻辑与的运算符,表示逻辑与(and),当运算符两边的表达式的结果都为true时,整个运算结果才为true,否则,只要有一方为false,则结果为false。
&&还具有短路的功能,即如果第一个表达式为false,则不再计算第二个表达式。
&还可以用作位运算符,当&操作符两边的表达式不是boolean类型时,&表示按位与操作.。
switch里面的条件必须是能隐式的转化成为Int的故long和String不行,byte可以;使用Switch时候还应注意它的穿透,即每个case后要跟break;
对于short s1 = 1; s1 = s1 + 1; 由于s1+1运算时会自动提升表达式的类型,所以结果是int型,再赋值给short类型s1时,编译器将报告需要强制转换类型的错误。
对于short s1 = 1; s1 += 1;由于 += 是java语言规定的运算符,java编译器会对它进行特殊处理,因此可以正确编译。
char型变量是用来存储Unicode编码的字符的,unicode编码字符集中包含了全世界所 有的字体。
2<<3 位移运算是最底层的运算,他直接操作的是二进制,故效率最快。
final修饰的变量指的是引用不可变,对象的值是可以改变的。
静态变量也称为类变量,归全类共有,它不依赖于某个对象,可通过类名直接访问;而实例变量必须依存于某一实例,只能通过对象才能访问到它。
2)继承:子类拥有父类一切非私有的属性和方法。
3)封装:封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面。面 向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装 的对象,这些对象通过一个受保护的接口访问其他对象。
4)多态性:同一种事物的不同种表现形式。
(Overload)重载:发生在同一个类之中,方法名相同、参数列表不同,与返回值无关、与final无关、与修饰符无关、与异常无关。
(Override)重写:发生在子类和父类之间,方法名相同、参数列表相同、返回值相同、不能是final的方法、重写的方法不能有比父类方法更为严格的修饰符权限、重写的方法所抛出的异常不能比父类的更大。
如果父类私有的方法,子类拥有方法签名相同的方法,子类不属于重写父类的方法,该方法属于子类的新方法。
构造器不能被继承,故不能被重写、但可以被重载。
java中没有多继承,但是可以多实现,即一个类实现多个接口。
虽然没有多继承,但是java中接口可以近似的实现多继承,那就是接口;接口和接口之间可以进行多继承。
a.抽象类继承与object接口不继承object.
b.抽象类有构造器,接口中没有构造器。
c.抽象类中可以有普通成员变量和常量,接口中只能有常量,而且只能是
public static final 不写默认。
d.抽象类中可以有抽象方法,也可以由普通的方法,接口中只能有抽象的方法而且修饰符只能是public abstract 不写默认。
e.抽象类中可以有final的方法,接口中不能有final的方法。
f.抽象类只能是单继承,多实现,接口是可以多继承其他接口,但是不能实现接口,和不能继承其他类。
g.抽象类中可以有静态的方法,接口中不可以。
重写、重载、父类的声明指向子类的对象。
int是java的基本数据类型,integer是1.4版本后提供的基本类型包装类,当两者作为成员变量时,初始值分别为;int是0;integer是null;其中integer提供了一些对整数操作的方法,还定义了integer型数值的最值,其他基本类型也有对应的包装类,基本类型包装类的出现,使得java完全面向对象.
String是不可变的,对String类的任何改变都会返回一个新的String 对象。
StringBuffer是可变的,对StringBuffer中的内容修改都是当前这个对象。
String重写了equals方法和hashCode方法,StringBuffer没有重写equals方 法。
String是final的类。StringBuffer不是。
String创建的字符串是在常量池中,创建的变量初始化一次,如果再对该字符串改变会产生新的字符串地址值,StringBuffer是在堆中创建对象,当对字符串改变时不会产生新的字符串地址值,如果对字符串进行频繁修改的话建议使用StringBuffer,以节省内存。
StringBuffer和StringBuilder,StringBuffer是线程安全的,StringBulider是线程不安全的。当不考虑并发问题时候,请使用StringBulider。
两个对象,一个是"xyx",一个是指向"xyx"的引用对象s。
数组中没有length()方法,但是有length属性,String中有length()方法
这道题很有争议,我是通过debug模式分为两种情况进行测试的.
a.finally中没有return时候:
会先执行try里面的,return会执行但是没有真正的return此时去执行了finally里面的,然后再返回来执行return.
b.finally中有return时候(其实这种情况不符合编程规范,会报黄线警告):
会先执行try里面的,return会执行但是没有真正的return此时去执行了finally里面的,然后执行finally里面的return,直接返回。
final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。
内部类要访问局部变量,局部变量必须定义成final类型。
finally是异常处理语句结构的一部分,表示总是执行。
finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。JVM不保证此方法总被调用
‘’比较的是两个变量的内容和在内存中的地址值是否全部相等,如果要比较两个基本数据类型那必须用’’
equals如果没有重写,则和’==’的意义一样,如果重写了,则会会按照重写的内容进行比较,javaBean规定当重写equals时候必须重写hashCode,如果不重写会出现对象相同但是hashCode不同,这样会出现问题,eg:HashSet存储元素时候是按照hashCode,如果重写equals不重写hashCode会导致同一个对象,存储了两次。
error表示恢复不是不可能但是很困难的情况下的一种严重问题,例如程序书写错误,虚拟机错误等,exception是一种设计和实现问题,如果程序运行正常,从不会发生的情况。error是可以避免的,exception是不可避免的。
1、unchecked异常即运行时异常。即RuntimeException(运行时异常),不需要try…catch …或者throws机制去处理的异常;
2、除了RuntimeException,其他继承自java.lang.exception的异常统称为checked Exception。
实现线程有两种方式:
1.继承Thread类,重写run方法,在调用start方法。
2.实现Runnable接口,重写run方法。在传给Thread构造器,调用时调用Thread的start方法。
用synchronized关键字修饰同步方法 。
不使用stop(),是因为它不安全。它会解除由线程获取的所有锁定,而且如果对象处于一种不连贯状态,那么其他线程能在那种状态下检查和修改它们。结果很难检查出真正的问题所在。suspend()方法容易发生死锁。调用suspend()的时候,目标线程会停下来,但却仍然持有在这之前获得的锁定。此时,其他任何线程都不能访问锁定的资源,除非被"挂起"的线程恢复运行。对任何线程来说,如果它们想恢复目标线程,同时又试图使用任何一个锁定的资源,就会造成死锁。所以不应该使用suspend(),而应在自己的Thread类中置入一个标志,指出线程应该活动还是挂起。若标志指出线程应该挂起,便用wait()命其进入等待状态。若标志指出线程应当恢复,则用一个notify()重新启动线程。
sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用sleep不会释放对象锁。 wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。
分几种情况:
1.其他方法前是否加了synchronized关键字,如果没加,则能。
2.如果这个方法内部调用了wait,则可以进入其他synchronized方法。
3.如果其他个方法都加了synchronized关键字,并且内部没有调用wait,则不能。
4.如果其他方法是static,它用的同步锁是当前类的字节码,与非静态的方法不能同步,因为非静态的方法用的是this。
一个新的线程可以使用两种方式创建:1、继承Thread类2、实现Runnable接口,创建之后通过start方法进入到运行状态,在运行状态中可以使用yield方法进行礼让,但是仍然可以进行,如果现在一个线程需要暂停的话,可以使用suspend(暂时挂起,resume表示恢复挂起)、sleep、wait方法,如果现在让线程不再执行,则可以通过stop结束,run方法运行完也表示结束。其中suspend、resume、stop方法都可能产生死锁的问题,所以不建议使用了。应该通过设置标示位来控制线程的停止运行。
一个程序中可以有多条执行线索同时执行,一个线程就是程序中的一条执行线索,每个线程上都关联有要执行的代码,即可以有多段程序代码同时运行,每个程序至少都有一个线程,即main方法执行的那个线程。如果只是一个cpu,它怎么能够同时执行多段程序呢?这是从宏观上来看的,cpu一会执行a线索,一会执行b线索,切换时间很快,给人的感觉是a,b在同时执行,好比大家在同一个办公室上网,只有一条链接到外部网线,其实,这条网线一会为a传数据,一会为b传数据,由于切换时间很短暂,所以,大家感觉都在同时上网。
状态:就绪,运行,synchronize阻塞,wait和sleep挂起,结束。wait必须在synchronized内部调用。
调用线程的start方法后线程进入就绪状态,线程调度系统将就绪状态的线程转为运行状态,遇到synchronized语句时,由运行状态转为阻塞,当synchronized获得锁后,由阻塞转为运行,在这种情况可以调用wait方法转为挂起状态,当线程关联的代码执行完后,线程变为结束状态。
这两个类都实现了List接口(List接口继承了Collection接口),他们都是有序集合,即存储在这两个集合中的元素的位置都是有顺序的,相当于一种动态的数组,我们以后可以按位置索引号取出某个元素,,并且其中的数据是允许重复的,这是HashSet之类的集合的最大不同处,HashSet之类的集合不可以按索引号去检索其中的元素,也不允许有重复的元素(本来题目问的与hashset没有任何关系,但为了说清楚ArrayList与Vector的功能,我们使用对比方式,更有利于说明问题)。
接着才说ArrayList与Vector的区别,这主要包括两个方面:.
(1)同步性:
Vector是线程安全的,也就是说是它的方法之间是线程同步的,而ArrayList是线程序不安全的,它的方法之间是线程不同步的。如果只有一个线程会访问到集合,那最好是使用ArrayList,因为它不考虑线程安全,效率会高些;如果有多个线程会访问到集合,那最好是使用Vector,因为不需要我们自己再去考虑和编写线程安全的代码。
备注:对于Vector&ArrayList、Hashtable&HashMap,要记住线程安全的问题,记住Vector与Hashtable是旧的,是java一诞生就提供了的,它们是线程安全的,ArrayList与HashMap是java2时才提供的,它们是线程不安全的。所以,我们讲课时先讲老的。
(2)数据增长:
ArrayList与Vector都有一个初始的容量大小,当存储进它们里面的元素的个数超过了容量时,就需要增加ArrayList与Vector的存储空间,每次要增加存储空间时,不是只增加一个存储单元,而是增加多个存储单元,每次增加的存储单元的个数在内存空间利用与程序效率之间要取得一定的平衡。Vector默认增长为原来两倍,而ArrayList的增长策略在文档中没有明确规定(从源代码看到的是增长为原来的1.5倍)。ArrayList与Vector都可以设置初始的空间大小,Vector还可以设置增长的空间大小,而ArrayList没有提供设置增长空间的方法。
总结:即Vector增长原来的一倍,ArrayList增加原来的0.5倍。
36.List、Set和Map的区别?
a.List和Set是Collection的子接口,map不是。
b.List的底层是数组的方式实现,Set是散列表的方式实现,map是键值对的方式。
c.list是有序可重复的,Set是无序不可重复的,map是有序,key不重复,value可重复
d.list和Set可直接使用itertator来进行遍历,map只能通过先遍历Key在遍历value.
37.Collection 和 Collections的区别。
Collection是集合类的上级接口,继承与他的接口主要有Set 和List.
Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。
38.Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用还是equals()? 它们有何区别?
Set里的元素是不能重复的,元素重复与否是使用equals()方法进行判断的。
equals()和方法决定引用值是否指向同一对象equals()在类中被覆盖,为的是当两个分离的对象的内容和类型相配的话,返回真值。