2024-2024 Android 腾讯面试真题含参考答案,花2万块买的教程


1.Java内存模型

1.1 Jvm内存区域是如何划分的?

内存区域划分:

  • 程序计数器:当前线程的字节码执行位置的指示器,线程私有。

  • Java虚拟机栈:描述的Java方法执行的内存模型,每个方法在执行的同时会创建一个栈帧,存储着局部变量、操作数栈、动态链接和方法出口等,线程私有。

  • 本地方法栈:本地方法执行的内存模型,线程私有。

  • Java堆:所有对象实例分配的区域。

  • 方法区:所有已经被虚拟机加载的类的信息、常量、静态变量和即时编辑器编译后的代码数据。

1.2 Jvm内存模型是怎么样的?

1.Java规定所有变量的内存都需要存储在主内存。

2.每个线程都有自己的工作内存,线程中使用的所有变量以及对变量的操作都基于工作内存,工作内存中的所有变量都从主内存读取过来的。

3.不同线程间的工作内存无法进行直接交流,必须通过主内存完成。

主内存和工作内存之间的交互协议,即变量如何从主内存传递到工作内存、工作内存如何将变量传递到主内存,Java内存模型定义了8种操作来完成,并且每一种操作都是原子的,不可再分的。

1.3 Strings1="abc"和Strings2=newString(“abc”)的区别,生成对象的情况

1.指向方法区:"abc"是常量,所以它会在方法区中分配内存,如果方法区已经给"abc"分配过内存,则s1会直接指向这块内存区域。

2.指向Java堆:newString(“abc”)是重新生成了一个Java实例,它会在Java堆中分配一块内存。

所以s1和s2的内存地址肯定不一样,但是内容一样。

2. GC机制

2.1如何判断对象可回收?

判断一个对象可以回收通常采用的算法是引用几算法和可达性算法。由于互相引用导致的计数不好判断,Java采用的可达性算法。

可达性算法的思路是:通过一些列被成为GCRoots的对象作为起始点,自上往下从这些起点往下搜索,搜索所有走过的路径称为引用链,如果一个对象没有跟任何引用链相关联的时候,则证明该对象不可用,所以这些对象就会被判定为可以回收。

可以被当作GCRoots的对象包括:

  • Java虚拟机栈中的引用的对象

  • 方法区中静态属性引用的对象

  • 方法区中常量引用的对象

  • 本地方法中JNI引用的对象

2.2 GC的常用算法?
  • 标记-清除:首先标记出需要回收的对象,标记完成后统一回收所有被标记的对象。容易产生碎片空间。

  • 复制算法:它将可用的内存分为两块,每次只用其中的一块,当需要内存回收的时候,将存活的对象复制到另一块内存,然后将当前已经使用的内存一次性回收掉。需要浪费一半的内存。

  • 标记-整理:让存活的对象向一端移动,之后清除边界外的内存。

  • 分代搜集:根据对象存活的周期,Java堆会被分为新生代和老年代,根据不同年代的特性,选择合适的GC收集算法。

2.3MinarGC和FullGC的区别?
  • MinarGC:频率高、针对新生代。

  • FullGC:频率低、发生在老年代、通常会伴随一次MinarGC和速度慢。

2.4说一下四种引用以及他们的区别?
  • 强引用:强引用还在,垃圾搜集器就不会回收被引用的对象。

  • 软引用:对于软引用关联的对象,在系统发生内存溢出异常之前,将会把这些对象列进回收范围进行第二次回收,如果这次回收还没有足够的内存,才会抛出内存溢出异常。

  • 弱引用:被若引用关联的对象只能存活到下一次GC之前。

  • 虚引用:为对象设置虚引用的目的仅仅是为了GC之前收到一个系统通知。

3.类加载

3.1 类加载的过程?

类加载的过程可以分为:

1.加载:将类的全限定名转化为二进制流,再将二进制流转化为方法区中的类型信息,从而生成一个Class对象。

2.验证:对类的验证,包括格式、字节码、属性等。

3.准备:为类变量分配内存并设置初始值。

4.解析:将常量池的符号引用转化为直接引用。

5.初始化:执行类中定义的Java程序代码,包括类变量的赋值动作和构造函数的赋值。

6.使用

7.卸载

只有加载、验证、准备、初始化和卸载的这个五个阶段的顺序是确定的。

3.2类加载的机制,以及为什么要这样设计?

类加载的机制是双亲委派模型。大部分Java程序需要使用的类加载器包括:

  • 启动类加载器:由C++语言实现,负责加载Java中的核心类。

  • 扩展类加载器:负责加载Java扩展的核心类之外的类。

  • 应用程序类加载器:负责加载用户类路径上指定的类库。

双亲委派模型如下:

双亲委派模型要求出了顶层的启动类加载器之外,其他的类加载器都有自己的父加载器,通过组合实现。

双亲委派模型的工作流程:

当一个类加载的任务来临的时候,先交给父类加载器完成,父类加载器交给父父类加载器完成,知道传递给启动类加载器,如果完成不了的情况下,再依次往下传递类加载的任务。

这样设计的原因:

双亲委派模型能够保证Java程序的稳定运行,不同层次的类加载器具有不同优先级,所有的对象的父类Object,无论哪一个类加载器加载,最后都会交给启动类加载器,保证安全。

三、计算机网络部分


1. TCP与UDP的区别。

2.三次握手、四次挥手。为啥是三次不是两次?

3.HTTPS和HTTP的区别。HTTP2.0,3.0?

关于网络部分这里就不细说了,有想看的小伙伴可以看看这位博主写的关于面试的博文https://blog.csdn.net/weixin_47933729/article/details/117120255

四、Android面试题


1、什么是ANR如何避免它?

答:在Android上,如果你的应用程序有一段时间响应不够灵敏,系统会向用户显示一个对话框,这个对话框称作应用程序无响应(ANR:ApplicationNotResponding)对话框。用户可以选择让程序继续运行,但是,他们在使用你的应用程序时,并不希望每次都要处理这个对话框。因此,在程序里对响应性能的设计很重要这样,这样系统就不会显示ANR给用户。

不同的组件发生ANR的时间不一样,Activity是5秒,BroadCastReceiver是10秒,Service是20秒(均为前台)。

如果开发机器上出现问题,我们可以通过查看/data/anr/traces.txt即可,最新的ANR信息在最开始部分。

  • 主线程被IO操作(从4.0之后网络IO不允许在主线程中)阻塞。

  • 主线程中存在耗时的计算

  • 主线程中错误的操作,比如Thread.wait或者Thread.sleep等Android系统会监控程序的响应状况,一旦出现下面两种情况,则弹出ANR对话框

  • 应用在5秒内未响应用户的输入事件(如按键或者触摸)

  • BroadcastReceiver未在10秒内完成相关的处理

  • Service在特定的时间内无法处理完成20秒

修正:

1、使用AsyncTask处理耗时IO操作。

2、使用Thread或者HandlerThread时,调用Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND)设置优先级,否则仍然会降低程序响应,因为默认Thread的优先级和主线程相同。

3、使用Handler处理工作线程结果,而不是使用Thread.wait()或者Thread.sleep()来阻塞主线程。

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
img

学习分享

在当下这个信息共享的时代,很多资源都可以在网络上找到,只取决于你愿不愿意找或是找的方法对不对了

很多朋友不是没有资料,大多都是有几十上百个G,但是杂乱无章,不知道怎么看从哪看起,甚至是看后就忘

如果大家觉得自己在网上找的资料非常杂乱、不成体系的话,我也分享一套给大家,比较系统,我平常自己也会经常研读。

2021最新上万页的大厂面试真题

七大模块学习资料:如NDK模块开发、Android框架体系架构…

只有系统,有方向的学习,才能在段时间内迅速提高自己的技术。

这份体系学习笔记,适应人群:
**第一,**学习知识比较碎片化,没有合理的学习路线与进阶方向。
**第二,**开发几年,不知道如何进阶更进一步,比较迷茫。
**第三,**到了合适的年纪,后续不知道该如何发展,转型管理,还是加强技术研究。

由于文章内容比较多,篇幅不允许,部分未展示内容以截图方式展示 。

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
img
第一,**学习知识比较碎片化,没有合理的学习路线与进阶方向。

**第二,**开发几年,不知道如何进阶更进一步,比较迷茫。
**第三,**到了合适的年纪,后续不知道该如何发展,转型管理,还是加强技术研究。

由于文章内容比较多,篇幅不允许,部分未展示内容以截图方式展示 。

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-c8AMMS0J-1712592564267)]

  • 23
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值