面试题分享

文章讨论了时间复杂度和空间复杂度在评估算法效率中的作用,澄清了常见误解。数组与链表的特性被比较,包括查询、插入和删除的效率。接着,介绍了如何遍历树结构(递归方法),并给出了冒泡排序的示例代码。此外,文章还涵盖了Java中的数据类型和对象创建方式,以及单例模式的概念和实现方式。
摘要由CSDN通过智能技术生成

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();
        }


    }

优点:没加锁,线程安全,延迟加载的目的,内部不使用不会加载该类。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值