java基础 1,面向对象和面向过程的区别 2,java的三大特性
封装,继承,多态
3,OverLoad与Override的区别1
2
3
4
5
6
7
8
9
10
11
Override(重写,覆盖)
方法名、参数、返回值相同。
子类方法不能缩小父类方法的访问权限。
子类方法不能抛出比父类方法更多的异常(但子类方法可以不抛出异常)。
存在于父类和子类之间。
方法被定义为final不能被重写。
Overload(重载,过载)
参数类型、个数、顺序至少有一个不相同。
不能重载只有返回值不同的方法名。
存在于父类和子类、同类中。
4,构造器不能被修饰Override 5,访问控制符public,protected,private,以及默认的区别1
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的实现原理 见此链接 10,HashTable实现原理 见此链接 11,HashMap与HashTable的区别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对象的开始或者末尾进行插入操作没有特殊的地方;
使用场景 (1)查询操作多,ArrayList对象要远优于LinkedList对象;
(2)修改和删除操作多,LinkedList对象要远优于ArrayList对象;
14,static和final区别和用途 static 1
2
3
4
修饰变量:静态变量随着类被加载时被完全初始化,在内存中只有一个,并且JVM只会为它分配一次内存,所有类共享此变量。
修饰方法:在类加载时存在,不依赖任何实例,方法必须实现,不能用abstract修饰。
修饰代码块:在类加载完之后执行代码块的内容。
父类静态代码块->子类静态代码块->父类非静态代码块->父类构造方法—>子类非静态代码块->子类构造方法
final1
2
3
4
5
6
修饰变量:
编译器常量:类加载是完成初始化,编译后带入到任何计算中,只能基本数据类型。
运行时常量:基本数据类型或引用数据类型,引用不可变,但引用的类型可变。
修饰方法:方法不能被继承,不能被子类修改。
修饰类:不能被继承。
修饰形参:final形参不可变。
15,HashMap和ConcurrentHashMap的区别 HashMap不是线程安全的,ConcurrentHashMap是线程安全的。 ConcurrentHashMap将整个Hash桶进行了分段segment,每个segment上面都有锁的存在。 ConcurrentHashMap的锁的粒度越细,并发性能越好。
16,线程安全 定义:类的行为与其的规范一致。 如何保证线程安全: 对变量使用validate 对程序进行加锁 17,多线程如何进行信息交互 Object中的方法,wait,notify(),notifyAll()
18,多线程共用一个变量需要注意什么 在线程对象runnable中定义了全局变量,run方法会修改该变量时,如果有多个线程同时使用该变量时候,可能有错误发生。 ThreadLocal是JDK引入的一种机制,它用于解决线程的共享变量,使用ThreadLocal声明的变量,即使在线程中属于全局变量, 针对每个线程来讲,这个变量是独立的。 validate变量每次被线程访问时,都会使得线程从主内存中重读该变量的最新值,而该变量发生修改时,也是把修改的值写入到 内存中去。
19,线程池 基本组成部分: 线程管理器(ThreadPool) :用户创建并管理线程池,包括创建,摧毁线程池,添加新任务。 工作线程(poolwork):线程池中的线程,在没有任务时,处于等待状态,可以循环使用。 任务接口(Task):每个任务必须实现的接口,以供工作线程调度的执行,它主要规定了任务的入口, 任务完成的收尾工作,任务的执行状态等。 任务队列(Taskqueue):用于存放没有处理的任务,提供一种缓存机制。