01

Android 内存泄漏的原因以及解决方案

1、内存泄漏指对象不再使用,本该被回收,却因为有其他正在使用的对象持有该对象的引用,而无法被JVM回收

2、内存泄漏的影响:

  1. 应用可用内存减少,增加堆内存压力

  2. 频繁触发GC,会降低了应用的性能

  3. 到一定程序会导致内存溢出错误

3、Android开发中常见内存泄漏及解决办法

  1. 静态变量生命周期与应用的生命周期一样,如果静态变量持有某个Activity的上下文,则对应Activity无法释放,导致内存泄漏(单例模式) 解决办法:使用Application的上下文

  2. 匿名内部类与非静态内部类因为都会持有外部类引用,当执行异步操作易导致内存泄漏 解决办法:将非静态内部类转为静态内部类+WeakReferenct的方式

  3. Handler消息队列存在延时消息导致内存泄漏 在onDestroy方法中调用Handler相应的方法移除回调和删除消息

  4. 各种注册的监听器忘记移除导致内存泄漏 解决办法:在onDestroy方法中取消注册

  5. 资源对象未关闭导致内存泄漏,如(IO,数据库,Bitmap等) 解决办法:及时关闭资源

  6. 属性动画未取消导致内存泄漏(如无限轮播图效果) 解决办法:onDestroy方法中取消动画

  7. 其他解决办法:使用AAC框架

4、内存泄漏排查工具: AS Monitor,MAT,LeakCanary

5、扩展: Java内存管理,GC

02

HashMap和Hashtable的区别

HashMap是map接口的子类,是将键映射到值的对象,其中键和值都是对象,并且不能包含重复键,但可以包含重复值。HashMap允许null key和null value,而hashtable不允许。

HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口,由于非线程安全,效率上可能高于Hashtable。

HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。

Hashtable继承自Dictionary类,而HashMap是Java1.2引进的Map interface的一个实现。

Hashtable的方法是Synchronize的,而HashMap不是,在多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap 就必须为之提供外同步。但是如果使用Java 5或以上的话,可以用ConcurrentHashMap代替Hashtable。

Hashtable和HashMap采用的hash/rehash算法都大概一样,所以性能不会有很大的差。

03

ScrollView嵌套ListView的解决方案及其原理

自定义ListView 解决:重写其中的onMeasure()方法

原因: ScrollView默认把Childview设置为UNSPEFEIED模式,而该模式下的ListView给自己的测量的高度就是第一个item的高度.原理:

int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);

这个方法的作用是根据大小和模式来生成一个int值,这个int值封装了模式和大小信息.

首先MeasureSpec类是View的一个静态内部类,MeasureSpec类封装了从父布局到子布局传递的布局需求. 每个MeasureSpec对象代表了宽度和高度的要求.

MeasureSpec用int类型表示,前2位代表模式,后30位代表大小. 第一个参数

Integer.MAX_VALUE >> 2:Integer.MAX_VALUE

获取到int的最大值,但是表示大小的值size是int数值的底30位,所以把这个值右移两位,留出高两位表示布局模式. 此时这个值仍旧是一个30位所能表示的最大数,用该数作为控件的size,应该足够满足控件大小的需求. 第二个参数MeasureSpec.AT_MOST:表示这个控件适配父控件的最大空间.

(以下三种仅供参考,不推荐使用) 2.手动设置ListView高度 3.使用单个ListView取代ScrollView中所有内容 4.使用LinearLayout取代ListView

参考资料:

https://juejin.im/entry/5979ab4d5188253e3271c953

https://juejin.im/post/5a322cbf6fb9a045204c3da1

04

String,StringBuilder,StringBuffer的区别

可变不可变 String:字符串常量,在修改时不会改变自身;若修改,等于重新生成新的字符串对象。 StringBuffer:在修改时会改变对象自身,每次操作都是对 StringBuffer 对象本身进行修改,不是生成新的对 象;使用场景:对字符串经常改变情况下,主要方法:append(),insert()等。

线程是否安全 String:对象定义后不可变,线程安全。 StringBuffer:是线程安全的(对调用方法加入同步锁),执行效率较慢,适用于多线程下操作字符串缓冲区 大量数据。 StringBuilder:是线程不安全的,适用于单线程下操作字符串缓冲区大量数据。

共同点 StringBuilder 与 StringBuffer 有公共父类AbstractStringBuilder(抽象类)。StringBuilder、StringBuffer的方法都会调用AbstractStringBuilder 中的公共方法,如 super.append(...)。 只是 StringBuffer 会在方法上加 synchronized 关键字,进行同步。最后,如果程序不是多线程的,那么使用 StringBuilder 效率高于 StringBuffer。

05

谈谈你的职场规划

主要看的是面试者对自己的定位,这样便于让企业去识别这个人的培养方向。问完这个问题会有第二个问题你有没有想过如何达成你的目标,这个通常看面试者的规划能力,说的越详细越好。

有目标并有清晰规划的人,通常这类人自驱力比较强的人。一般没有明确目标和清晰规划的人我是不会招的。

还有企业文化,通常我问面试者是否认同我们的企业文化,不认同技术再好也不行。

06

结束语

原文

Java 内存、HashMap、Hashtable面试题相关推荐

  1. Java中HashMap和TreeMap的区别深入理解,java开发面试笔试题

    我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家. 扫描二维码或搜索下图红色VX号,加VX好友,拉你进[程序员面试学习交流群]免费领取.也欢迎各位一起 ...

  2. Java 里的HashMap(HashTable) 简介.

    之前已经介绍过Java的另1个容器HashSet.  其实HashMap的存储原来跟HashSet区别不大, 可以说是HashSet的1个扩展. 一,预备知识: 哈希表 我们可以把哈希表看做是1个特别 ...

  3. Java 集合系列14之 Map总结(HashMap, Hashtable, TreeMap, WeakHashMap等使用场景)

    概要 学完了Map的全部内容,我们再回头开开Map的框架图. 本章内容包括: 第1部分 Map概括 第2部分 HashMap和Hashtable异同 第3部分 HashMap和WeakHashMap异 ...

  4. Java—Map集合详解(HashMap/Hashtable/LinkedHashMap/Properties/TreeMap/WeakHashMap/IdentityHashMap/EnumMap)

    关注微信公众号:CodingTechWork,一起学习进步. Map Map集合介绍   Map(也称为字典.关联数组)是用于保存具有映射关系的数据,保存两组值,key和value,这两组值可以是任何 ...

  5. 【Java】HashMap 和 Hashtable 的 6 个区别

    转载:https://mp.weixin.qq.com/s?__biz=MzI3ODcxMzQzMw==&mid=2247487842&idx=1&sn=9974be8f5d9 ...

  6. JAVA 映射HashMap和HashTable的区别和实用

    JAVA 映射HashMap和HashTable的区别和实用 /*  * @author Mr liu  *   * 基本格式:HashMap<key,vaule>  * 面试题  * H ...

  7. 【java】HashMap底层实现原理及面试题

    目录 一.哈希表(散列) 1.什么是哈希表 2.什么是哈希冲突(面试题) 3.解决哈希冲突的方法(面试题) (1) 开放地址法 ① 线性探查 ②二次探查 ③随机探查 (2) 再哈希法 (3) 链地址法 ...

  8. java中HashMap,LinkedHashMap,TreeMap,HashTable的区别

    java为数据结构中的映射定义了一个接口java.util.Map;它有四个实现类,分别是HashMap Hashtable LinkedHashMap 和TreeMap Map主要用于存储健值对,根 ...

  9. 面试题:请介绍⼀下 JMM(Java 内存模型)

    面试题:请介绍⼀下 JMM(Java 内存模型) 关键词 CPU缓存一致性协议(例如MESI),多个CPU核心之间缓存不会出现不同步的问题 Store Buffer.Load Buffer和L1之间却 ...

  10. java yang模型_一道面试题引发的对Java内存模型的一点疑问

    一道面试题引发的对Java内存模型的一点疑问 问题描述如上图所示程序,按道理,子线程会通过 num++ 操作破坏 while 循环的条件,从而终止循环,执行最后的输出操作.但在我的多次运行中,偶尔会出 ...

最新文章

  1. 2017《面向对象程序设计》课程作业八
  2. ip guard保证java代码安全_IP-guard加密新增四大功能 让一“密“防百疏
  3. java中qq中拉伸的文件,delphi中如何实现QQ中的截图并实现拉伸放大移动的功能
  4. NET问答: 如何取消或中止 Task 执行 ?
  5. 小爱同学app安卓版_小爱课程表3.0全新升级 课表倒入更简单所有手机能用
  6. Apache 服务器端安装配置(Windows版本)
  7. linux实现标准设备输入输出,Linux的标准输入和输出
  8. HTML基金会2----联系,像, 第,对齐
  9. Eclipse—如何为Eclipse开发工具中创建的JavaWeb工程创建Servlet
  10. spring-第八篇之容器中的bean的生命周期
  11. 数字金额转化大写金额函数
  12. 大厂标配的动态化解决方案,高阶技术从未如此简单
  13. UE4 DataAsset 的使用
  14. 网工神器:PNETLab模拟器踩坑过程
  15. 《我是一只IT小小鸟》读后感,献给要正在找工作的有缘朋友
  16. 苹果三代耳机_Airpods pro苹果三代无线蓝牙耳机
  17. 什么是GPT模型,GPT下载和国内镜像
  18. 字符串常量池、class常量池和运行时常量池
  19. 暗黑再临Java增值版_暗黑破坏神-黑暗再临2.0巴尔归来【修改版】
  20. 元学习概述(Meta-Learning)

热门文章

  1. 简便方法搭建Harbor镜像仓库
  2. Retrofit之CallAdapter简单解析
  3. 藏不住了,Flink 未来发展的最新方向在这里!
  4. mysql时间10位数字_mysql—MySQL数据库中10位时间戳转换为标准时间后,如何对标准时间进行加减X天处理...
  5. 平板竖屏_朱海舟吐槽iPad办公体验:大量竖屏应用缺乏适配
  6. 帆软动态显示参数据控件(invisible,visible)
  7. curl 安装_实用干货——如何使用curl命令下载文件
  8. serve注解是加在哪个类_PHP 8新特性之Attributes(注解)
  9. img 转esxi vmdk_KVM qcow2、raw、vmdk等镜像格式和转换
  10. spring boot入门之——2.0新特性以及模块化构建