垃圾收集器与内存分配

一.判断对象是否存活的算法:

  1. 引用计数法:

    给对象添加一个引用计数器,每一个地方引用它时计数器加1;引用失效时计数器减1.为值为0的对象不可能再被使用.

    缺点:

    难以解决对象之间循环引用的问题(对象A引用对象B,对象B引用对象A,两个对象无实际意义)

  2. 可达性分析算法:

    通过一些称为”GC_ROOTS”的对象作为起点,开始向下搜索引用它的对象,这个过程走过的路径即”引用链”.当一个对象到”GC_ROOTS”没有任何引用链相连,证明此对象不存活.

阅读更多

虚拟机类加载机制

一.类加载时机:

  1. 类从加载到虚拟机内存~卸载出内存的生命周期(这些阶段通常是交叉混合进行的):

    加载 –> 验证 –> 准备 –> 解析 –> 初始化 –> 使用 –> 卸载

  2. 主动引用五种必须立即对类进行初始化的情况:

阅读更多

Java NIO

简介

Java NIO(New I/O)是 Java 1.4 中引入的一套新的 I/O API,它与传统的 Java I/O 模型相比具有以下优势:

  • 非阻塞 I/O:NIO 的 I/O 操作是非阻塞的,这意味着线程不会在 I/O 操作期间阻塞。这使得 NIO 非常适合高并发应用。
  • I/O 多路复用:NIO 支持 I/O 多路复用,这意味着一个线程可以同时处理多个 I/O 操作。这使得 NIO 能够有效地利用系统资源。
阅读更多

ArrayList 扩容

一 先从 ArrayList 的构造函数说起

ArrayList有三种方式来初始化,构造方法源码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
/**
* 默认初始容量大小
*/
private static final int DEFAULT_CAPACITY = 10;


private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};

/**
*默认构造函数,使用初始容量10构造一个空列表(无参数构造)
*/
public ArrayList() {
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}

/**
* 带初始容量参数的构造函数。(用户自己指定容量)
*/
public ArrayList(int initialCapacity) {
if (initialCapacity > 0) {//初始容量大于0
//创建initialCapacity大小的数组
this.elementData = new Object[initialCapacity];
} else if (initialCapacity == 0) {//初始容量等于0
//创建空数组
this.elementData = EMPTY_ELEMENTDATA;
} else {//初始容量小于0,抛出异常
throw new IllegalArgumentException("Illegal Capacity: "+
initialCapacity);
}
}


/**
*构造包含指定collection元素的列表,这些元素利用该集合的迭代器按顺序返回
*如果指定的集合为null,throws NullPointerException。
*/
public ArrayList(Collection<? extends E> c) {
elementData = c.toArray();
if ((size = elementData.length) != 0) {
// c.toArray might (incorrectly) not return Object[] (see 6260652)
if (elementData.getClass() != Object[].class)
elementData = Arrays.copyOf(elementData, size, Object[].class);
} else {
// replace with empty array.
this.elementData = EMPTY_ELEMENTDATA;
}
}

阅读更多

JDBC防止SQL注入

使用参数化查询(PreparedStatement)

参数化查询是防止SQL注入的最有效方法之一。通过将查询参数化,将用户提供的输入值作为参数传递给查询,而不是将输入值直接拼接到SQL语句中。这样可以确保输入值被正确地转义和处理,减少SQL注入的风险。

例如,以下代码使用Statement执行查询:

1
2
3
String sql = "SELECT * FROM users WHERE username = '" + username + "' AND password = '" + password + "'";
Statement stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery(sql);
阅读更多

算法-斐波那契数列

斐波那契数列

题目描述:

大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项。
n<=39

问题分析:

可以肯定的是这一题通过递归的方式是肯定能做出来,但是这样会有一个很大的问题,那就是递归大量的重复计算会导致内存溢出。另外可以使用迭代法,用fn1和fn2保存计算过程中的结果,并复用起来。

阅读更多

《计算机网络》总结

1. 计算机网络概述

1.1. 基本术语

  1. 结点 (node):网络中的结点可以是计算机,集线器,交换机或路由器等。
  2. 链路(link ) : 从一个结点到另一个结点的一段物理线路。中间没有任何其他交点。
  3. 主机(host):连接在因特网上的计算机。
阅读更多

2018年网易校招面试题

一 获得特定数量硬币问题

小易准备去魔法王国采购魔法神器,购买魔法神器需要使用魔法币,但是小易现在一枚魔法币都没有,但是小易有两台魔法机器可以通过投入x(x可以为0)个魔法币产生更多的魔法币。

魔法机器1:如果投入x个魔法币,魔法机器会将其变为2x+1个魔法币

魔法机器2:如果投入x个魔法币,魔法机器会将其变为2x+2个魔法币

小易采购魔法神器总共需要n个魔法币,所以小易只能通过两台魔法机器产生恰好n个魔法币,小易需要你帮他设计一个投入方案使他最后恰好拥有n个魔法币。

阅读更多

Java反射

何为反射?

如果说大家研究过框架的底层原理或者咱们自己写过框架的话,一定对反射这个概念不陌生。

反射之所以被称为框架的灵魂,主要是因为它赋予了我们在运行时分析类以及执行类中方法的能力。

通过反射你可以获取任意一个类的所有属性和方法,你还可以调用这些方法和属性。

反射的应用场景了解么?

像咱们平时大部分时候都是在写业务代码,很少会接触到直接使用反射机制的场景。

阅读更多

Hexo语法

分类

多级分类

默认状态下,一个文章只有一个分类,可以分多级

1
2
3
4
5
categories:
- 一级标题
- 二级标题
- 三级标题
- ...
阅读更多