1.八大基本类型都是什么。
数值型:int 、long、 short、byte
字符型:char
布尔型:boolean
引用数据类型:类(class)、接口(interface)、数组
2.String可以被继承吗?
不能,因为String类有final修饰,实现细节不允许改变。
3.String stringbuffer StringBuilder的区别。
String是字符常量,呗final修饰,不能被继承,当穿件之后既不能改变。(可以通过StringBuffer和StringBuilder创建String对象)
StringBuffer 字符串变量(线程安全的),也是final类别的,不允许被继承,其中大部分方法都进行了同步处理,包括常用的append方法也做了同步处理。
StringBuilder 字符串变量(非线程安全的),与StringBuffer都继承了同样的接口和类,除了没使用synchronized修饰外基本一致,不同点在于最后toString的时候会直接返回一个新对象。
4.ArrayList和LinkedList的区别。
ArrayList和LinkedList都实现了List的接口。
1.ArrayList是基于索引的数据接口,他的底层是数组,LinkedList是以元素列表的形式存储数据,每一个元素都会和他的前一个元素和后一个元素连接在一起。
2.LinkedList的插入、添加、删除的操作速度更快,当元素添加到集合的指定位置的时候,不需要重新计算大小和索引。
3.LinkedList更占内存,因为LinkedList为每一个节点存储了两个引用,一个指向前一个元素,一个指向后一个元素。
5.类实例化时进行的操作步骤(顺序)。
父类静态变量。
父类静态代码块、
子类静态变量、
子类静态代码块、
父类非静态变量、
父类构造函数、
子类非静态函数、
子类构造函数。
6.Map类说明。
Java.util.map主要有四个常用的实现类。分别是HashMap,Hashtable、LinkedHashMap和TreeMap。
1.HashMap:他根据HashCode值存储数据,在Map中插入、删除和定位元素,最好就是使用Hashmap,根据键能够直接获取到值,具有很快的访问速度,遍历时取得数据的数据是随机的。
2.LinkedHashMap是HashMap的一个子类,保存了记录的插入顺序,在遍历的时候要比HashMap慢,LinkedHashMap的遍历速度只与实际数据有关和容量无关,但是HashMap的遍历速度就和容量有关。
3.TreeMap实现Sortmap接口,能够把它保存的记录根据键值升序排列。
4.HashTable与HashMap类似,不同的是不允许键或者值为空,支持线程同步,即任一时刻只有一个线程能写HashTable,所以写入的速度比较慢。
一般情况下在map中插入、删除和定位元素,HashMap是最好的选择,如果需要自然排序或者是自定义排序使用TreeMap,如果要输出顺序和输入顺序一致,name使用LinkHashMap可以实现。
HashMap不支持线程同步,但是可以使用Collections的synchronizedMap方法使HashMap具有同步 的能力。
线程安全的map:
1.HashTable
HashTable的get/put方法都被synchronized关键字修饰,说明它们是方法级别阻塞的,它们占用共享资源锁,所以导致同时只能一个线程操作get或者put,而且get/put操作不能同时执行,所以这种同步的集合效率非常低,一般不建议使用这个集合。
2.SynchronizedMap
SynchronizedMap的实现方式是加了个对象锁,每次对HashMap的操作都要先获取这个mutex的对象锁才能进入,所以性能也不会比HashTable好到哪里去,也不建议使用。
3.ConcurrentHashMap
这个也是最推荐使用的线程安全的Map,也是实现方式最复杂的一个集合,每个版本的实现方式也不一样,在jdk8之前是使用分段加锁的一个方式,分成16个桶,每次只加锁其中一个桶,而在jdk8又加入了红黑树和CAS算法来实现。性能高,推荐使用
7.抽象类和接口的区别。
抽象类和接口都不能直接实例化。
1.抽象类要被子类继承,接口要被类实现。
2.接口只能做方法说明,抽象类里可以做方法申明,也可以做方法实现。
3.接口中定义的变量只能是公共的静态的常量,抽象类中的变量是普通变量。
4.抽象类里的抽象方法必须全部被子类实现,如果子类不实现全部的父类抽象方法,那么该子类只能是抽象类。同样,实现接口的时候的时候,如果不能全部实现接口方法,那么该类也只能是抽象类。
5.抽象方法只能申明,不能实现。
6.抽象类里面可以没有抽象方法。
7.如果一个类里面有抽象方法,那就是抽象类。
8.抽象方法因为要实现,所以不能是静态的也不能是私有的。
9.接口可继承接口,并且可以多继承几口,但类只能但继承。
8.面对对象的七大设计原则
1.开闭原则(OCP),对扩展开放,对修改关闭。即在使这个模块可以在不被修改的前提下被扩展。
2.里氏替换原则(LSP):在任何父类出现的时候都可以用他的子类来替代。
3.单一职责原则(SRP):高内聚低耦合。
4.接口隔离原则(ISP):一个接口不需要提供太多的行为,一个接口应该只提供一种对外的功能,不应该把所有的操作都封装到一个接口里。
5.依赖倒置原则(DIP):要依赖于抽象,不要依赖具体的实现。
6.迪米特原则(LOD):降低各个对象之间的耦合,提高系统的可维护性,各模块之间的通信只通过接口来通信,而不理会模块饿内部的工作原理,可以使各个模块耦合降到最低,促进软件的复用。
7.组合/聚合复用原则(CRP):尽量使用对象数组,而不是使用继承来达到复用的目的。该原则就是在一个新的对象里面使用一些已有的对象,使之成为新对象的油分:新对象通过像这些对象的委派达到复用已有功能的目的。
9.谈谈你所了解的设计模式
1.单例模式:(常用)所谓单例模式就是说无论程序如何运行,采用单例设计模式永远只会有一个实例化对象产生
(1)将采用单利设计模式的构造方法私有化。
(2) 在其内部产生该类的实例化对象,并将其封装成private static类型。
(3)定义一个静态方法返回该类的示例。
/**
*
* 单例模式的实现:饿汉式,线程安全 但效率比较低
*/
public class SingletonTest {
private SingletonTest() {
}
private static final SingletonTest instance = new SingletonTest();
public static SingletonTest getInstancei() {
return instance;
}
}
/**
* 单例模式的实现:饱汉式,非线程安全
*
*/
public class SingletonTest {
private SingletonTest() {
}
private static SingletonTest instance;
public static SingletonTest getInstance() {
if (instance == null)
instance = new SingletonTest();
return instance;
}
}
/**
* 线程安全,但是效率非常低
* @author vanceinfo
*
*/
public class SingletonTest {
private SingletonTest() {
}
private static SingletonTest instance;
public static synchronized SingletonTest getInstance() {
if (instance == null)
instance = new SingletonTest();
return instance;
}
}
/**
* 线程安全 并且效率高
*
*/
public class SingletonTest {
private static SingletonTest instance;
private SingletonTest() {
}
public static SingletonTest getIstance() {
if (instance == null) {
synchronized (SingletonTest.class) {
if (instance == null) {
instance = new SingletonTest();
}
}
}
return instance;
}
}