🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[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、栈帧中存放着局部变量表、指向运行时常量池的引用、方法返回地址等。