2018最新安卓面试大全(含BAT,网易,滴滴)----你面不上BAT的原因:面经宝典,都在这里啦

这篇博客详尽地梳理了Java和Android面试中的常见问题,涵盖Java的并发控制、数据结构、多线程概念,如sleep、wait、yield、join的区别,以及synchronized和volatile的差异。在Android部分,讨论了Activity生命周期、Service行为、UI绘制流程以及事件分发机制。此外,还深入探讨了Android进程保活、内存管理、跨进程通信和性能优化等主题,是准备面试的宝贵参考资料。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

废话不多说,直接进入正题。

童鞋们可以扫码右侧二维码,加入微信群,分享你的面试经历哦~

Java篇

1.Java中sleep、wait、yield、join的区别?

参考文章:
java sleep和wait的区别的疑惑?
多线程中的wait与sleep到底谁释放了锁
sleep() wait() yield() join()用法与区别
Java多线程-(5)线程的优先级、sleep()、yield()、join()
| 比较项| 归属| 是否释放锁|使用范围|是否需要捕获异常|是否能自我唤醒|进入状态|
|: ---- | :----- | :— |:— |:— |:— |:— |:— |
| sleep |Thread类 | 没有释放|任何地方|是|是|Blocked|
| wait | Object类 | 释放 |同步控制方法或者同步控制块中|否|否|Blocked|
|yield|Thread类 |没有释放|任何地方|是|有可能|runnable|
|join|Thread类 |没有释放|任何地方|是|能|runnable|

总结:
sleep是Thread类中的静态方法。无论是在a线程中调用b的sleep方法,还是b线程中调用a的sleep方法,谁调用,谁睡觉。

这里写图片描述

2.throw和throws有什么区别?

参考文章:
Java中throw和throws的区别

1、throws出现在方法函数头;而throw出现在函数体。
2、throws表示出现异常的一种可能性,并不一定会发生这些异常;throw则是抛出了异常,执行throw则一定抛出了某种异常。
3、两者都是消极处理异常的方式(这里的消极并不是说这种方式不好),只是抛出或者可能抛出异常,但是不会由函数去处理异常,真正的处理异常由函数的上层调用处理。

void doA(int a) throws Exception1,Exception3{
           try{
                 ......
           }catch(Exception1 e){
              throw e;
           }catch(Exception2 e){
              System.out.println("出错了!");
           }
           if(a!=b)
              throw new  Exception3("自定义异常");
}

3.接口和抽象类的区别是什么?

1、Java提供和支持创建抽象类和接口。它们的实现有共同点,不同点在于:
2、接口中所有的方法隐含的都是抽象的。而抽象类则可以同时包含抽象和非抽象的方法。
3、类可以实现很多个接口,但是只能继承一个抽象类
4、类可以不实现抽象类和接口声明的所有方法,当然,在这种情况下,类也必须得声明成是抽象的。
5、抽象类可以在不提供接口方法实现的情况下实现接口。
6、Java接口中声明的变量默认都是final的。抽象类可以包含非final的变量。
7、Java接口中的成员函数默认是public的。抽象类的成员函数可以是private,protected或者是public。
8、接口是绝对抽象的,不可以被实例化。抽象类也不可以被实例化,但是,如果它包含main方法的话是可以被调用的。

4.为什么接口中只能定义常量?

从上一道问题的6,7中我们其实已经可以得到答案了。

接口中只能定义常量,即使你的代码是这样写的:public int a,底层语言也会默认加上public static final int a转为常量,那么这是为什么呢?
  我们都知道,接口中不能定义方法的实现,但是抽象类中是可以定义变量、常量以及方法的实现的,所以我们可以将接口看为比抽象类更高层次的抽象,是特殊的抽象类。加入接口可以定义变量,因为接口中的方法都是抽象的,我们无法通过行为,例如set()方法来修改这一属性值。

5.Java支持多继承么?

Java中类不支持多继承,只支持单继承(即一个类只有一个父类)。 但是java中的接口支持多继承,,即一个子接口可以有多个父接口。(接口的作用是用来扩展对象的功能,一个子接口继承多个父接口,说明子接口扩展了多个功能,当类实现接口时,类就扩展了相应的功能)。

6.什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”?

Java虚拟机是一个可以执行Java字节码的虚拟机进程。Java源文件被编译成能被Java虚拟机执行的字节码文件。
Java是平台无关的语言是指用Java写的应用程序不用修改就可在不同的软硬件平台上运行。平台无关有两种:源代码级和目标代码级。C和C++具有一定程度的源代码级平台无关,表明用C或C++写的应用程序不用修改只需重新编译就可以在不同平台上运行。
Java主要靠Java虚拟机(JVM)在目标码级实现平台无关性。JVM是一种抽象机器,它附着在具体操作系统之上,本身具有一套虚机器指令,并有自己的栈、寄存器组等。但JVM通常是在软件上而不是在硬件上实现。(目前,SUN系统公司已经设计实现了Java芯片,主要使用在网络计算机NC上。另外,Java芯片的出现也会使Java更容易嵌入到家用电器中。)JVM是Java平台无关的基础,在JVM上,有一个Java解释器用来解释Java编译器编译后的程序。Java编程人员在编写完软件后,通过Java编译器将Java源程序编译为JVM的字节代码。任何一台机器只要配备了Java解释器,就可以运行这个程序,而不管这种字节码是在何种平台上生成的。另外,Java采用的是基于IEEE标准的数据类型。通过JVM保证数据类型的一致性,也确保了Java的平台无关性。

从上面可以看出java属于半编译,半解释型语言:
java的编译器先将其编译为class文件,也就是字节码;然后将字节码交由jvm(java虚拟机)解释执行;

7.JAVA中常用的数据结构

参考文章:
JAVA常用数据结构及原理分析

相关问题:
7.1HashMap和Hashtable的区别?

参考文章:
HashMap和Hashtable的区别
HashMap底层实现原理

1.两者最主要的区别在于Hashtable是线程安全,而HashMap则非线程安全
2.HashMap可以使用null作为key,而Hashtable则不允许null作为key
3.两者计算hash的方法不同

  • Hashtable计算hash是直接使用key的hashcode对table数组的长度直接进行取模
  • HashMap计算hash对key的hashcode进行了二次hash,以获得更好的散列值,然后对table数组长度取摸
    4.HashMap和Hashtable的底层实现都是数组+链表结构实现
7.2HashSet和HashMap的区别?
7.3我们能否让HashMap同步?
HashMap可以通过下面的语句进行同步:
Map m = Collections.synchronizeMap(hashMap);

8.synchronized 和volatile 关键字的作用/区别?

作用:
1)保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的。
2)禁止进行指令重排序。
区别:
volatile 本质是在告诉jvm 当前变量在寄存器(工作内存)中的值是不确定的,需要从主存中读取;synchronized 则是锁定当前变量,只有当前线程可以访问该变量,其他线程被阻塞住。
1.volatile 仅能使用在变量级别;synchronized 则可以使用在变量、方法、和类级别的
2.volatile 仅能实现变量的修改可见性,并不能保证原子性;synchronized 则可以保证变量的修改可见性和原子性
3.volatile 不会造成线程的阻塞;synchronized 可能会造成线程的阻塞。
4.volatile 标记的变量不会被编译器优化;synchronized 标记的变量可以被编译器优化

9.JAVA静态方法是否可以被继承?

参考文章:
JAVA静态方法是否可以被继承?

java中静态属性和静态方法可以被继承,但是没有被重写(overwrite)而是被隐藏.

10.简述class加载各阶段,Class Loader有哪些模型。

在java应用程序开发中,只有被jvm装载的class类型才能在程序中使用。只要生成的字节码符合jvm指令集和文件格式,就可以在jvm上运行,这为java的跨平台性提供条件。
字节码的装载过程分为3个阶段:加载,连接,初始化。其中连接包括3个步骤(验证,准备,解析)。
1)加载:处于class装载的第一个阶段,这时jvm必须完成通过类的全面获取类的二进制数据流,解析类的二进制数据流为方法区内的数据结构,创建java.lang.Class的实例。

2)连接:

  • 验证:验证字节码文件,保证加载的字节码是符合规范的。
  • 准备:正式为类变量(static修饰的变量)分配内存,并设置内变量的初始值,
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值