[TOC]
# ==和equals区别
`==`用来判断内存地址是否相同;`equals()`用来判断字符串的内容是否相同
# do...while循环
1、do…while 循环和 while 循环相似,不同的是,do…while 循环至少会执行一次。如果布尔表达式的值为 true,则语句块一直执行,直到布尔表达式的值为 false。
2、break 主要用在循环语句或者 switch 语句中,用来跳出整个语句块;break 跳出最里层的循环,并且继续执行该循环下面的语句。
3、continue 适用于任何循环控制结构中,作用是让程序立刻跳转到下一次循环的迭代。
# i++和++i区别
1、i++会先使用i的值,也就是将i的值加载到数据栈,在给i加1,最后使用数据栈中的值。
2、++i会先将i的值加1,再将增加后的值加载到数据栈,再使用数据栈中的值。
3、使用值的时候都是从数据栈顶去取值。
4、`int i = 0;i = i++;`该代码执行后i的值为0。
# int和Integer的区别
* int 是基本数据类型,Integer 是包装类
* Java中,会对 -128 到 127 的 Integer 对象进行缓存,当创建新的 Integer 对象时,如果符合这个这个范围,并且已有存在的相同值的对象,则返回这个对象,否则创建新的 Integer 对象
# 自动装箱和自动拆箱
1、自动装箱指 Java 自动将原始数据类型转换为对应的对象类型,如 int 变量转为 Integer 对象;将 Integer 对象自动转换为 int 类型值,叫做自动拆箱
2、自动装箱时编译器调用 valueOf 将原始类型值转换成对象
3、自动拆箱时,编译器通过调用类似 intValue(), doubleValue() 这类的方法将对象转换成原始类型值
4、自动装箱、拆箱主要发生在赋值时、方法调用时
# String、StringBuffer 和StringBuilder 的区别
1、String 是不可变对象,每次对 String 对象进行更改时,都会生成一个新的对象,然后将指针指向新的对象
2、StringBuffer 线程安全,使用时,每次都是直接对 StringBuffer 对象本身进行操作,并不生成新的对象
3、StringBuilder 非线程安全,和 StringBuffer 类似,单线程中性能比 StringBuffer 高
4、StringBuilder 如何避免不可变字符串分配的问题
# Java类型转换
1、Java中的类型转换分为基本数据类型转换和引用数据类型转换
2、基本数据类型转换分为自动转换和强制转换,自动转换指从位数低的类型向位数高的类型转换,强制类型转换指从位数高的类型向位数低的类型转换,会导致精度缺失
3、引用数据类型转换时,子类可以转换成父类,父类不一定可以转换为子类,父类引用引用的是子类对象时可以强制转换为子类,但是父类引用引用的是父类对象时,强制转换会抛出异常
# 介绍序列化
1、序列化指把应用层的对象或数据结构转换成一段连续的二进制串,反序列化指把二进制串转换成应用层的对象或数据结构
2、序列化按可读性可分为两类:二进制序列化、文本序列化(如 XML、JSON)以及半文本序列化。
3、文本序列化可读性、可编辑性好;二进制序列化不具有可读性,但解析速度更有优势
4、Java 中,有两种方式可以实现二进制序列化,既可以实现 Serializable 接口,也可以实现 Parcelable 接口。
5、在 Android 中,我们不应该使用 Serializable 接口。因为 Serializable 接口使用了反射机制,这个过程相对缓慢,而且往往会产生出很多临时对象,这样可能会触发垃圾回收器频繁地进行垃圾回收。相比而言,Parcelable 接口比 Serializable 接口效率更高,性能方面要高出 10x 多倍。
# Java垃圾回收机制分析
1、JVM栈记录了当前线程的方法调用,栈帧存储有方法参数、局部变量、返回地址。但引用的对象存储在堆中,所以方法调用结束后,对象会依旧存在于堆中,易造成内存泄漏。
2、Java的垃圾回收机制可以自动回收不再使用的对象占用的内存空间。
3、垃圾回收算法
有:引用计数算法、可达性分析算法、标记清除算法、复制算法、标记整理算法、分代回收算法。
a、引用计数算法中,每个对象包含一个计数器,有新的引用指向该对象时计数器加1,引用移除时计数器减1,计数器为0时回收对象,引用计数法有个缺陷是无法检测出循环引用。
b、可达性分析算法中,每个对象都有一个用于标示该对象是否可到达的标记信息。从根出发跟随所有的引用,就可以找到所有的可到达对象,不可到达对象就是需要垃圾回收的对象。
c、标记清除算法流程为,垃圾回收启动时,Java程序暂停运行,JVM从根出发找到所有的可达对象并标记,然后扫描整个堆找到不可达对象并清空。缺点是标记、清除的效率不高;会产生内存碎片。
d、复制算法为,将内存分为大小相等的两块,每次使用一块,使用完时将存活的对象复制到另一块,清空原来那块。在对象存活率较低时回收效率高,缺点是内存空间使用率只有一半。
e、标记整理算法下,找到所有的可达对象并标记后,将所有存活对象都向内存区域的一端移动,然后清理掉边界以外的内存区域。
d-1、分代回收算法下,堆分为三代:永久代、老年代、新生代,新生代又分为三个区域:eden区、from区和to区。
d-3、永久世代主要存放静态文件如Java静态类、方法等,对于垃圾回收没有显著影响。
d-4、分代回收流程为,上次垃圾回收后创建的对象叫新生对象,存放于eden区,eden区没有空间存放新生对象时,触发一次MinorGC,采用复制算法将eden区和from区的可达对象复制到to区,清空eden区和from区空间,此时from区和to区已交换;当to区也放不下eden和from区的可达对象时,将部分对象放到成熟世代;当成熟世代也已满时触发MajorGC,采用标记整理算法进行垃圾回收。
d-5、其中,即使to区没有满,JVM也会移动生命周期足够久远的对象到成熟世代;MinorGC发送频率较高,MajorGC发生频率较低。
# Java内存结构
1、堆是用来存储对象本身和数组的,在JVM中只有一个堆,因此堆是被所有线程共享的。
2、栈中存放着栈帧,每个栈帧分别对应一个被调用的方法,栈是线程私有的。
3、方法区存放着已经加载的类信息、常量池、静态变量以及方法代码的内存区域
4、方法的调用过程对应栈帧在虚拟机中入栈到出栈的过程。
5、栈帧中存放着局部变量表、指向运行时常量池的引用、方法返回地址等。
- 导读
- Java知识
- Java基本程序设计结构
- 【基础知识】Java基础
- 【源码分析】Okio
- 【源码分析】深入理解i++和++i
- 【专题分析】JVM与GC
- 【面试清单】Java基本程序设计结构
- 对象与类
- 【基础知识】对象与类
- 【专题分析】Java类加载过程
- 【面试清单】对象与类
- 泛型
- 【基础知识】泛型
- 【面试清单】泛型
- 集合
- 【基础知识】集合
- 【源码分析】SparseArray
- 【面试清单】集合
- 多线程
- 【基础知识】多线程
- 【源码分析】ThreadPoolExecutor源码分析
- 【专题分析】volatile关键字
- 【面试清单】多线程
- Java新特性
- 【专题分析】Lambda表达式
- 【专题分析】注解
- 【面试清单】Java新特性
- Effective Java笔记
- Android知识
- Activity
- 【基础知识】Activity
- 【专题分析】运行时权限
- 【专题分析】使用Intent打开三方应用
- 【源码分析】Activity的工作过程
- 【面试清单】Activity
- 架构组件
- 【专题分析】MVC、MVP与MVVM
- 【专题分析】数据绑定
- 【面试清单】架构组件
- 界面
- 【专题分析】自定义View
- 【专题分析】ImageView的ScaleType属性
- 【专题分析】ConstraintLayout 使用
- 【专题分析】搞懂点九图
- 【专题分析】Adapter
- 【源码分析】LayoutInflater
- 【源码分析】ViewStub
- 【源码分析】View三大流程
- 【源码分析】触摸事件分发机制
- 【源码分析】按键事件分发机制
- 【源码分析】Android窗口机制
- 【面试清单】界面
- 动画和过渡
- 【基础知识】动画和过渡
- 【面试清单】动画和过渡
- 图片和图形
- 【专题分析】图片加载
- 【面试清单】图片和图形
- 后台任务
- 应用数据和文件
- 基于网络的内容
- 多线程与多进程
- 【基础知识】多线程与多进程
- 【源码分析】Handler
- 【源码分析】AsyncTask
- 【专题分析】Service
- 【源码分析】Parcelable
- 【专题分析】Binder
- 【源码分析】Messenger
- 【面试清单】多线程与多进程
- 应用优化
- 【专题分析】布局优化
- 【专题分析】绘制优化
- 【专题分析】内存优化
- 【专题分析】启动优化
- 【专题分析】电池优化
- 【专题分析】包大小优化
- 【面试清单】应用优化
- Android新特性
- 【专题分析】状态栏、ActionBar和导航栏
- 【专题分析】应用图标、通知栏适配
- 【专题分析】Android新版本重要变更
- 【专题分析】唯一标识符的最佳做法
- 开源库源码分析
- 【源码分析】BaseRecyclerViewAdapterHelper
- 【源码分析】ButterKnife
- 【源码分析】Dagger2
- 【源码分析】EventBus3(一)
- 【源码分析】EventBus3(二)
- 【源码分析】Glide
- 【源码分析】OkHttp
- 【源码分析】Retrofit
- 其他知识
- Flutter
- 原生开发与跨平台开发
- 整体归纳
- 状态及状态管理
- 零碎知识点
- 添加Flutter到现有应用
- Git知识
- Git命令
- .gitignore文件
- 设计模式
- 创建型模式
- 结构型模式
- 行为型模式
- RxJava
- 基础
- Linux知识
- 环境变量
- Linux命令
- ADB命令
- 算法
- 常见数据结构及实现
- 数组
- 排序算法
- 链表
- 二叉树
- 栈和队列
- 算法时间复杂度
- 常见算法思想
- 其他技术
- 正则表达式
- 编码格式
- HTTP与HTTPS
- 【面试清单】其他知识
- 开发归纳
- Android零碎问题
- 其他零碎问题
- 开发思路