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修饰。 修饰代码块:在类加载完之后执行代码块的内容。 父类静态代码块->子类静态代码块->父类非静态代码块->父类构造方法—>子类非静态代码块->子类构造方法
|
final
1 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):用于存放没有处理的任务,提供一种缓存机制。