Android面试题(2020)

本文详细探讨了Android面试中常见的Java基础、Android知识点、Http基础知识、算法等方面的问题,包括String类型的特性和与其他字符串类的区别、内存管理和线程同步、集合框架、并发控制、异常处理、设计模式以及Android中的activity生命周期、线程通信、事件分发、自定义View等核心概念,旨在帮助求职者全面准备Android面试。
摘要由CSDN通过智能技术生成

Java基础

  1. String是什么数据类型?(Java中数据类型)
    Java中数据类型分为两种:基本数据类型和引用数据类型。
    根据下图可以看出String为引用类型。在这里插入图片描述

  2. String、StringBuilder、StringBuffer的区别
    (1)String是字符串常量,一旦创建后就不可改变,String的拼接会创建新的字符串常量对象并回收之前的对象,频繁的String拼接对内存消耗较大,并且耗时。
    (2)StringBuilder就是为了解决频繁String拼接造成的问题,StringBuilder是可变长度的,频繁的拼接直接对对象进行修改,无需重新创建和销毁对象。
    (3)StringBuffer和StringBuilder类似,他俩的区别就是StringBuffer是线程安全的,无需考虑多个线程间数据同步问题,但效率会比StringBuilder慢一些。
    (4)总结下来就是String适合少量字符串操作,StringBuilder适合单线程内大量字符串操作,StringBuffer适合多线程中字符操作。

  3. 堆栈内存的区别(全局变量存放在哪里?)

  4. synchronized和volatile的区别
    (1)volatile仅能作用于变量,synchronized可以作用于变量、方法和类上
    (2)volatile仅能实现对变量的修改可见性,不能保证原子性,synchronized可以保证 原子性和可见性
    (3)volatile不会造成线程阻塞,synchronized可能会造成线程阻塞
    (4)volatile修饰的变量不会被编译器优化(在不同线程中不会出现副本),synchronized修饰的可以被编译器优化(但能保证原子性)。

  5. Java中锁的分类(synchronized用的是公平锁还是非公平锁)
    synchronized使用的是非公平锁,允许插队,提高性能。
    Java中锁的分类:参见该文章

  6. 抽象类和接口的区别
    (1)抽象类中可以定义普通成员变量,接口中只能定义static final变量,并且需要进行初始化
    (2)抽象类可以有构造方法,接口没有
    (3)抽象类中可以定义普通方法,接口中所有的方法都是抽象的
    (4)抽象类中的抽象方法可以定义为public或protected,接口中只能是public
    (5)一个类只能继承一个抽象类,但是可以实现多个接口
    (6)抽象类中可以包含静态方法,接口中不能有静态方法

  7. 什么时候一个对象会被GC(引用计数法、可达性分析)
    一个对象被GC,也就是对象无法被任何地方访问,那么如何进行判断呢,有两种常用方法。

    • 引用计数法:引用计数法就是给对象添加一个引用计数器,当对象被强引用的时候,计数+1,否则-1,如果对象的引用计数器为0,那么对象就没有被使用。该方法的优势就是高效,简单,但无法解决对象之间互相引用造成的问题。
    • 可达性分析:可达性分析就是通过一系列的被称为“GC Roots”的对象,从这些节点向下进行搜索,搜索走过的路径被称为引用链,当一个对象到GC Roots没有任何引用链时,证明这个对象是不可用的。JVM采用的就是这种方法。
  8. Java中集合相关问题

    • Java中集合都有哪些类型
      在这里插入图片描述

    • ArrayList和LinkedList的实现和区别
      ArrayList是由数组实现的,数组结构插入和删除速度慢,访问速度快。
      LinkedList是由链表实现的,链表结构插入和删除速度快,访问速度慢。

    • ArrayList初始长度、负载因子、增加倍数(同理其他的也有可能问到)
      ArrayList的初始长度为10,负载因子是1,扩容增量为0.5

    • ArrayList、Vector、copyonwriteArrayList的区别

    • HashMap的底层实现
      HashMap的实现原理是数组加链表或者红黑树来实现,当我们调用put方法时,先去获取key的hash值,然后根据hash值经过算法来确定bucket数组中的下标,如果该下标处没有值,则将node放置在这里,如果对应位置上有链表,则调用key的equals方法和链表上的每一个key进行比较,如果有重复的,那么对应的key位置将会被替换掉,如果没有,则添加到链表末尾。
      同理,调用put方法的时候,先调用key的hash值找到bucket对应下标,然后从链表中调用equals方法来获取我们需要找的value。

      HashMap中数组中某个下标处的链表大小超过8个时,将改为红黑树结构,小于8个时,重新改为链表结构。

    • HashMap中bocket的下标到底是怎么算的
      对传入的key取hashcode,然后对hashCode以及hashCode右移16位做异或运算

          static final int hash(Object key) {
      		int h;
  • 1
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值