2024-2024 Android 腾讯面试真题含参考答案,程序员如何自我学习和成长

15.说说你对Java反射的理解

在运行状态中,对任意一个类,都能知道这个类的所有属性和方法,对任意一个对象,都能调用它的任意一个方法和属性。这种能动态获取信息及动态调用对象方法的功能称为java语言的反射机制。

反射的作用:开发过程中,经常会遇到某个类的某个成员变量、方法或属性是私有的,或只对系统应用开放,这里就可以利用java的反射机制通过反射来获取所需的私有成员或是方法。

1)获取类的Class对象实例Classclz=Class.forName(“com.zhenai.api.Apple”);

2)根据Class对象实例获取Constructor对象ConstructorappConstructor=clz.getConstructor();

3)使用Constructor对象的newInstance方法获取反射类对象ObjectappleObj=appConstructor.newInstance();

4)获取方法的Method对象MethodsetPriceMethod=clz.getMethod(“setPrice”,int.class);

5)利用invoke方法调用方法setPriceMethod.invoke(appleObj,14);

6)通过getFields()可以获取Class类的属性,但无法获取私有属性,而getDeclaredFields()可以获取到包括私有属性在内的所有属性。带有Declared修饰的方法可以反射到私有的方法,没有Declared修饰的只能用来反射公有的方法,其他如Annotation\Field\Constructor也是如此。

二、Jvm


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秒(均为前台)。

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

深知大多数初中级安卓工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

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

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
img

总结

其实要轻松掌握很简单,要点就两个:

  1. 找到一套好的视频资料,紧跟大牛梳理好的知识框架进行学习。
  2. 多练。 (视频优势是互动感强,容易集中注意力)

你不需要是天才,也不需要具备强悍的天赋,只要做到这两点,短期内成功的概率是非常高的。

对于很多初中级Android工程师而言,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。下面资料部分截图是我花费几个月时间整理的,诚意满满:特别适合有3-5年开发经验的Android程序员们学习。

下面资料部分截图是我花费几个月时间整理的,诚意满满:特别适合有3-5年开发经验的Android程序员们学习。

[外链图片转存中…(img-koR5VjgG-1711271810831)]

  • 24
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值