java常见的面试题

来源:互联网 发布:马岛海战 知乎 编辑:程序博客网 时间:2024/05/17 21:55

Java基础方面:

1、作用域public,private,protected,以及不写时的区别

答:区别如下:
作用域 当前类 同一package 子孙类 其他package
public √ √ √ √
protected √ √ √ ×
friendly √ √ × ×
private √ × × ×
不写时默认为friendly

2、ArrayList和Vector的区别,HashMap和Hashtable的区别

答:就ArrayList与Vector主要从二方面来说.
一.同步性:Vector是线程安全的,也就是说是同步的,而ArrayList是线程序不安全的,不是同步的
二.数据增长:当需要增长时,Vector默认增长为原来一培,而ArrayList却是原来的一半
就HashMap与HashTable主要从三方面来说。
一.历史原因:Hashtable是基于陈旧的Dictionary类的,HashMap是Java 1.2引进的Map接口的一个实现
二.同步性:Hashtable是线程安全的,也就是说是同步的,而HashMap是线程序不安全的,不是同步的
三.值:只有HashMap可以让你将空值作为一个表的条目的key或value

1、jsp有哪些内置对象?作用分别是什么?

答:JSP共有以下9种基本内置组件(可与ASP的6种内部组件相对应):
 request 用户端请求,此请求会包含来自GET/POST请求的参数
response 网页传回用户端的回应
pageContext 网页的属性是在这里管理
session 与请求有关的会话期
application servlet 正在执行的内容
out 用来传送回应的输出
config servlet的构架部件
page JSP网页本身
exception 针对错误网页,未捕捉的例外
2、jsp有哪些动作?作用分别是什么?
答:JSP共有以下6种基本动作
jsp:include:在页面被请求的时候引入一个文件。
jsp:useBean:寻找或者实例化一个JavaBean。
jsp:setProperty:设置JavaBean的属性。
jsp:getProperty:输出某个JavaBean的属性。
jsp:forward:把请求转到一个新的页面。
jsp:plugin:根据浏览器类型为Java插件生成OBJECT或EMBED标记

2、EJB与JAVA BEAN的区别?

答:Java Bean 是可复用的组件,对Java Bean并没有严格的规范,理论上讲,任何一个Java类都可以是一个Bean。但通常情况下,由于Java Bean是被容器所创建(如Tomcat)的,所以Java Bean应具有一个无参的构造器,另外,通常Java Bean还要实现Serializable接口用于实现Bean的持久性。Java Bean实际上相当于微软COM模型中的本地进程内COM组件,它是不能被跨进程访问的。Enterprise Java Bean 相当于DCOM,即分布式组件。它是基于Java的远程方法调用(RMI)技术的,所以EJB可以被远程访问(跨进程、跨计算机)。但EJB必须被布署在诸如Webspere、WebLogic这样的容器中,EJB客户从不直接访问真正的EJB组件,而是通过其容器访问。EJB容器是EJB组件的代理,EJB组件由容器所创建和管理。客户通过容器来访问真正的EJB组件。

1、MVC的各个部分都有那些技术来实现?如何实现?

答:MVC是Model-View-Controller的简写。”Model” 代表的是应用的业务逻辑(通过JavaBean,EJB组件实现), “View” 是应用的表示面(由JSP页面产生),”Controller” 是提供应用的处理过程控制(一般是一个Servlet),通过这种设计模型把应用逻辑,处理过程和显示逻辑分成不同的组件实现。这些组件可以进行交互和重用。

如何实现字符串的反转及替换?

答:方法很多,可以自己写实现也可以使用String或StringBuffer/StringBuilder中的方法。有一道很常见的面试题是用递归实现字符串反转,代码如下所示:

public static String reverse(String originStr) {        if(originStr == null || originStr.length() <= 1)             return originStr;        return reverse(originStr.substring(1)) + originStr.charAt(0); }

、怎样将GB2312编码的字符串转换为ISO-8859-1编码的字符串?

String s1 = "你好";String s2 = new String(s1.getBytes("GB2312"), "ISO-8859-1");

日期和时间:

如何取得年月日、小时分钟秒?
- 如何取得从1970年1月1日0时0分0秒到现在的毫秒数?
- 如何取得某月的最后一天?
- 如何格式化日期?
答:
问题1:创建java.util.Calendar 实例,调用其get()方法传入不同的参数即可获得参数所对应的值。Java 8中可以使用java.time.LocalDateTimel来获取,代码如下所示。

public class DateTimeTest {    public static void main(String[] args) {        Calendar cal = Calendar.getInstance();        System.out.println(cal.get(Calendar.YEAR));        System.out.println(cal.get(Calendar.MONTH));    // 0 - 11        System.out.println(cal.get(Calendar.DATE));        System.out.println(cal.get(Calendar.HOUR_OF_DAY));        System.out.println(cal.get(Calendar.MINUTE));        System.out.println(cal.get(Calendar.SECOND));        // Java 8        LocalDateTime dt = LocalDateTime.now();        System.out.println(dt.getYear());        System.out.println(dt.getMonthValue());     // 1 - 12        System.out.println(dt.getDayOfMonth());        System.out.println(dt.getHour());        System.out.println(dt.getMinute());        System.out.println(dt.getSecond());    }}

问题2:以下方法均可获得该毫秒数。

Calendar.getInstance().getTimeInMillis();System.currentTimeMillis();Clock.systemDefaultZone().millis(); // Java 8

问题3:代码如下所示。

Calendar time = Calendar.getInstance();time.getActualMaximum(Calendar.DAY_OF_MONTH);

问题4:利用java.text.DataFormat 的子类(如SimpleDateFormat类)中的format(Date)方法可将日期格式化。Java 8中可以用java.time.format.DateTimeFormatter来格式化时间日期,代码如下所示。

import java.text.SimpleDateFormat;import java.time.LocalDate;import java.time.format.DateTimeFormatter;import java.util.Date;class DateFormatTest {    public static void main(String[] args) {        SimpleDateFormat oldFormatter = new SimpleDateFormat("yyyy/MM/dd");        Date date1 = new Date();        System.out.println(oldFormatter.format(date1));        // Java 8        DateTimeFormatter newFormatter = DateTimeFormatter.ofPattern("yyyy/MM/dd");        LocalDate date2 = LocalDate.now();        System.out.println(date2.format(newFormatter));    }}

说出一些数据库优化方面的经验?

1 用 PreparedStatement 一般来说比 Statement 性能高
2 有外键约束会影响插入和删除性能, 如果程序能够保证数据的完整性, 那在设计数据库时就
去掉外键。
3 sql 语句全部大写, 特别是列名和表名都大写。 特别是 sql 命令的缓存功能, 更加需要统一
大小写
4 还有索引对查询性能的改进也是值得关注的

数据库三范式

1、第一范式(1NF)
第一范式就是无重复的列
2、第二范式(2NF)
第二范式就是非主属性非部分依赖于主关键字。
3、第三范式(3NF)
第三范式就是属性不依赖于其它非主属性。

==和equals的区别

术语来讲的区别:
1.==是判断两个变量或实例是不是指向同一个内存空间 equals是判断两个变量或实例所指向的内存空间的值是不是相同
2.==是指对内存地址进行比较 equals()是对字符串的内容进行比较
3.==指引用是否相同 equals()指的是值是否相同

object有哪些公用的方法

clone,equals,hashcode,getclass,wait,notify,notifyall,tostring

java的四种引用方式

强引用,强引用有引用变量指向时永远不会被垃圾回收,JVM宁愿抛出OutOfMemory错误也不会回收这种对象。
软引用,如果一个对象具有软引用,内存空间足够,垃圾回收器就不会回收它;
弱引用,弱引用也是用来描述非必需对象的,当JVM进行垃圾回收时,无论内存是否充足,都会回收被弱引用关联的对象。
虚引用,如果一个对象与虚引用关联,则跟没有引用与之关联一样,在任何时候都可能被垃圾回收器回收。