java基础 1,面向对象和面向过程的区别
封装,继承,多态
3,OverLoad与Override的区别1
2
3
4
5
6
7
8
9
10
11
   Override(重写,覆盖) 
方法名、参数、返回值相同。
子类方法不能缩小父类方法的访问权限。
子类方法不能抛出比父类方法更多的异常(但子类方法可以不抛出异常)。
存在于父类和子类之间。
方法被定义为final不能被重写。
   Overload(重载,过载)
参数类型、个数、顺序至少有一个不相同。  
不能重载只有返回值不同的方法名。
存在于父类和子类、同类中。
4,构造器不能被修饰Override1
2
3
4
5
作用域      当前类      同包   子类    其他
public        √        √       √      √
protected     √        √       √      ×
default       √        √       ×      ×
private       √        ×       ×      ×
6,String和StringBuffer、StringBuilder的区别1
2
3
4
5
6
7
8
9
10
11
可变与不可变
String类中使用字符数组保存字符串,如下就是,因为有“final”修饰符,所以可以知道string对象是不可变的。
private final char value[];
StringBuilder与StringBuffer都继承自AbstractStringBuilder类,在AbstractStringBuilder中也是使用字符
数组保存字符串,如下就是,可知这两种对象都是可变的。
char[] value;
线程是否安全
StringBuffer对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。
StringBuilder并没有对方法进行加同步锁,所以是非线程安全的。
7,抽象类和接口的区别1
2
3
4
5
6
7
1 )抽象类可以提供成员方法的实现细节,而接口中只能存在public abstract 方法;
  2 )抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是public static final类型的;
  3 )接口中不能含有静态代码块以及静态方法,而抽象类可以有静态代码块和静态方法;
  4 )一个类只能继承一个抽象类,而一个类却可以实现多个接口。
8,自动装箱与拆箱1
2
3
4
5
6
7
8
9
10
11
12
基本数据类型的自动装箱(autoboxing)、拆箱(unboxing)是自J2SE 5.0 开始提供的功能。 
基本数据与对象的区别
如:int t = 1 ;     t.  后面是没有方法滴。
    Integer t =1 ; t.  后面就有很多方法可让你调用了。
Integer i = 100 ; // 自动装箱
相当于编译器自动为您作以下的语法编译:Integer i = Integer.valueOf(100 );
Integer i = 10 ; //装箱 
int t = i; //拆箱,实际上执行了 int t = i.intValue();    
注意:integer值得默认大小是-127 -128 
7,泛型1
2
3
4
5
6
泛型是Java SE 1.5 的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数,
类型擦除可以简单的理解为将泛型java代码转换为普通java代码,只不过编译器更直接点,
将泛型java代码直接转换成普通java字节码。
     类型擦除的主要过程如下:
     1. 将所有的泛型参数用其最左边界(最顶级的父类型)类型替换。
     2. 移除所有的类型参数。
8,Java中的集合类及其关系图1
2
3
4
5
6
7
8
9
10
11
12
 上述类图中,实线边框的是实现类,比如ArrayList,LinkedList,HashMap等,
  折线边框的是抽象类,比如AbstractCollection,AbstractList,AbstractMap等,
  而点线边框的是接口,比如Collection,Iterator,List等。
  	 		是否有序	是否允许元素重复
Collection		否		是
List			是		是
Set	AbstractSet	否		否
 	HashSet    	 否		否
 	TreeSet		是		否
Map	AbstractMap	否	使用key-value来映射和存储数据,key必须唯一,value可以重复
 	HashMap
 	TreeMap		是(用二叉排序树)
9,HashMap的实现原理1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
第一,继承不同。
public class Hashtable extends Dictionary implements Map
public class HashMap  extends AbstractMap implements Map
第二
Hashtable 中的方法是同步的,而HashMap中的方法在缺省情况下是非同步的。在多线程并发的环境下,
可以直接使用Hashtable,但是要使用HashMap的话就要自己增加同步处理了。
如果为了要线程安全,可以使用CurrentHashMap
第三
Hashtable中,key和value都不允许出现null 值。
在HashMap中,null 可以作为键,这样的键只有一个;可以有一个或多个键所对应的值为null 。当get()方法返回null 值时,即可以表示 HashMap中没有该键,也可以表示该键所对应的值为null 。因此,在HashMap中不能由get()方法来判断HashMap中是否存在某个键, 而应该用containsKey()方法来判断。
第四,两个遍历方式的内部实现上不同。
Hashtable、HashMap都使用了 Iterator。而由于历史原因,Hashtable还使用了Enumeration的方式 。
第五
哈希值的使用不同,HashTable直接使用对象的hashCode。而HashMap重新计算hash值。
第六
Hashtable和HashMap它们两个内部实现方式的数组的初始大小和扩容的方式。HashTable中hash数组默认大小是11 ,增加的方式是 old*2 +1 。HashMap中hash数组的默认大小是16 ,而且一定是2 的指数。
12,ArrayList和vector区别1
2
1 )  Vector的方法都是同步的(Synchronized),是线程安全的(thread-safe),而ArrayList的方法不是,由于线程的同步必然要影响性能,因此,ArrayList的性能比Vector好。 
2 ) 当Vector或ArrayList中的元素超过它的初始大小时,Vector会将它的容量翻倍,而ArrayList只增加50 %的大小,这样,ArrayList就有利于节约内存空间。
13,ArrayList和LinkedList区别及使用场景1
2
3
4
5
6
7
ArryList初始化时,elementData数组大小默认为10 ;
每次add()时,先调用ensureCapacity()保证数组不会溢出,如果此时已满,会扩展为数组length的1.5 倍+1 ,
然后用array.copy的方法,将原数组拷贝到新的数组中;线程不安全。
LinkedList是基于双链表实现的:
使用header的优点是:在任何一个条目(包括第一个和最后一个)都有一个前置条目和一个后置条目,
因此在LinkedList对象的开始或者末尾进行插入操作没有特殊的地方;
使用场景
   (2)修改和删除操作多,LinkedList对象要远优于ArrayList对象;
14,static和final区别和用途1
2
3
4
修饰变量:静态变量随着类被加载时被完全初始化,在内存中只有一个,并且JVM只会为它分配一次内存,所有类共享此变量。
修饰方法:在类加载时存在,不依赖任何实例,方法必须实现,不能用abstract修饰。
修饰代码块:在类加载完之后执行代码块的内容。
   父类静态代码块->子类静态代码块->父类非静态代码块->父类构造方法—>子类非静态代码块->子类构造方法
 final1
2
3
4
5
6
 修饰变量:
  编译器常量:类加载是完成初始化,编译后带入到任何计算中,只能基本数据类型。
  运行时常量:基本数据类型或引用数据类型,引用不可变,但引用的类型可变。
修饰方法:方法不能被继承,不能被子类修改。
修饰类:不能被继承。
修饰形参:final形参不可变。
15,HashMap和ConcurrentHashMap的区别
16,线程安全
18,多线程共用一个变量需要注意什么
19,线程池