Java面试题(不断更新中...)

1.String和stringBuffer的区别?

String:
为不可变对象,一旦被创建,就不能修改它的值.
对于已经存在的String对象的修改都是重新创建一个新的对象,然后把新的值保存进去.
String 是final类,即不能被继承.

StringBuffer:
是一个可变对象,当对他进行修改的时候不会像String那样重新建立对象

1-00. public class a {

int il=9;

static int i2=9;

final int i3=10;

}

请 指出static 和 final所代表的含义

答案:static是指该变量为类变量,在内存中只有一份,所有该类对象共享该变量;

final是指该变量为常量,不能被修改。


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

 

1-1.StringBufferStringBuilder的区别

  StringBufferStringBuilder类都表示内容可以被修改的字符串,StringBuilder是线程不安全的,运行效率高,如果一个字符串变量是在方法里面定义,这种情况只可能有一个线程访问它,不存在不安全的因素了,则用StringBuilder。如果要在类里面定义成员变量,并且这个类的实例对象会在多线程环境下使用,那么最好用StringBuffer

1-2.

下面这条语句一共创建了多少个对象:String s="a"+"b"+"c"+"d";

答:对于如下代码:

String s1 = "a";

String s2 = s1 + "b";

String s3 = "a" + "b";

System.out.println(s2 == "ab");

System.out.println(s3 == "ab");

第一条语句打印的结果为false,第二条语句打印的结果为true,这说明javac编译可以对字符串常量直接相加的表达式进行优化,不必要等到运行期去进行加法运算处理,而是在编译时去掉其中的加号,直接将其编译成一个这些常量相连的结果。

题目中的第一行代码被编译器在编译时优化后,相当于直接定义了一个”abcd”的字符串,所以,上面的代码应该只创建了一个String对象。写如下两行代码,

String s = "a" + "b" + "c" + "d";

System.out.println(s == "abcd");

最终打印的结果应该为true。 

HashMapHashtable的区别

List 和 Map 区别?

一个是存储单列数据的集合,另一个是存储键和值这样的双列数据的集合,List中存储的数据是有顺序,并且允许重复;Map中存储的数据是没有顺序的,其键是不能重复的,它的值是可以有重复的。


用一条SQL语句 查询出每门课都大于80分的学生姓名  

提示:当百思不得其解时,请理想思维,把小变成大做,把大变成小做,

答案:
A: select distinct name from score  where  name not in (select distinct name from score where score<=80)

B:select distinct name t1 from score where 80< all (select score from score where name=t1);

Hibernate就是其中的一种流行ORM框架

AOP的作用

对Spring的理解。

谈谈Struts中的Action servlet


2.servlet的周期?

3.final, finally, finalize的区别

4.error和exception有什么区别?

5.Java中的异常处理机制的简单原理和应用
6.请写出你最常见到的5个runtime exception
试图将对象强迫转换为不是实例的子类时,抛ClassCastException
整数除以零”时,抛ArithmeticException
空指针时,抛NullPointerException
下表越界,ArrayIndexOutOfBoundsException

7.sleep() 和 wait() 有什么区别
8.同步和异步有何异同,在什么情况下分别使用他们?举例说明。

通俗版:举个例子:普通B/S模式(同步)AJAX技术(异步)

同步:提交请求->等待服务器处理->处理完毕返回 这个期间客户端浏览器不能干任何事

异步: 请求通过事件触发->服务器处理(这是浏览器仍然可以作其他事情)->处理完毕

简述synchronizedjava.util.concurrent.locks.Lock的异同 ?

主要相同点:Lock能完成synchronized所实现的所有功能 

主要不同点:Lock有比synchronized更精确的线程语义和更好的性能。synchronized会自动释放锁,而Lock一定要求程序员手工释放,并且必须在finally从句中释放。

设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1

HashMapHashtable的区别

(条理上还需要整理,也是先说相同点,再说不同点)

HashMapHashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口,主要区别在于HashMap允许空(null)键值(key,由于非线程安全,在只有一个线程访问的情况下,效率要高于Hashtable。 

HashMap允许将null作为一个entrykey或者value,而Hashtable不允许。 

HashMapHashtablecontains方法去掉了,改成containsvaluecontainsKey。因为contains方法容易让人引起误解。 

Hashtable继承自Dictionary类,而HashMapJava1.2引进的Map interface的一个实现。 

最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap 就必须为之提供外同步。 

HashtableHashMap采用的hash/rehash算法都大概一样,所以性能不会有很大的差异。

HashMapHashTable主要从三方面来说。 
.历史原因:Hashtable是基于陈旧的Dictionary类的,HashMapJava 1.2引进的Map接口的一个实现 
.同步性:Hashtable是线程安全的,也就是说是同步的,而HashMap是线程序不安全的,不是同步的 
.值:只有HashMap可以让你将空值作为一个表的条目的keyvalue 

GC是什么为什么要有GC?    

GC是垃圾收集的意思(Gabage Collection,内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,Java语言没有提供释放已分配内存的显示操作方法。

设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序。

以下程序使用内部类实现线程,对j增减的时候没有考虑顺序问题。

public class ThreadTest1{

private int j;

public static void main(String args[]){

ThreadTest1 tt=new ThreadTest1();

Inc inc=tt.new Inc();

Dec dec=tt.new Dec();

for(int i=0;i<2;i++){

Thread t=new Thread(inc);

t.start();

t=new Thread(dec);

t.start();

}

}

private synchronized void inc(){

j++;

System.out.println(Thread.currentThread().getName()+"-inc:"+j);

}

private synchronized void dec(){

j--;

System.out.println(Thread.currentThread().getName()+"-dec:"+j);

}

class Inc implements Runnable{

public void run(){

for(int i=0;i<100;i++){

inc();

}

}

}

class Dec implements Runnable{

public void run(){

for(int i=0;i<100;i++){

dec();

}

}

}

}

有数组a[n],用java代码将数组元素顺序颠倒

public class Test {
public static void main(String[] args) {
int[] a={1,2,3,4,5};
// int[] b=new int[a.length];
// for (int i = 0,j = a.length-1; i < a.length && j >=0; i++, j--) {
// b[j]=a[i];
// }
// for (int i = 0; i < a.length; i++) {
// System.out.print(b[i]);
// }
swap(a);
for (int i = 0; i < a.length; i++) {
System.out.print(a[i]);
}
}
public static void swap(int a[]){
     int len = a.length;
     for(int i=0;i<len/2;i++){
         int tmp = a[i];
         a[i] = a[len-1-i];
         a[len-1-i] = tmp;

     }
}
}

说一说Servlet的生命周期

:servlet有良好的生存期的定义,包括加载和实例化、初始化、处理请求以及服务结束。这个生存期由javax.servlet.Servlet接口的init,servicedestroy方法表达。

Servlet被服务器实例化后,容器运行其init方法,请求到达时运行其service方法,service方法自动派遣运行与请求对应的doXXX方法(doGetdoPost)等,当服务器决定将实例销毁的时候调用其destroy方法。

web容器加载servlet,生命周期开始。通过调用servletinit()方法进行servlet的初始化。通过调用service()方法实现,根据请求的不同调用不同的do***()方法。结束服务,web容器调用servletdestroy()方法。 


9.描述一下JVM加载class文件的原理机制
10.对Java面向对象的理解


HTTP请求的GETPOST方式的区别

Get是向服务器发索取数据的一种请求;而Post是向服务器提交数据的一种请求,要提交的数据位于信息头后面的实体中。

-------------------------------
我喜欢的公司的面试题
11.谈谈对mvc模式的理解;

MVC是三个单词的首字母缩写,它们是Model(模型)、View(视图)和Controller(控制)。

这个模式认为,程序不论简单或复杂,从结构上看,都可以分成三层。

1)最上面的一层,是直接面向最终用户的"视图层"(View)。它是提供给用户的操作界面,是程序的外壳。

2)最底下的一层,是核心的"数据层"(Model),也就是程序需要操作的数据或信息。

3)中间的一层,就是"控制层"(Controller),它负责根据用户从"视图层"输入的指令,选取"数据层"中的数据,然后对其进行相应的操作,产生最终结果。

这三层是紧密联系在一起的,但又是互相独立的,每一层内部的变化不影响其他层。每一层都对外提供接口(Interface),供上面一层调用。这样一来,软件就可以实现模块化,修改外观或者变更数据都不用修改其他层,大大方便了维护和升级。


12.SSI框架分别使用了什么技术,从而实现了什么功能(譬如spring用到了依赖注入技术,从而实现了解耦的功能)?
13.如果你的意见与上级的不统一,你会怎么办?
先把自己的思路仔细整理一下,确认自己的意见有足够的论据说明是正确的,
选取领导比较冷静(能听进解释)的时候,陈述自己的见解及依据,并表示如果领导仍然不能接受会服从指示进行工作 。
然后根据结果进行。

14.如果你被录取了,你在这个公司工作多长时间?
只要是这个工作一直具备挑战性以及学习成长的机会,我想我便没有离开的理由。
15.你感觉自己能胜任这份工作吗?
16.你最近这几年有什么规划在工作上?
17.列举设计模式及其使用到该设计模式的地方?

--------------------------------------------------------

18.数据库连接池

数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标。数据库连接池正是针对这个问题提出来的。

数据库连接池就是一个缓冲池,负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而再不是重新建立一个;

数据库连接池在初始化时将创建一定数量的数据库连接放到连接池中当用户需要访问数据库时,并非建立一个新的连接,而是从连接池中取出一个已建立的空闲连接对象。使用完毕后,用户也并非将连接关闭,而是将连接放回连接池中,以供下一个请求访问使用。(而连接的建立、断开都由连接池自身来管理。)


常见的runtime exception有哪些?

ArithmeticException, 

ArrayStoreException, 

BufferOverflowException, 

BufferUnderflowException, 

CannotRedoException, CannotUndoException,

ClassCastException,

CMMException, 

ConcurrentModificationException,

DOMException, 

EmptyStackException, IllegalArgumentException, 

IllegalMonitorStateException, 

IllegalPathStateException, 

IllegalStateException, 

ImagingOpException, IndexOutOfBoundsException, 

MissingResourceException, 

NegativeArraySizeException, 

NoSuchElementException, NullPointerException, 

ProfileDataException, 

ProviderException, 

RasterFormatException, 

SecurityException, 

SystemException, UndeclaredThrowableException, 

UnmodifiableSetException, 

UnsupportedOperationException

NullPointException

1. 编程题:写一个Singleton出来。  []

Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在。

第一种形式: 定义一个类,它的构造函数为private的,它有一个staticprivate的该类变量,在类初始化时实例话,通过一个publicgetInstance方法获取对它的引用,继而调用其中的方法。

public class Singleton {

private Singleton(){}

      private static Singleton instance = new Singleton();

      public static Singleton getInstance() {

        return instance; 

      

    } 

    第二种形式: 

public class Singleton { 

   private static Singleton instance = null;

   public static synchronized Singleton getInstance() {

   if (instance==null)

     instancenew Singleton();

         return instance; 

1. class.forname的作用?为什么要用?


Class.forName(xxx.xx.xx) 返回的是一个类

首先你要明白在java里面任何class都要装载在虚拟机上才能运行。这句话就是装载类用的


JSP中动态INCLUDE与静态INCLUDE的区别


JSP中动态INCLUDE与静态INCLUDE的区别 动态INCLUDE用jsp:include动作实现 <jsp:include page="included.jsp" flush="true">它总是会检查所含文件中的变化,适合用于包含动态页面,并且可以带参数。 静态INCLUDE用include伪码实现,它不会检查所含文件的变化,适用于包含静态页面     静态include主要是对静态页面的引入,不会检查所包含文件的变化


1. 随机数冒泡排序

答案:public void sort(int[] values) {

        if (values == null) {

            return null;

        }

        int temp = 0;

        for (int i = 0; i < values.length; i++) {

            for (int j = i; j < values.length - 1; j++) {

                if (values[j + 1] > values[i]) {

                    temp = values[j + 1];

                    values[j + 1] = values[i];

                    values[i] = temp;

                }

            }

        }

    }


1. &&&的区别

答案:&是逻辑与,&&是短路与

对于exp1&exp2而言,即便exp1falseexp2也会被执行,最终返回false。意思就是说,无论如何,&两边的表达式都回被判断。

对于exp1&&exp2而言,如果exp1falseexp2不会被执行,直接返回false。意思就是说,只有当exp1true时,才会继续判断exp2

2. Collection 和 Collections的区别

答案:Collection是集合接口。而Collections是用于处理集合的工具类。


HTTP请求的GETPOST方式的区别

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值