一.判断对象是否存活的算法:
引用计数法:
给对象添加一个引用计数器,每一个地方引用它时计数器加1;引用失效时计数器减1.为值为0的对象不可能再被使用.
缺点:
难以解决对象之间循环引用的问题(对象A引用对象B,对象B引用对象A,两个对象无实际意义)可达性分析算法:
通过一些称为”GC_ROOTS”的对象作为起点,开始向下搜索引用它的对象,这个过程走过的路径即”引用链”.当一个对象到”GC_ROOTS”没有任何引用链相连,证明此对象不存活.
引用计数法:
给对象添加一个引用计数器,每一个地方引用它时计数器加1;引用失效时计数器减1.为值为0的对象不可能再被使用.
缺点:
难以解决对象之间循环引用的问题(对象A引用对象B,对象B引用对象A,两个对象无实际意义)
可达性分析算法:
通过一些称为”GC_ROOTS”的对象作为起点,开始向下搜索引用它的对象,这个过程走过的路径即”引用链”.当一个对象到”GC_ROOTS”没有任何引用链相连,证明此对象不存活.
类从加载到虚拟机内存~卸载出内存的生命周期(这些阶段通常是交叉混合进行的):
加载 –> 验证 –> 准备 –> 解析 –> 初始化 –> 使用 –> 卸载
主动引用
五种必须立即对类进行初始化
的情况:
Java NIO(New I/O)是 Java 1.4 中引入的一套新的 I/O API,它与传统的 Java I/O 模型相比具有以下优势:
ArrayList有三种方式来初始化,构造方法源码如下:
1 | /** |
参数化查询是防止SQL注入的最有效方法之一。通过将查询参数化,将用户提供的输入值作为参数传递给查询,而不是将输入值直接拼接到SQL语句中。这样可以确保输入值被正确地转义和处理,减少SQL注入的风险。
例如,以下代码使用Statement执行查询:
1 | String sql = "SELECT * FROM users WHERE username = '" + username + "' AND password = '" + password + "'"; |
大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项。
n<=39
可以肯定的是这一题通过递归的方式是肯定能做出来,但是这样会有一个很大的问题,那就是递归大量的重复计算会导致内存溢出。另外可以使用迭代法,用fn1和fn2保存计算过程中的结果,并复用起来。
小易准备去魔法王国采购魔法神器,购买魔法神器需要使用魔法币,但是小易现在一枚魔法币都没有,但是小易有两台魔法机器可以通过投入x(x可以为0)个魔法币产生更多的魔法币。
魔法机器1:如果投入x个魔法币,魔法机器会将其变为2x+1个魔法币
魔法机器2:如果投入x个魔法币,魔法机器会将其变为2x+2个魔法币
小易采购魔法神器总共需要n个魔法币,所以小易只能通过两台魔法机器产生恰好n个魔法币,小易需要你帮他设计一个投入方案使他最后恰好拥有n个魔法币。
如果说大家研究过框架的底层原理或者咱们自己写过框架的话,一定对反射这个概念不陌生。
反射之所以被称为框架的灵魂,主要是因为它赋予了我们在运行时分析类以及执行类中方法的能力。
通过反射你可以获取任意一个类的所有属性和方法,你还可以调用这些方法和属性。
像咱们平时大部分时候都是在写业务代码,很少会接触到直接使用反射机制的场景。