JAVA面试题

http://blog.csdn.net/liu_005/article/details/52267538


一个字符串比较

http://blog.csdn.net/hp910315/article/details/50865168

基础部分


main方法被声明为private会怎么样?

编译时没有错误,运行时错误。错误: 在类 day01.HomeWork 中找不到 main 方法, 请将 main 方法定义为:public static void main(String[] args)。对于这个问题核心卷有详细的阐述,从1.4开始必须是public,1.4以前可以是其他修饰符。


基本类型指什么,有哪些?

8种,详见于此


输出语句输出值是多少?

int a =4;
double num;
System.out.print( false ? 9.9:9);
输出值是9.0,因为三目表达式中,后面两个表达式的类型必须一样,9.9是double类型,所以9向上变量提升,变为9.0.

switch可以和那些数据类型配合?

Unlike if-then and if-then-else statements, the switch statement can have a number of possible execution paths. A switch works with the byteshortchar,and int primitive data types. It also works with enumerated types (discussed in Enum Types),the String class, and a few special classes thatwrap certain primitive types: Character,Byte, Short, and Integer。(截止JDK 8)

Only convertible int values, strings or enum variables are permitted

switch语句需要注意添加break关键字,break只能用于switch和loop语句,continue只能用于loop语句。


一个很坑爹的字符串的题

		String a = "  abd ";
		String aTrim = a.trim();
		
		String b = "abc";
		String bTrim = b.trim();
		
		System.out.print(a==aTrim);
		System.out.print(b==bTrim);


请问输出

public class Main {
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Integer ia = 100;
		Integer ib = 100;

		Integer ic = 200;
		Integer id = 200;

		int im = 10;
		Integer in = 10;
		
		System.out.println(ia==ib);
		System.out.println(ic==id);
		System.out.println(im==in);
	}
}
这个题的考点主要在:第一、二输出语句是基本数据类型的缓存机制,Integer默认缓存了-128到127的对象,当自动包装的时候回返回缓存中的对象,如果超出了缓存区间的值,则返回新创建的。第三个输出语句im是基本类型,逻辑比较的时候,包装类会自动拆装。


位移操作>>、>>>、<<的区别?

>>是右移动,用符号位填充;>>>也是右移用0填充;<<左移用0填充。


下列数组声明语句中,错误的是:

	int[] arrayA = new int[]{};
	//int[] arrayB = new int[];//Variable must provide either dimension expressions or an array initializer
	int[] arrayC = {};
	int[][] arrayD = new int[2][];

解释一下代码点和代码单元的概念。


http://blog.csdn.net/hp910315/article/details/50865168


equals()和hashcode()

http://blog.csdn.net/lijiecao0226/article/details/24609559


try catch finally 与return混用

throw对象和return都会在整个try catch finally语句执行完成后在决定是return还是throw,finally语句中的return语句会覆盖前面的异常,finally语句中的异常会覆盖前面的异常。


final关键字

http://www.importnew.com/7553.html


枚举类


对象析构与finalize方法。

       有些面向对象的程序设计语言,特别是C++,有显式的析构器方法,其中放置一些当对象不再使用时需要执行的清理代码。在析构器中,最常见的操作是回收分配给对象的存储空间。由于Java有自动的垃圾回收器,不需要人工回收内存,所以Java不支持析构器。

       当然,某些对象使用了内存之外的其他资源,例如,文件或使用了系统资源的另一个对象的句柄。在这种情况下,当资源不再需要时,将其回收和再利用将显得十分重要。

       可以为任何一个类添加finalize方法。finalize方法将在垃圾回收器清除对象之前调用。在实际中,不要依赖于使用finalize方法回收任何短缺的资源,这是因为很难知道这个方法什么时候才能够调用。

       注释:有个名为System.runFinlizersOnExit(true)的方法能够确保finalizer方法在Java关闭前被调用。不过,这个方法并不安全,也不鼓励大家使用。有一种代替的方法是使用方法Runtime.addShutdownHook添加“关闭钩”(shutdown hook),详细内容请参看API文档。

       如果某个资源需要在使用完毕后立刻被关闭,那么就需要由人工来管理。可以应用一个类似dispose或close的方法完成相应的清理操作。特别需要说明,如果一个类使用了这样的方法,当对象不再被使用时一定要调用它。


为什么用数组存储密码比String存储密码要安全?

见此

在java核心卷一中就提到了这个问题,1.6为了解决Scanner输入密码时不可隐藏的问题,引入了Console。接受密码java就是用的字符串数组。

import java.io.Console;

public class Main {

    public static void main(String[] args) {
        Console console = System.console();
        String str = console.readLine("User name:");
        char[] passwd = console.readPassword("Password:")
    }
}


如何拼接字符串? 使用“+”拼接字符串的缺点

可以通过String的concat()函数,也可以用+号拼接,也可以用StringBuilder(异步)、StringBuffer(异步)append()函数进行拼接。用+号拼接每一次都会重新开辟一个新的字符串空间,把新的字符串赋给这块新的空间。字符串如果很大,循环次多又多,那么浪费了很多时间和空间的开销。因为StringBuilder和StringBufffer每次都是在已有的内存空间追加的字符串,初始空间是16字节长度,如果空间不足的话会重新开辟2(size+1)个字节长度的空间,然后把新的字符串存过来,所以尽可能的初始化一个预估的值。


下面这段代码的输出结果?

public class Beautiful {
	public static void main(String... args) {
		System.out.println("12343" == "123" + "43");
		System.out.println("12343" == "123" + new String("43"));
	}
}

true

false


返回值是多少?

	static int  m(){
		int a =90;
		try{
			throw new Exception();
		}catch(Exception e){

			return ++a;
		}finally {
			a=900;
		}
		
	}

返回值是91,因为return语句,会将返回的值拷贝到一个具体的位置。所以修改原来的值不会修改到返回值。


面向对象


下题目的输出

public class Test {
	public static void main(String[] args) {
		Aoo aoo = new Aoo(5);
		System.out.println(aoo.num);
	}
}

class Aoo {
	int num;

	public Aoo(int num) {
		num = num;
	}
}

这个题的输出0,该分代码是可以编译通过的,num=num这行代码执行的是变量自己赋值给自己。对象的变量num根本没有参与。


super()和this()函数是否可以同时出现在构造函数中?

不可以

该题的整体思路是,父类的初始化必须先于子类完成。所以如果super()和this()同时出现在构造函数中,那么就会造成this会触发父类中的构造函数又被触发一次。造成初始化过程的紊乱,所以jvm不允许这种情况出现。

下列说法正确的有( )


A.class中的constructor不可省略

B.constructor必须与class同名,但方法不能与class同名

C.constructor在一个对象被new时执行

D.一个class只能定义一个constructor


解析:省略写构造函数后,会有一个默认构造函数;方法也可以与类同名,只是这样不符合规范,类名通常首字母大写;一个类明显可以定义多个,重载;


JAVA多态的调用

方法的调用规则:首先根据引用变量的类型,确定此时应该出发引用变量的哪一个函数。然后根据引用变量指向的对象的函数重写情况来看实际调用的那个具体的函数体,如果这里存在隔代继承,还要考虑中间继承类的重写情况。


变量和静态方法不存在多态机制。

http://blog.csdn.net/qq_27258799/article/details/51194598

http://blog.csdn.net/simon901/article/details/25078397


子类可以重载父类的方法么?

当然可以,只是为了满足里氏替换原则,必须满足输入参数类型的范围扩大,返回参数类型的范围缩小。注意:这里的替换接口也需要替换。


Comparable和Comparator的区别?

http://www.cnblogs.com/szlbm/p/5504634.html

Comparator可以很好的和策略模式结合,针对不同的比较策略传入不同的Comparator


if(username.equals(“zxx”){
}
int x = 1;
return x==1?true:false; 

这段代码的不妥之处?

集合

讲解一下HashMap的原理?

http://www.importnew.com/20386.html


解决Hash冲突的办法有哪些?

http://www.cnblogs.com/novalist/p/6396410.html


10大集合面试题http://blog.csdn.net/w369033345/article/details/52187411


为什么一定要实现Iterable接口,为什么不直接实现Iterator接口呢? 
      看一下JDK中的集合类,比如List一族或者Set一族,都是实现了Iterable接口,但并不直接实现Iterator接口。 
仔细想一下这么做是有道理的。 
      因为Iterator接口的核心方法next()或者hasNext() 是依赖于迭代器的当前迭代位置的。 如果Collection直接实现Iterator接口,势必导致集合对象中包含当前迭代位置的数据(指针)。 当集合在不同方法间被传递时,由于当前迭代位置不可预置,那么next()方法的结果会变成不可预知。 除非再为Iterator接口添加一个reset()方法,用来重置当前迭代位置。 但即时这样,Collection也只能同时存在一个当前迭代位置。 而Iterable则不然,每次调用都会返回一个从头开始计数的迭代器。 多个迭代器是互不干扰的。 


多线程


可重入锁的原理?

http://www.cnblogs.com/xrq730/p/4979021.html


什么是守护线程(Daemon 线程)?什么情况可以用守护线程?

可以通过t.setDaemon(true);将线程转换为守护线程(daemon thread)。这样一个线程没有什么神奇。守护线程的唯一用途是为其他线程提供服务。只剩下守护线程时,虚拟机就退出了。守护线程永远不要去访问 固有资源,如文件、数据库,因为它会在任何时候甚至在一个操作的中间发生中断。


解释一下interrupt()、interrupted()、isInterrupted()的区别?


如何确保一段代码同时最多只允许有MaxNum个线程执行?

见此文


锁的原理

http://www.cnblogs.com/javanerd/p/4504482.html


有synchronize,为啥Java还要提供Lock框架?

synchronize的局限性主要有:不能中断一个正在试图获得锁的线程;试图获得锁时不能超时;每个锁仅有单一条件可能是不够的(wait() notify() notifyAll())。在代码中应该使用哪一种?Lock和Condition对象还是同步方法?下面是一些建议


进程与线程之间的区别,以及JAVA的线程生命周期?

线程是进程的子集,一个进程可以有很多线程,每条线程并行执行不同的任务。不同的进程使用不同的内存空间,而所有的线程共享一片相同的内存空间。别把它和栈内存搞混,每个线程都拥有单独的栈内存用来存储本地数据。

JAVA面试题_第1张图片


分别说一下java多线程的同步器:信号量、倒计时门栓、障栅、交换器、同步队列。


税友集团面试题

http://blog.csdn.net/jianfpeng241241/article/details/49445521

你可能感兴趣的:(面试)