Java 内存、HashMap、Hashtable面试题
01
Android 内存泄漏的原因以及解决方案
1、内存泄漏指对象不再使用,本该被回收,却因为有其他正在使用的对象持有该对象的引用,而无法被JVM回收
2、内存泄漏的影响:
应用可用内存减少,增加堆内存压力
频繁触发GC,会降低了应用的性能
到一定程序会导致内存溢出错误
3、Android开发中常见内存泄漏及解决办法
静态变量生命周期与应用的生命周期一样,如果静态变量持有某个Activity的上下文,则对应Activity无法释放,导致内存泄漏(单例模式) 解决办法:使用Application的上下文
匿名内部类与非静态内部类因为都会持有外部类引用,当执行异步操作易导致内存泄漏 解决办法:将非静态内部类转为静态内部类+WeakReferenct的方式
Handler消息队列存在延时消息导致内存泄漏 在onDestroy方法中调用Handler相应的方法移除回调和删除消息
各种注册的监听器忘记移除导致内存泄漏 解决办法:在onDestroy方法中取消注册
资源对象未关闭导致内存泄漏,如(IO,数据库,Bitmap等) 解决办法:及时关闭资源
属性动画未取消导致内存泄漏(如无限轮播图效果) 解决办法:onDestroy方法中取消动画
其他解决办法:使用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面试题相关推荐
- Java中HashMap和TreeMap的区别深入理解,java开发面试笔试题
我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家. 扫描二维码或搜索下图红色VX号,加VX好友,拉你进[程序员面试学习交流群]免费领取.也欢迎各位一起 ...
- Java 里的HashMap(HashTable) 简介.
之前已经介绍过Java的另1个容器HashSet. 其实HashMap的存储原来跟HashSet区别不大, 可以说是HashSet的1个扩展. 一,预备知识: 哈希表 我们可以把哈希表看做是1个特别 ...
- Java 集合系列14之 Map总结(HashMap, Hashtable, TreeMap, WeakHashMap等使用场景)
概要 学完了Map的全部内容,我们再回头开开Map的框架图. 本章内容包括: 第1部分 Map概括 第2部分 HashMap和Hashtable异同 第3部分 HashMap和WeakHashMap异 ...
- Java—Map集合详解(HashMap/Hashtable/LinkedHashMap/Properties/TreeMap/WeakHashMap/IdentityHashMap/EnumMap)
关注微信公众号:CodingTechWork,一起学习进步. Map Map集合介绍 Map(也称为字典.关联数组)是用于保存具有映射关系的数据,保存两组值,key和value,这两组值可以是任何 ...
- 【Java】HashMap 和 Hashtable 的 6 个区别
转载:https://mp.weixin.qq.com/s?__biz=MzI3ODcxMzQzMw==&mid=2247487842&idx=1&sn=9974be8f5d9 ...
- JAVA 映射HashMap和HashTable的区别和实用
JAVA 映射HashMap和HashTable的区别和实用 /* * @author Mr liu * * 基本格式:HashMap<key,vaule> * 面试题 * H ...
- 【java】HashMap底层实现原理及面试题
目录 一.哈希表(散列) 1.什么是哈希表 2.什么是哈希冲突(面试题) 3.解决哈希冲突的方法(面试题) (1) 开放地址法 ① 线性探查 ②二次探查 ③随机探查 (2) 再哈希法 (3) 链地址法 ...
- java中HashMap,LinkedHashMap,TreeMap,HashTable的区别
java为数据结构中的映射定义了一个接口java.util.Map;它有四个实现类,分别是HashMap Hashtable LinkedHashMap 和TreeMap Map主要用于存储健值对,根 ...
- 面试题:请介绍⼀下 JMM(Java 内存模型)
面试题:请介绍⼀下 JMM(Java 内存模型) 关键词 CPU缓存一致性协议(例如MESI),多个CPU核心之间缓存不会出现不同步的问题 Store Buffer.Load Buffer和L1之间却 ...
- java yang模型_一道面试题引发的对Java内存模型的一点疑问
一道面试题引发的对Java内存模型的一点疑问 问题描述如上图所示程序,按道理,子线程会通过 num++ 操作破坏 while 循环的条件,从而终止循环,执行最后的输出操作.但在我的多次运行中,偶尔会出 ...
最新文章
- 2017《面向对象程序设计》课程作业八
- ip guard保证java代码安全_IP-guard加密新增四大功能 让一“密“防百疏
- java中qq中拉伸的文件,delphi中如何实现QQ中的截图并实现拉伸放大移动的功能
- NET问答: 如何取消或中止 Task 执行 ?
- 小爱同学app安卓版_小爱课程表3.0全新升级 课表倒入更简单所有手机能用
- Apache 服务器端安装配置(Windows版本)
- linux实现标准设备输入输出,Linux的标准输入和输出
- HTML基金会2----联系,像, 第,对齐
- Eclipse—如何为Eclipse开发工具中创建的JavaWeb工程创建Servlet
- spring-第八篇之容器中的bean的生命周期
- 数字金额转化大写金额函数
- 大厂标配的动态化解决方案,高阶技术从未如此简单
- UE4 DataAsset 的使用
- 网工神器:PNETLab模拟器踩坑过程
- 《我是一只IT小小鸟》读后感,献给要正在找工作的有缘朋友
- 苹果三代耳机_Airpods pro苹果三代无线蓝牙耳机
- 什么是GPT模型,GPT下载和国内镜像
- 字符串常量池、class常量池和运行时常量池
- 暗黑再临Java增值版_暗黑破坏神-黑暗再临2.0巴尔归来【修改版】
- 元学习概述(Meta-Learning)
热门文章
- 简便方法搭建Harbor镜像仓库
- Retrofit之CallAdapter简单解析
- 藏不住了,Flink 未来发展的最新方向在这里!
- mysql时间10位数字_mysql—MySQL数据库中10位时间戳转换为标准时间后,如何对标准时间进行加减X天处理...
- 平板竖屏_朱海舟吐槽iPad办公体验:大量竖屏应用缺乏适配
- 帆软动态显示参数据控件(invisible,visible)
- curl 安装_实用干货——如何使用curl命令下载文件
- serve注解是加在哪个类_PHP 8新特性之Attributes(注解)
- img 转esxi vmdk_KVM qcow2、raw、vmdk等镜像格式和转换
- spring boot入门之——2.0新特性以及模块化构建