最近在看了一些java基础问题,顺便将这段时间看到的容易混淆和已忘记的问题进行整理总结一下.java
接下来会再写一些web方便易混淆或者不经常使用易忘记的问题梳理web
一、== 和 equals区别数组
==操做符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的数值是否相同,要比较两个基本类型的数据或两个引用变量是否相等,只能用==操做符。安全
equals方法是用于比较两个独立对象的内容是否相同,就比如去比较两我的的长相是否相同,它比较的两个对象是独立的优化
举例spa
Integer aa=new Integer("11"); Integer bb=new Integer("11"); Integer cc=11; Integer dd=11; System.out.println(aa==bb); // false 缘由aa和bb在内存是不一样的对象 System.out.println(aa==cc); // false 缘由aa和bb在内存是不一样的对象 System.out.println(dd==cc); // true 缘由对Integer,String这类对象直接赋值时,会有一个常量值,也就意味着他们共用了一个内存地址 System.out.println(aa.equals(bb)); // true 缘由equals是值比较,Integer,String这类对象均重写了object的equals方法,两个内存中存的值相等,结果就为true,一会会附上源码解析 System.out.println(aa.equals(cc)); // true 缘由equals是值比较,Integer,String这类对象均重写了object的equals方法,两个内存中存的值相等,结果就为true,一会会附上源码解析
Integer中重写的equals源码解析以下: 线程
此处使用String重写的equals源码会更容易看出值比较, 博主太懒,用Interger写的例子,不想换成String例子了, 拿好伞,准备当鸡蛋,哈哈code
public boolean equals(Object obj) { if (obj instanceof Integer) { return value == ((Integer)obj).intValue(); //会将object对象强转为Integer对象,并转换为int基本类型 } return false; }
二、做用域public,private,protected,以及不写时的区别对象
此问题,一图解千愁继承
做用域 | 当前类 | 同一包(package) | 子孙类 | 其余包(package) |
public | √ | √ | √ | √ |
protected | √ | √ | √ | × |
不写 | √ | √ | × | × |
private | √ | × | × | × |
三、抽象类和接口有什么区别
接口(interface)能够说成是抽象类的一种特例,接口中的全部方法都必须是抽象的。接口中的方法定义默认为public abstract类型,接口中的成员变量类型默认为public static final。
二者的语法区别:
四、String s="a"+"b"+"c"+"d"; 这语句建立了几个对象?
看一下例子:
String aa="a"; String bb=aa+"b"+"c"+"d"; String cc="a"+"b"+"c"+"d"; String dd="abcd"; System.out.println(aa==dd); // false System.out.println(bb==dd); // false System.out.println(cc==dd); // true
结合第三条问题解答,能够看出String s="a"+"b"+"c"+"d"这条语句java中作了优化处理,等同于String s="abcd"
五、try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,何时被执行,在return前仍是后?
由于知道return的做用,立马就回答是return前,经验证此答案错误。 仍是经过例子来加深记忆
public class TestLlan { static int test() { int x = 1; try { return x; } finally { ++x; } } public static void main(String[] args) throws FileNotFoundException { System.out.println(TestLlan.test()); // 执行屡次打印结果是 1 } }
经过结果能够否认不是在return以前执行, 可是return后就会跳出方法,也不会是return后, 经过排除法获得是 同时执行, 欢迎大神给出更明确的答复,如何同时执行的? 难道是守护线程?
六、一个方法中 try{}finally{} 语句块内都有return语句时,方法会返回try语句块中的仍是finally语句块中的内容?
这个根据第5个问题解答,猜想他们是同时执行的,那么方法会使用那个返回值呢?继续使用例子解惑
public class TestLlan { public int get() { try { return 0 ; } finally { return 1 ; } } public static void main(String[] args) throws FileNotFoundException { TestLlan t = new TestLlan(); int b = t.get(); System.out.println(b); // 运行屡次,打印值为1 } }
what代码在搞啥嘞... 经过第5个问题排除出来是try{}里面的return和finally{}同时执行啊.. 此时只能绞尽脑汁,继续排除法获得return在finally以前执行, return执行完毕后,先存到某地方,finally在执行return时就会去覆盖第一次return的值, finally执行完毕后,才将最终值真正返出去
七、sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要捕捉InterruptedException(中断异常)异常。
八、ArrayList和Vector的区别
这两个类都实现了List接口,他们都是有序集合,至关于一种动态的数组,咱们之后能够按位置索引号取出某个元素,,而且其中的数据是容许重复的。
这主要包括两个差别方面:
(1)同步性:
Vector是线程安全的,也就是说是它的方法之间是线程同步的,而ArrayList是线程序不安全的,它不考虑线程安全,效率会高些;若是有多个线程会访问到集合,就要使用Vector。
(2)数据增加:
ArrayList与Vector都有一个初始的容量大小,当存储进它们里面的元素的个数超过了容量时,就须要增长ArrayList与Vector的存储空间,Vector默认增加为原来两倍,而ArrayList的增加后是原来的1.5倍。 ArrayList与Vector均可以设置初始的空间大小,Vector还能够设置增加的空间大小,而ArrayList没有提供设置增加空间的方法。
九、HashMap和Hashtable的区别
(1)他们都完成了Map接口。
(2)HashMap容许将null做为一个entry的key或者value,而Hashtable不容许。
(3)Hashtable的方法是Synchronize的,而HashMap不是,在多个线程访问Hashtable时,不须要本身为它的方法实现同步,而HashMap就必须为之提供外同步。
十、heap和stack有什么区别
java的内存分为两类,一类是栈内存,一类是堆内存。
栈内存是指程序进入一个方法时,会为这个方法单独分配一块私属存储空间,用于存储这个方法内部的局部变量,当这个方法结束时,分配给这个方法的栈会释放,这个栈中的变量也将随之释放。 堆是与栈做用不一样的内存,通常用于存放不放在当前方法栈中的那些数据,例如,使用new建立的对象都放在堆里,因此,它不会随方法的结束而消失。方法中的局部变量使用final修饰后,放在堆中,而不是栈中。