1.面试题:重写和重载的区别

        (1)重写(Override):在有继承关系的类中,子类的方法名,参数,返回值和父类一样,但是方法体的内容不同,我们把这种现象称为重写          (给方法上面加上@Override验证该方法是否是方法的重写,不报错说明是方法的重写)

        (2)重载(Overload):在同一个类中,方法名一样,参数不同(参数类型、参数个数),和返回值无关

2.面试题:LinkedList和ArrayList的区别:

        (1)ArrayList底层是一个数组(数组是连续排列的空间,增删时一串内存跟着改变),查找元素速度快,增加、删除元素速度慢

        (2)LinkedList底层是一个双向链表(上一个元素存着下一个元素的内存地址),查找速度慢,增加、删除元素速度快 为适应不同需求,一般创建集合

3.面试题:ArrayList和Vector的区别 :

        (1)ArrayList出现在jdk 1.2,Vector出现在jdk 1.0

        (2)ArrayList效率高,而Vector效率较低

        (3)ArrayList线程不安全,而Vector线程安全

        (4)ArrayList扩容是原来的1.5倍,而Vector扩容是原来的2倍

        (5)共同点:ArrayList和Vector的底层都是数组

4.面试题:HashMap的原理:

        (1)HashSet只使用了HashMap的键,值使用的是Object对象 ArrayList底层是一个数组,空间连续,查询速度快,增删比较慢,空间占用严重

        (2)LinkedList底层是双向链表,空间不连续,查询速度慢,增删速度快,空间占用不严重

        (3)HashMap底层是数组+链表(jdk8以后,如果链表的长度大于8,会自动转换成红黑树) 转换红黑树的目的是增加查找链表的速度

5.面试题: Hashtable和HashMap的区别:

        (1) 父类不同,版本不同,对null的支持不同,效率不同,线程安全性不同, 初始容量不同,扩容速度不同

        (2)HashCode重写方式不同 Hashtable继承了Dictionary,出现于jdk1.0,键值对不可以为null,效率较低,线程安全, 初始容量是11,扩容是原来的2n+1倍,重写方式计算较复杂         

        (3)HashMap继承了AbstractMap,出现于jdk1.2,键值对可以为null,效率较高,线程不安全, 初始容量是16,扩容是原来的两倍,重写方式计算较简单

(线程的安全是以牺牲效率为代价的,线程安全的有加锁、解锁步骤,相对效率减慢提升了线程的安全性)

6.面试题:final和finally的区别:

        (1)final:被final修饰的类不能有子类,被final修饰的方法不能被重写,被final修饰的变量其值不能改变

        (2)finally:一般位于try...catch的后面,finally块中的代码必定执行

7.面试题:throw和throws的区别:

        (1)位置不同,throw在方法内部,throws在方法声明处

        (2)后面内容不同,throw后面是异常对象,throws后面跟的是异常类

        (3)后面个数不同,throw后面只能跟一个异常对象,throws后面可以跟n个异常类

8.面试题:wait和sleep:

        (1)wait是Object类的方法,sleep是Thread类的方法

        (2)wait只能用于同步代码块中,sleep可以位于任意方法

        (3)wait释放锁(调用notice方法时),sleep不释放锁

        (4)sleep在指定的毫秒数醒来,wait既可以在指定的毫秒数醒来也可以通过notice方法唤醒

9.面试题:UDP协议TCP协议

        (1)TCP面向连接的,UDP面向无连接的

        (2)TCP连接效率较低,UDP连接效率较高

        (3)TCP是可靠的,传输数据时不会丢失,UDP是不可靠的,可能会丢失数据

        (4)TCP传数据大小没有限制,UDP传输时每个包大小一般不超过64kb

        (5)TCP传输是点对点的传输,UDP可以一对一,也可以一对多

        三次握手机制(在吗?在。收到。前两次握手证明客户端可以连接到服务器端,二次和三次握手证明服务器可以连接到客户端)

10.面试题: 说出以下代码的运行结果:

public class TestString2 {

         public static void main(String[] args) {

         //使用字面量赋值时,会在常量池中创建"hello"对象

         //以后每次使用是都会从常量池中找到该对象,并使用常量池的内存地址

         String s1 = "hello"; String s2 = "hello"; System.out.println(s1 == s2); //true

         //当new字符串时,会在堆内存中开辟新的内存空间,并让s3指向该内存空间

         String s3 = new String("hello");

        //此行创建两个对象,一个是常量池中的,一个是堆内存中的

         //如果前面已经创建了"hello",此时只创建一个对象

         System.out.println(s2 == s3);

        //false //如果是两个字符串常量相加,当编译成class文件时,会自动合并为"hello"

        //常量池中已经存在了"hello",将不会创建对象

         String s4 = "hel" + "lo"; System.out.println(s1 == s4);

        //true String s5 = "hel"; String s6 = "lo";

         //s5和s6在编译期间无法确定,会在堆内存中创建对象,而s1不在常量池中,所以不相等

         System.out.println(s1 == (s5 + s6));

        //false System.out.println(s1.equals(s5 + s6)); //true

} }