android总结20道面试题(此章不全,为本人笔记,切莫深读,浅读即可)

本文总结了20道Android面试题,涵盖了JVM内存结构、程序计数器理解、垃圾回收机制、序列化与反序列化、字符串相关类、final关键字、数据结构、HashMap工作原理、类加载器、线程创建方式、同步方法的区别、HTTP与HTTPS协议、TCP与UDP的区别、Handler通信机制、内存优化策略以及性能优化实践。深入探讨了内存管理、并发处理和代码安全,是Android开发者面试必备知识。
摘要由CSDN通过智能技术生成

1:jvm内存:

1:jvm内存的话,主要就是分堆和栈,堆就是线程共有的,它分配对象呢都是分配道堆里,
还有就是线程私有的一块区域,就是说每个线程都有那个程序计数器,还有就是那个线程栈,
分为本地方法栈,和虚拟机栈,本地方法栈就是调用一些native相关的方法,放入本地方法栈中,
虚拟机栈就是咱平常开发调用方法的一个栈,它就是做了一个函数调用的一个过程,程序计数器,
就是说做线程切换时记录的它运行到了哪一个段然后保存的一个状态,做线程切换用,还有一块
就是保存类的信息,堆内存的话就是分代的,新创建的内存的话会放入新生代,经过垃圾回收
没有被回收的会放入到老年代。

2:程序计数器的理解:

每一个调用栈,也就是我们写的代码,它会被编译成一个2进制文件,
也就是。class文件,会被虚拟机翻译成汇编的指令,然后交给cpu去运行,如果我们的程序是
多线程的话,它需要cpu去分时轮转的,就是每一个线程会分配一段时间,当这个线程的
cpu时间用完之后它会切换到下一个线程去运行,在切换之前它会保存这个线程的状态,比如说
执行到了某一个指令它会保存下来,然后再去执行下一个线程,当伦完所有线程的时候,
回到这个线程的时候它会从这个保存的状态恢复出来再执行下一个指令。

3:jvm有时候会触发gc,gc触发场景,如何解决,讲一个案例

新生代和老年代用的是不一样的
新生代用的是复制的算法,首先新的对象会进入eden区,经过垃圾回收后会把对象放入一个survivor
区,然后它是分为了两块相等的区,每次都会将存活复制到一块survivor,然后将剩下的标记为垃圾
的对象给清理掉,标记复制算法。
因为它每次对象回收的年龄会增长1,它会有一个预值,如果经过多次回收还没有被回收的话,
它会认为这个对象是一个老年的对象,会进入老年代,老年代回收的话我会用cms垃圾回收器
老年代一般是不会进行gc的,除非说是它的内存沾满了,它才会触发gc,如果说新生代存放不下存活
对象的话也会放入到老年代,而老年代的算法呢是标记整理,这个非常的消耗时间。

4:写代码方面为了避免发生gc的情况会如何做:

如果说是局部变量的话,不用如何注意,因为它会随着线程栈,调用那个出栈时,也会一起随着线程一起
销毁掉。但是不要写特别大的对象,这样如果它新生代放不下的话会被放入到老年代,就会增加它
被Gc的几率。
如果是全局变量的话,如果确保它是用完的垃圾对象的话,会给它置为一个null,null之后垃圾回收器
会把那些没有引用的对象回收掉。

5:android中的序列化,s,p有什么区别:

为什么要序列化,什么是序列化,怎么做

为什么要序列化:
因为在工作中,我们需要将内存中的对象,持久化保存到硬盘上,或者通过网络传输给其他客户端的时候,
(比如说,传递对象到activity或者fragment需要放入到intent或者bundle中)
什么是序列化呢:
就是把对象转换成可储存可传输的状态,序列化后可以存储在本地或者用于网络传输
该则么做呢:
android中的两种方式:s,p接口,

S接口:
是java是java提供的一个接口(空实现)
我们使用的时候要实现这个接口,
还有一种方法声明SerialVersionUID,这个是什么意思呢?意思就是不指定也可以序列化,也就是反序列化(反序列化的时候,如果uid一致,就可以正常的反序列化)
序列化的原理是:在我们进行序列化的时候,会把这个uid写入序列化文件中,等反序列化的时候对比这个uid如果一致才可以反序列化,如果不指定uid的话会增加反序列化崩溃的风险。

6:String、StringBuilder与StringBuffer

String不可变,stringbuilder和stringbuffer可变,但是他们之间也是有区别的,比如说
stringbuilder是同步的,stringbuffer是不同步的,stringbuilder数据是安全的,但是效率低啊
,stringbuffer是数据不安全的,但是相比于stringbuilder来说效率还是挺高的。

7:final finally finalize

首先我对final的理解它是不能被继承的,因为final类的成员不会被覆盖,
如果我们确定这个类不会被扩展呢么就可以将其设计为fanil类,这样可以确保这个类不会被覆盖掉。

finally关键字一般在异常中使用,会配合try,catch一起使用,作用就是不管这个类是否发生异常,被finally
所修饰就一定会被执行。

finalize方法名,它是属于object类中的方法,finalize()方法是在垃圾收集器删除对象之前堆这个对象
调用的子类覆盖finalize()方法以整理系统资源或执行其他清理操作。

8:数据结构:

常见的数据结构有:线性链表,数组,栈,队列,树和二叉树

线性链表:
采用动态分配内存的形式实现,用一组任意的存储单元存放数据元素链表的,
一般为每个元素增设指针域,用来指向后继元素。

数组&#x

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值