1 谈谈对时间复杂度和空间复杂度的理解
答: 时间复杂度和空间复杂度一般是基于算法而言的,是衡量一个算法是否高效的标准。
误区一:时间复杂度并不是执行一个算法的时间。
误区二:算法不单单是只冒泡排序等等才称为算法,可能一个循环或者一个判断都可能成为算法,理解是不冲突的。
时间复杂度:只算法执行语句的次数 O(1) ,O(n),O(logn),O(n2)
空间复杂度:算法在运行过程中所占内存的大小。。。。
2 数组和链表结构简单的对比
答:以arrylist和linkedlist举例,arrylist是一个数组的形式,具有角标,因此arrylist的查询效率非常快,时间复杂度为o(1),但插入和查出效率低,因为插入或删除一条数据需要改变他前面和后面数据的下标,并且在创建arrylist时需要确定好(他的长度默认是10),如果创建arrylist时没有确定好他的大小,可能会造成内存占比过大,或数组过小,并且arrylist他需要连续的内存空间。
linkedlist:他是一个动态链表的形式,他不具备下标,所以他的查询效率比较低,但是他的插入和删除的效率比较高,在插入或者删除一个数据时,只需要将他之前的数据指向她之后的数据即可。并且它分为了单链表,双链表,和循环链表。
具体的应用,如果是为了快速的查到一条数据使用arrylist,但若是对数据频繁的添加和删除则使用linkedlist。
3:怎么遍历一个树
答:递归
4 手写一个排序方法
答:冒泡排序
public static void main(String[] args) {
int arr [] = {8,6,1,3,5,2};
for(int i = 0 ; i<arr.length-1 ; i++){
for(int j =0 ; j<arr.length-1-i ; j++){
if(arr[j] < arr[j+1]){
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
}
5:java的数据类型有几种?
答:有两种,分为基本类型和引用类型两大类,基本类型又分为八种,分别是byte,short,boolean,int,float,double,long,cahr,
引用类型分为 :数据,对象,接口,集合等。
6: java创建对象的方式有几种?
答:我知道的有1:通过new关键字创建对象,2:通过反射创建对象,3如果对象接口实现类cloneable接口可以调用clone获取对象(浅克隆),4,反序列化创建对象
7:谈谈单例模式
答:单例模式就是内存中只有一个·实例对象,要防止他多线程破坏,防止反射,反序列化
例如:饿汉式,懒汉式,双重检查锁等。
8:手写饿汉式,懒汉式,双重检查锁
答:饿汉式包含statis关键字,它随着类的加载而加载,优先于对象存在,修饰成员,修饰方法,静态代码块,修饰内部类。
饿汉式缺点:过于占用内存。
优点: 是线程安全的
public class demo(){
private static demo i = new demo();
private demo(){
}
public static demo getDemo(){
return i;
}
}
懒汉式:用final关键字修饰,修饰类(不能继承)修饰方法(不能重写)修饰成员(不能改变)
插嘴问:重写和重载的区别:
答:重写是有父类的关键字,剩下的一摸一样,但权限修饰大于等于父类
重载:在一个类中,方法名一样,参数不同,与返回值无关。
public class demo(){
private static demo i = null;
private demo(){
}
public static synchronized demo getDemo(){
if (i==null){
i = new demo();
}
return i;
}
}
优点:延迟加载,占用内存小
缺点:加锁,效率低。
双重检检查锁:
public class demo(){
private static volatile demo i = null;
private demo(){
}
public static demo getDemo(){
if (i==null){//检查提高效率
synchronized (demo.class){
if (i==null){//检查线程安全
i = new demo();
}
}
}
return i;
}
}
扩展:静态内部类
public class demo(){
private demo(){
}
public static demo getDemo(){
return InnerDemo.i;
}
static class InnerDemo(){
private static demo i = new demo();
}
}
优点:没加锁,线程安全,延迟加载的目的,内部不使用不会加载该类。