基础面试二

作者: casual_v | 来源:发表于2019-10-24 16:28 被阅读0次

以下内容来自 微信公众号:终端研发部

Java

静态内部类、内部类、匿名内部类,为什么内部类会持有外部类的引用?持有的引用是this?还是其它?

静态内部类:使用static修饰的内部类

内部类:就是在某个类的内部又定义了一个类,内部类所嵌入的类称为外部类

匿名内部类:使用new生成的内部类

因为内部类的产生依赖于外部类,持有的引用是类名.this

Java中try catch finally的执行顺序

先执行try中代码,如果发生异常执行catch中代码,最后一定会执行finally中代码

equals与==的区别:

==是判断两个变量或实例是不是指向同一个内存空间 equals是判断两个变量或实例所指向的内存空间的值是不是相

Object有哪些公用方法?

方法equals测试的是两个对象是否相等

方法clone进行对象拷贝

方法getClass返回和当前对象相关的Class对象

方法notify,notifyall,wait都是用来对给定对象进行线程同步的

String、StringBuffer与StringBuilder的区别

String 类型和 StringBuffer 类型的主要区别其实在于 String 是不可变的对象

StringBuffer和StringBuilder底层是 char[]数组实现的

StringBuffer是线程安全的,而StringBuilder是线程不安全的

Java的四种引用的区别

强引用:如果一个对象具有强引用,它就不会被垃圾回收器回收。即使当前内存空间不足,JVM 也不会回收它,而是抛出 OutOfMemoryError 错误,使程序异常终止。如果想中断强引用和某个对象之间的关联,可以显式地将引用赋值为null,这样一来的话,JVM在合适的时间就会回收该对象
软引用:在使用软引用时,如果内存的空间足够,软引用就能继续被使用,而不会被垃圾回收器回收,只有在内存不足时,软引用才会被垃圾回收器回收。

弱引用:具有弱引用的对象拥有的生命周期更短暂。因为当 JVM 进行垃圾回收,一旦发现弱引用对象,无论当前内存空间是否充足,都会将弱引用回收。不过由于垃圾回收器是一个优先级较低的线程,所以并不一定能迅速发现弱引用对象

虚引用:顾名思义,就是形同虚设,如果一个对象仅持有虚引用,那么它相当于没有引用,在任何时候都可能被垃圾回收器回收。

介绍垃圾回收机制

标记回收法:遍历对象图并且记录可到达的对象,以便删除不可到达的对象,一般使用单线程工作并且可能产生内存碎片

标记-压缩回收法:前期与第一种方法相同,只是多了一步,将所有的存活对象压缩到内存的一端,这样内存碎片就可以合成一大块可再利用的内存区域,提高了内存利用率

复制回收法:把现有内存空间分成两部分,gc运行时,它把可到达对象复制到另一半空间,再清空正在使用的空间的全部对象。这种方法适用于短生存期的对象,持续复制长生存期的对象则导致效率降低。

分代回收发:把内存空间分为两个或者多个域,如年轻代和老年代,年轻代的特点是对象会很快被回收,因此在年轻代使用效率比较高的算法。当一个对象经过几次回收后依然存活,对象就会被放入称为老年的内存空间,老年代则采取标记-压缩算法

集合数据框架

你用过哪些集合类,数据结构中用于存储数据的有哪些

数组

数组存储区间是连续的,占用内存严重,故空间复杂的很大。但数组的二分查找时间复杂度小,为O(1);数组的特点是:寻址容易,插入和删除困难;

链表

链表存储区间离散,占用内存比较宽松,故空间复杂度很小,但时间复杂度很大,达O(N)。链表的特点是:寻址困难,插入和删除容易。

哈希表:由数组+链表组成的

当我们往HashMap中put元素的时候,先根据key的hashCode重新计算hash值,根据hash值得到这个元素在数组中的位置(即下标)

如果数组该位置上已经存放有其他元素了,那么在这个位置上的元素将以链表的形式存放,新加入的放在链头,最先加入的放在链尾。

如果数组该位置上没有元素,就直接将该元素放到此数组中的该位置上。

ArrayList,LinkedList的区别

ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。

对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。

对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。

ArrayList和Vector的主要区别是什么?

ArrayList 和Vector底层是采用数组方式存储数据
Vector:

线程同步

当Vector中的元素超过它的初始大小时,Vector会将它的容量翻倍,

ArrayList:

线程不同步,但性能很好

当ArrayList中的元素超过它的初始大小时,ArrayList只增加50%的大小

HashMap和 HashTable 的区别:

HashTable比较老,是基于Dictionary 类实现的,HashMap 则是基于 Map接口实现的

HashTable 是线程安全的, HashMap 则是线程不安全的

HashMap可以让你将空值作为一个表的条目的key或value

算法相关

1.排序算法和稳定性,快排什么时候情况最坏?

2.给最外层的rootview,把这个根视图下的全部button背景设置成红色,手写代码,不许用递归

算法原理:
  • Android的view视图是按树形结构分布,所以按树形结构遍历

  • 循环判断每一层的ViewGroup元素,将其入栈;否则判断当前view是否是Button类实例,是则改写背景色

  • 当前ViewGroup检查childView完成后,判断栈是否非空,取出栈顶元素ViewGroup重复步骤2直至栈为空。

Thread、AsynTask

wait()和sleep()的区别

sleep来自Thread类,和wait来自Object类

调用sleep()方法的过程中,线程不会释放对象锁。而 调用 wait 方法线程会释放对象锁

sleep睡眠后不出让系统资源,wait让出系统资源其他线程可以占用CPU

sleep(milliseconds)需要指定一个睡眠时间,时间一到会自动唤醒

若Activity已经销毁,此时AsynTask执行完并且返回结果,会报异常吗?

当一个App旋转时,整个Activity会被销毁和重建。当Activity重启时,AsyncTask中对该Activity的引用是无效的,因此onPostExecute()就不会起作用,若AsynTask正在执行,折会报 view not attached to window manager 异常

同样也是生命周期的问题,在 Activity 的onDestory()方法中调用Asyntask.cancal方法,让二者的生命周期同步

Activity销毁但Task如果没有销毁掉,当Activity重启时这个AsyncTask该如何解决?

还是屏幕旋转这个例子,在重建Activity的时候,会回掉Activity.onRetainNonConfigurationInstance()重新传递一个新的对象给AsyncTask,完成引用的更新

Android 线程间通信有哪几种方式(重要)

共享内存(变量);

文件,数据库;

Handler;

Java 里的 wait(),notify(),notifyAll()

请介绍下 AsyncTask的内部实现,适用的场景是

AsyncTask 内部也是 Handler 机制来完成的,只不过 Android 提供了执行框架来提供线程池来

执行相应地任务,因为线程池的大小问题,所以 AsyncTask 只应该用来执行耗时时间较短的任务,

比如 HTTP 请求,大规模的下载和数据库的更改不适用于 AsyncTask,因为会导致线程池堵塞,没有

线程来执行其他的任务,导致的情形是会发生 AsyncTask 根本执行不了的问题。

网络相关

1.TCP三次握手

2.为什么TCP是可靠的,UDP早不可靠的?为什么UDP比TCP快?

  • TCP/IP协议高,因为其拥有三次握手双向机制,这一机制保证校验了数据,保证了他的可靠性。

  • UDP就没有了,udp信息发出后,不验证是否到达对方,所以不可靠。

  • 但是就速度来说,还是UDP协议更快,毕竟其无需重复返回验证,只是一次性的

http协议了解多少,说说里面的协议头部有哪些字段?

http(超文本传输协议)是一个基于请求与响应模式的、无状态的、应用层的协议;http请求由三部分组成,分别是:请求行、消息报头、请求正文。

HTTP消息报头包括普通报头、请求报头、响应报头、实体报头

https了解多少

HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。

谈谈 HTTP 中Get 和 Post 方法的区别

GET - 从指定的服务器中获取数据,明文发送内容

POST - 提交数据给指定的服务器处理

POST请求不能被缓存下来

POST请求不会保存在浏览器浏览记录中

以POST请求的URL无法保存为浏览器书签

POST请求没有长度限制

推送心跳包是TCP包还是UDP包或者HTTP包

心跳包的实现是调用了socket.sendUrgentData(0xFF)这句代码实现的,所以,当然是TCP包。

Fragment相关

Fragment 如何实现类似 Activity 栈的压栈和出栈效果的?

Fragment 的事物管理器内部维持了一个双向链表结构,该结构可以记录我们每次 add 的Fragment 和 replace 的 Fragment,然后当我们点击 back 按钮的时候会自动帮我们实现退栈操作。

Fragment 的好处:

Fragment 可以使你能够将 activity 分离成多个可重用的组件,每个都有它自己的生命周期和UI。

Fragment 可以轻松得创建动态灵活的 UI 设计,可以适应于不同的屏幕尺寸。从手机到平板电脑。

Fragment 是一个独立的模块,紧紧地与 activity 绑定在一起。可以运行中动态地移除、加入、交换等。

Fragment 提供一个新的方式让你在不同的安卓设备上统一你的 UI。

Fragment 解决 Activity 间的切换不流畅,轻量切换。

Fragment 替代 TabActivity 做导航,性能更好。

Fragment 在 4.2.版本中新增嵌套 fragment 使用方法,能够生成更好的界面效果

如何切换 fragement,不重新实例化

正确的切换方式是 add(),切换时 hide(),add()另一个 Fragment;再次切换时,只需 hide()当前, show()另一个

相关文章

  • 面试 基础(二)

    category 和 extension 的区别• category :分类有名字,类扩展没i有分类名字,是一种特...

  • 基础面试二

    以下内容来自 微信公众号:终端研发部 Java 静态内部类、内部类、匿名内部类,为什么内部类会持有外部类的引用?持...

  • 程序员找工作必备 PHP 基础面试题 (四)

    程序员找工作必备 PHP 基础面试题​ 程序员找工作必备 PHP 基础面试题(二) 程序员找工作必备 PHP 基础...

  • IOS基础面试二

    转载自:iOS 面试题 28、找出两个 UIView 的最近的公共 View,如果不存在,则输出 nil 。 分析...

  • java面试基础二

    1、面向对象的特征有哪些方面? 【基础】 答:面向对象的特征主要有以下几个方面: 1)抽象:抽象就是忽略一个主题中...

  • Android 面试基础二

    Service Service是Android四大组件之一是运行在主线程的,最好不要在Service中做一些耗时操...

  • Java面试基础(二)

    10、给我一个你最常见到的runtime exception 答:常见的运行时异常有如下这些ArithmeticE...

  • Python面试基础(二)

    1. 装饰器之functools.wraps 装饰器很好用极大地复用了代码,但是不可否认在给原函数使用装饰器后原函...

  • Java基础汇总

    [ 面试题 ] java基础 面试 | java基础 最近5年133个Java面试问题列表 40个Java集合面试...

  • Android面试题

    二、Android面试题 Android面试题包括Android基础,还有一些源码级别的、原理这些等。所以想去大公...

网友评论

    本文标题:基础面试二

    本文链接:https://www.haomeiwen.com/subject/qetdvctx.html