测开面试知识点(二)

1:红黑树、AVL树、二叉排序树和完全二叉树

红黑树

红黑树详解

AVL树(平衡二叉树)

一颗平衡二叉排序树或者是空树,或者是具有以下性质的二叉排序树:
①左子树和右子树的高度之差的绝对值小于等于1;
②左子树和右子树也是平衡二叉排序树。

二叉排序树(又称二叉查找树,二叉搜索树)

是一种特殊的二叉树,定义为:二叉树排序树或者是一颗空树,或者是具有如下性质的二叉树:
①若它的左子树非空,则左子树上所有节点的值均小于根结点的值;
②若它的右子树非空,则右子树上所有节点的值均大于(大于或等于)根结点的值;
③它的左右子树也分别为二叉排序树

二叉排序树的中序遍历是一个递增的有序序列。

完全二叉树:

若设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边。即前h-1层满,第h层从右向左缺省。

2:静态变量、实例变量的区别

静态变量

也称为类变量,是被static修饰 符修饰的变量。可以直接用类名调用,也可以用对象调用,而且所有的对象的同一个类变量都是共享同一个内存空间的。

实例变量

也称为对象变量,没有static修饰 ,只能通过对象调用,而且所有对象的同一个实例变量是共享不同内存空间的。

区别:

  • 静态变量是所有对象共有的,某一个对象将它的值改变了,其他对象 再去获取它,得到的是改变后的值。
  • 实例变量则是每一个对象私有的,某一个对象将它的值改变了,不影响其他对象的取值结果,得到的仍是实例变量一开始被赋予的值。

3: 栈和队列的区别

栈(Stack)

是限定只能在表的一端进行插入和删除操作的线性表;

队列(Queue)

是限定只能在表的一端进行插入和另一端进行删除操作的线性表;
区别:

  • 操作名称不同:队列的插入称为入队,队列的删除称为出队。栈的插入称为进栈,栈的删除称为出栈
  • 操作的限定不同:队列是在队尾入队,队头出队,即两边都可操作。而栈的进栈和出栈都是在栈顶进行的,无法对栈底直接进行操作。
  • 操作的规则不同:队列 先进先出(FIFO);栈 先进后出(FILO)
  • 遍历数据速度不同:队列是基于地址指针进行遍历,而且可以从头部或者尾部进行遍历,但不能同时遍历,无需开辟空间,因为在遍历的过程中不影响数据结构,所以遍历速度要快。栈是只能从顶部取数据,也就是说最先进入栈底的,需要遍历整个栈才能取出来,而且在遍历数据的同时需要为数据开辟临时空间,保持数据在遍历前的一致性。

4:内存溢出和内存泄漏的区别

内存溢出(out of memory)

指程序申请内存时,没有足够的内存供申请者使用,导致数据无法正常存储到内存中。也就是说给你个int类型的存储数据大小的空间,但是却存储一个long类型的数据,这样就会导致内存溢出。

内存泄漏(memory leak)

当一个对象已经不需要在被使用本该被回收时,另外一个正在使用的对象持有他的引用从而导致他不能被回收,这导致本来被回收的对象不能被回收而停留在堆内存中,就产生了内存泄漏。
是指程序在申请内存后,无法释放已申请的内存空间,导致系统无法及时回收内存并且分配给其他进程使用。通常少次数的内存无法及时回收并不会到程序造成什么影响,但是如果在内存本身就比较少获取多次导致内存无法正常回收时,就会导致内存不够用,最终导致内存溢出。
常见的内存泄漏:
1、单例造成的内存泄漏
由于单例的静态特性使得其生命周期和应用的生命周期一样长,如果一个对象已经不再需要使用了,而单例对象还持有该对象的引用,就会使得该对象不能被正常回收,从而导致了内存泄漏。
2、非静态内部类创建静态实例造成的内存泄漏
非静态内部类默认会持有外部类的引用,而该非静态内部类又创建了一个静态的实例,该实例的生命周期和应用的一样长,这就导致了该静态实例一直会持有该Activity的引用,从而导致Activity的内存资源不能被正常回收。
3、Handler造成的内存泄漏
4、线程造成的内存泄漏
如果任务在Activity销毁之前还未完成,那么将导致Activity的内存资源无法被回收,从而造成内存泄漏。
5、资源未关闭造成的内存泄漏
对于使用了BraodcastReceiver,ContentObserver,File,Cursor,Stream,Bitmap等资源,应该在Activity销毁时及时关闭或者注销,否则这些资源将不会被回收,从而造成内存泄漏。
6、使用ListView时造成的内存泄漏
7、集合容器中的内存泄露
8、WebView造成的泄露

避免内存泄漏:
1、在涉及使用Context时,对于生命周期比Activity长的对象应该使用Application的Context。
2、对于需要在静态内部类中使用非静态外部成员变量(如:Context、View ),可以在静态内部类中使用弱引用来引用外部类的变量来避免内存泄漏。
3、对于不再需要使用的对象,显示的将其赋值为null,比如使用完Bitmap后先调用recycle(),再赋为null。
4、保持对对象生命周期的敏感,特别注意单例、静态对象、全局性集合等的生命周期。
5、对于生命周期比Activity长的内部类对象,并且内部类中使用了外部类的成员变量,可以这样做避免内存泄漏:
1)将内部类改为静态内部类
2)静态内部类中使用弱引用来引用外部类的成员变量

区别和关系:
  • 内存泄露是由于GC无法及时或者无法识别可以回收的数据进行及时的回收,导致内存的浪费;内存溢出是由于数据所需要的内存无法得到满足,导致数据无法正常存储到内存中。内存泄露的多次表现就是会导致内存溢出。
  • 内存泄露最终会导致内存溢出 ,由于系统中的内存是有限的,如果过度占用资源而不及时释放,最后会导致内存不足,从而无法给所需要存储的数据提供足够的内存,从而导致内存溢出。导致内存溢出也可能是由于在给数据分配大小时没有根据实际要求分配,最后导致分配的内存无法满足数据的需求,从而导致内存溢出。

5:表和视图

基本表是本身独立存在的表,在SQL中一个关系就对应一个表。视图是从一个或几个基本表导出的表。视图本身不存在独立存储在数据库中,是一个虚表。

6:存在ABC三个线程,需要让线程打印自己名字,三个线程按照ABC形式打印线程信息

涉及到线程执行顺序问题,需要使用join

public class ABCDemo extends Thread{
   
    private String threadName;
    private Thread thread;
    public ABCDemo(String threadName,Thread thread){
   
        this.thread = thread;
        this.threadName = threadName;
    }
    @Override
    public void run(){
   
        if(thread != null){
   
            try {
   
                thread.join();
            } catch (InterruptedException e) {
   
                e.printStackTrace();
            }
        }
        System.out.println
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值