Android面试题总结(一)

1. overload 与 override 区别
    overload(重载) 与 override(重写)都体现了 Java 的多态性,但是 overload 是一个类的多态性体现,override 是父类与子类之间多态性的体现。
    overload:同一个类中定义多个方法,方法名相同,但参数类型或参数个数或参数的顺序不同。overload可以改变返回值类型。
    override:子类定义与父类中方法的方法名、参数、返回值都相同的方法。

2. String、StringBuffer、StringBuilder 区别
    String 为字符串常量,一旦创建不可以被修改,是线程安全的;String 类使用 final 修饰符,不可以被继承;String 的长度是不变的。适用于少量操作的字符串。
    StringBuffer 为字符串变量,长度是可变的,线程安全。适用于多线程下在字符缓冲区进行大量字符串操作
    StringBuilder 为字符串变量,长度是可变的,线程不安全。适用于单线程下在字符缓冲区进行大量字符串操作。
    字符串操作在执行速度:StringBuilder > StringBuffer > String

3. 抽象类(abstract) 与 接口(interface) 区别
    抽象类是由 abstract 修饰的类,该类可以被继承(extends),不能被实例化。抽象类中的方法可以有抽象方法(抽象方法子类必须重写),可以有普通方法。
    接口是由 Interface 修饰的类,该类可以被实现(implements),不能被实例化。接口中的方法只有抽象方法,默认使用 public 修饰,不能使用其他修饰符。接口中的字段都是公有常量,默认使用 public static final 修饰。

4. 介绍 List、Set、Map
   List、Set 接口 都是继承自 Collection 接口。
    List 接口 元素有序可重复,可存多个null值。
      ArrayList:动态数组实现轻量级,运行快,但线程不安全,查询操作快。
      Vector:动态数组实现重量级,运行慢,但线程安全。
      LinkedList:链表实现,增删操作快。
   Set 接口 元素无序不可重复,最多存一个null值。
      HashSet:是哈希表实现的,HashSet中的数据是无序的,最多存入一个null值,两者中的值都不能重复。底层用 hashCode() 算法实现, 保证元素的无序唯一, 自定义对象存进 HashSet 为了保证元素内容不重复需要覆盖 hashCode() 与 equals() 方法。
      TreeSet:是二差树(红黑树的树据结构)实现的,要求元素有序,自定义的对象需要实现 Comparable 接口的compareTo(object o) 方法。不允许存入null值。
   Map接口 元素是 key-value 形式存入,key 是唯一的,无序,value 可重复
      HashMap:基于哈希表实现。线程不安全。使用HashMap要求添加的键类明确定义了hashCode()和equals()[可以重写hashCode()和equals()],为了优化HashMap空间的使用,您可以调优初始容量和负载因子。允许 key 或 value 为 null 。
      HashTable:线程安全。不允许 key 或 value 为 null
5. 线程状态,run() 与 start() 的区别
    新建状态:新建一个线程对象;
    就绪状态:调用该线程对象的 start() 方法,该线程位于可运行线程池中,等待获取 CPU 使用权;
    运行状态:该线程获取到 CPU 使用权,执行 run() 方法;
    阻塞状态:该线程因为某种原因放弃 CPU 使用权,暂时停止运行。
    死亡状态:该线程执行完毕或因异常退出 run() 方法,该线程结束生命周期。
    阻塞情况分三种:
      1.等待阻塞:运行的线程执行 wait() 方法,该线程放弃 CPU 使用权;
      2.同步堵塞:运行线程在获取对象的同步锁时,该同步锁被其它线程占用,运行线程会被放入到锁池中。
      3.其他堵塞:运行的线程执行 sleep() 或 join() 方法,或发出了 I/O 请求。当 sleep()状态超时、 join()等待线程终止或者超时、 或者 I/O 处理完毕时, 线程重新转入就绪状态。sleep() 方法不会放弃CPU 使用权。
6. final、finally、finanlize 的区别
    final:修饰符,可以修饰类、方法、变量。修饰类表示该类不能作为父类被继承;修饰方法表示该方法不能被子类重写;修饰变量表示该变量不能被修改。
    finally:异常处理中使用,可以保证 finally 代码块一定被执行。经常使用在 try-catch-finally 或 try-finally 中关闭流等必须执行的操作。
    finanlize:是基础类 java.lang.Object 的一个方法,它的设计目的是保证对象在被垃圾收集前完成特定资源的回收。finalize 机制现在已经不推荐使用,并且在 JDK 9 开始被标记为 deprecated。
7. 强引用、软引用、弱引用、虚引用的区别
    强引用:最常见的普通对象引用,只要有强引用的存在,不管该对象是否闲置,垃圾收集器都不会去管理该对象。那什么时候会被回收呢?如果没有其他引用关系,只要超过了引用作用范围或者显示得将引用赋值为null,就可以被回收了。
    软引用:通过 SoftReference 类实现,它的生命周期要比强引用短一些,当内存不足才会被垃圾收集器回收。
    弱引用:通过 WeakReference 类实现,它的生命周期比软引用短一些,当垃圾收集器线程扫描到它的时候,不管内存是否不足都会被回收,不过垃圾收集器线程优先级很低,所以不一定会很快回收该对象。
    虚引用:又叫“幻象引用”,通过 PhantomReference 类实现,你不能通过它访问对象。幻象引用仅仅是提供了一种确保对象被 finalize 以后,做某些事情的机制。这个在日常开发中很少用到。
8. 请介绍 Exception、Error 以及之间的区别
    Exception 与 Error 同继承自 Throwable 类,在 Java 中只有 Throwable 类的实例才能被抛出(throw) 或者捕获(catch),它是异常处理机制的基本组成类型。
    Exception:程序正常运行中可以预料到的意外情况,可以被捕获并进行处理。可以分为可检查异常或不检查异常,可检查异常在代码中必须显式的进行捕获处理,这是编译期检查的一部分;不检查异常,即运行时异常,如 NullPointerException 等,可以通过代码避免的异常,该异常不会在编译期强制要求。
    Error:在正常情况下不大可能出现的情况,绝大部分的 Error 会导致程序处于不可运行与不可恢复状态。如 OutOfMemoryError 等。


PS: 对于 Java 基础知识,推荐大家订阅“极客时间”的“Java 核心技术36讲”,讲的很不错。当然这需要知识付费的!扫海报上的二维码可以返现6元,也不过才二十几块钱,还是听推荐大家学习一下的。这里写图片描述

猜你喜欢

转载自blog.csdn.net/Android_Programmer/article/details/80681515
今日推荐