面试专栏

2019Android面试基础总结

2019-05-07  本文已影响80人  钱小袖

1.public、private、protected、默认(default也称friendly)

public: 公有变量,可供全局调用
protected: 可供本类,子类,同包下的其他类调用
default: 它是针对本包访问而设计的,任何处于本包下的类、接口、异常等,都可以相互访问,即使是父类没有用protected修饰的成员也可以
private: 只为本类提供

当前类 当前包 子类 外部包
public ✔️ ✔️ ✔️ ✔️
protected ✔️ ✔️ ✔️
default(friendly) ✔️ ✔️
private ✔️

2.http和https区别

1. https需要ca证书,一般免费证书较少,所以需要一定费用的
2. http是超文本传输协议,信息为明文传输。https是具有安全性的ssl加密传输协议
3. http和https使用的是完全不同的连接方式,http端口为80,https端口为443
4. http是简单链接,无状态的。https协议是有ssl+http协议构建的可进行加密传输、身份认证的网络协议,比http协议安全

3.android6.0、7.0.、8.0、9.0 新加特性

4.handle机制,Looper.loop()之后代码会执行吗,主线程为什么没有堵塞

5.SharedPreferences能跨进程访问吗?

6.TCP与UDP区别总结:

7.内存分析

image

内存计数中的类别如下所示:

即使您的应用中不使用 C++,您也可能会看到此处使用的一些原生内存,因为 Android 框架使用原生内存代表您处理各种任务,如处理图像资源和其他图形时,即使您编写的代码采用 Java 或 Kotlin 语言。

当连接至运行 Android 7.1 及更低版本的设备时,此分配仅在 Memory Profiler 连接至您运行的应用时才开始计数。 因此,您开始分析之前分配的任何对象都不会被计入。 不过,Android 8.0 附带一个设备内置分析工具,该工具可记录所有分配,因此,在 Android 8.0 及更高版本上,此数字始终表示您的应用中待处理的 Java 对象总数。

8.java面向对象思想理解

9.一个".java"源文件中是否可以包含多个类(不是内部类)?有什么限制?

10.如何理解浅拷贝和深拷贝

11.成员内部类、静态内部类、局部内部类和匿名内部类的理解,以及项目中的应用

Outer outer = new Outer();
Outer.Inner inner = outer.new Inner();
public void show(){
        final double tvMoney=10000;
        final double netMoney=20000;
        class AdverTeam{
            String teamName="shen_hua";
            //电视宣传
            public void tvShow(){
                System.out.println("宣传队是:"+teamName);
                System.out.println("这是电视宣传,学校名称"+schoolName+",业务内容:"+buss+",学校人数:"+studentNum+",宣传所需费用"+tvMoney);
            }
            //网络宣传
            public void netShow(){
                System.out.println("宣传队是:"+teamName);
                System.out.println("这是网络宣传,学校名称"+schoolName+",业务内容:"+buss+",学校人数:"+studentNum+",宣传所需费用"+netMoney);
            }
        }
        new AdverTeam().tvShow();
        new AdverTeam().netShow();
    };
btn.setOnClickListener(new OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        .....
                    }
                });

12. 阐述final、finally、finalize的区别。

这是三个不同的概念,只是因为长得较像而被出成了一道题

final
final是一个修饰符,用来修饰类,变量,方法

finally

finalize

13. finally 语句一定会执行吗

在极特殊的情况下可能不执行

- 调用了System.exit()方法
- JVM崩溃了

14. int和Integer有什么区别?

1.int是基本类型,Integer是int的包装类型
2.包装类型可以有一些自己的方法,引入包装类型可以使java更好的面向对象
3.每个基本类型都有其包装类:

原始类型: boolean,char,byte,short,int,long,float,double
包装类型:Boolean,Character,Byte,Short,Integer,Long,Float,Double
扩展1:
java5中引入了自动拆装箱功能,例如在比较时可以自动拆装箱
class AutoUnboxingTest {

    public static void main(String[] args) {
        Integer a = new Integer(3);
        Integer b = 3;                  // 将3自动装箱成Integer类型
        int c = 3;
        System.out.println(a == b);     // false 两个引用没有引用同一对象
        System.out.println(a == c);     // true a自动拆箱成int类型再和c比较
    }
}
扩展2:
一道和装箱有关的面试题
public class Test03 {

    public static void main(String[] args) {
        Integer f1 = 100, f2 = 100, f3 = 150, f4 = 150;

        System.out.println(f1 == f2); //true
        System.out.println(f3 == f4); //false
    }
}

分析:自动装箱时,使用的时Integer的valueof方法,当int在-128到127之间时,并不会new一个新的对象,而是直接使用常量池中的Integer

15. String是基本数据类型嘛

不是。String属于库函数

16. String和StringBuilder、StringBuffer的区别

String 是只读字符串,StringBuilder和StringBuffer可以改变,StringBuilder效率高,线程不安全,StringBuffer线程安全。 在拼接String时,使用+编译器会帮我们进行优化,使用StringBuilder进行拼接,这时+和StringBuilder没有多大区别。但当循环中使用+时,我们应该显示的使用StringBuilder,以防止多次调用new StringBuilder,造成不必要的性能浪费。

循环中使用+举例:
String str = "hello,world!";
        String result = "";

        for (int i = 0; i < loopCount; i++) {
            result += str;
        }
这个时候编译器会优化成
String str = "hello,world!";
        String result = "";

        for (int i = 0; i < loopCount; i++) {
            result = new StringBuilder(result).append(str).toString();
        }
多次new StringBuilder造成了性能浪费。

扩展例题
class StringEqualTest {

    public static void main(String[] args) {
        String s1 = "Programming";
        String s2 = new String("Programming");
        String s3 = "Program";
        String s4 = "ming";
        String s5 = "Program" + "ming";
        String s6 = s3 + s4;
        System.out.println(s1 == s2); // false
        System.out.println(s1 == s5); //true
        System.out.println(s1 == s6); //false
        System.out.println(s1 == s6.intern()); //true
        System.out.println(s2 == s2.intern()); //false
    }
}

解析:1. String是引用类型,这里 == 比较的是引用是否相同,即是否指向相同的地址
     2. 在new String对象时,会产生一个新的对象,并不会使用常量池中的字符串
     3. intern会在常量池中寻找该字符串(如果没有责新建),并返回他的地址

17. String s = new String("xyz");创建了几个字符串对象?

两个对象,一个是静态区的"xyz";一个是用new创建在堆上的对象。

18. Java中如何实现序列化,有什么意义。

1.序列化是将对象的状态信息转换为可以存储或传输的形式的过程。
2.java将对象序列化成了字节信息
3.java通过实现Serializable接口实现序列化

19.for-each与常规for循环的效率对比

  1. for-each 使代码更加简洁优雅
  2. for-each 实际上是通过迭代器(Iterator)实现的

20. java8 有哪些新特性

支持Lambda 表达式,方法引用,增加了新的时间工具类等

21.用最有效率的方法计算2乘以8?

2 << 3(左移n位相当于乘以2的n次方,右移n位相当于除以2的n次方)。

22.简述一下你了解的设计模式

所谓设计模式,就是一套被反复使用的代码设计经验的总结(情境中一个问题经过证实的一个解决方案)。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。设计模式使人们可以更加简单方便的复用成功的设计和体系结构。将已证实的技术表述成设计模式也会使新系统开发者更加容易理解其设计思路。 在GoF的《Design Patterns: Elements of Reusable Object-Oriented Software》中给出了三类(创建型[对类的实例化过程的抽象化]、结构型[描述如何将类或对象结合在一起形成更大的结构]、行为型[对在不同的对象之间划分责任和算法的抽象化])共23种设计模式,包括:Abstract Factory(抽象工厂模式),Builder(建造者模式),Factory Method(工厂方法模式),Prototype(原始模型模式),Singleton(单例模式);Facade(门面模式),Adapter(适配器模式),Bridge(桥梁模式),Composite(合成模式),Decorator(装饰模式),Flyweight(享元模式),Proxy(代理模式);Command(命令模式),Interpreter(解释器模式),Visitor(访问者模式),Iterator(迭代子模式),Mediator(调停者模式),Memento(备忘录模式),Observer(观察者模式),State(状态模式),Strategy(策略模式),Template Method(模板方法模式), Chain Of Responsibility(责任链模式)。 面试被问到关于设计模式的知识时,可以拣最常用的作答,例如:







持续更新中...

参考


Android面试之Java 基础篇

上一篇 下一篇

猜你喜欢

热点阅读