Java
泛型 Generics
Author: Corissa
Date: Dec.31 2023 🎆
1ArrayList<E> extends AbstractList<E>
编译器可以对泛型参数进行检测,通过泛型参数可以指定传入对象的类型
1 分类泛型类,泛型接口,泛型方法
1.1 泛型类在实例化泛型时,必须指定具体类型
12345678910111213// 泛型类public class Generic<T>{ private T key; public Generic(T key) { this.key = key; } public T getKey(){ return key; }}// 实例化Generic<Character> generic = new Generic<Character>();
1.2 泛型接口泛型接口在子类实现时,可以选择实现或者不实现
1234567891011 ...
JVM(1) 内存
JVM 内存区域划分
Author: Corissa
Date: Dec 30 2023
1 运行时数据区域
JVM 在执行 Java 程序时会将管理的内存划分成多个不同的数据区域,其区域划分在 JDK1.7和1.8 有所不同(图源 JavaGuide):
可以看到在 JDK 1.8 中,运行时常量池被放置到了本地内存中。
这几个区域里,线程私有的有:虚拟机栈、本地方法栈和程序计数器;线程共有的有堆,方法区和直接内存区。
1.1 程序计数器
唯一一个不会出现 OutOfMemoryError 的区域
程序计数器可以看作是程序行号指示器,字节码解释器工作时依靠改变程序计数器来读取下一条需要执行的指令,实现代码流程的控制。
程序计数器是线程私有的,因为在线程切换后,程序需要回到正确的位置执行,为了避免线程之间的相互影响,每个线程有独立的程序计数器,独立存储。
1.2 Java 虚拟机栈
注意对比 StackOverFlowError & OutOfMemoryError
除了一些 Native 方法是通过本地方法栈实现的,其他所有方法都是通过栈来实现的。
Jav ...
Java对比项(3) 基本数据类型&包装类
基本数据类型 & 包装类
Author: Corissa 👵
Date: Dec.29 2023
重点需要掌握🏁:
理解 自动装箱/拆箱
包装类的缓存机制
为什么需要基本数据类型
1 基本数据类型和包装类的基本回顾
基本数据类型 8 种
byte (1 byte), char (2 byte), short (2 byte), int (4 byte), long (8 byte), float (4 byte), double (8 byte), boolean
对于 boolean,官方文档未明确定义,依赖于 JVM 厂商的具体实现。逻辑上理解是占用 1 位,但是实际中会考虑计算机高效存储因素。
8 种基本数据类型都有对应的包装类
Byte, Character, Short, Integer, Long, Float, Double, Boolean
基本数据类型 vs 包装类型
用途
包装类型可以用于泛型,而基本类型不可以
基本数据类型的使用场景比较局限,容器存储时也不能存储基本数据类型。
存储方式
基本数据类型的局部变量存储在 Jav ...
Java对比项(2) String&StringBuilder&StringBuffer
String & StringBuilder & StringBuffer
最熟悉的一集
Author: Corissa
Date: Dec.29 2023
重点需要掌握🏁:
理解 字符串 的设计,分类和实现
String 相关类的演进
JVM 对象缓存机制及相关优化
通过 String 学习基本的线程安全设计与实现
1 通用分析
String:
是 Java 中非常重要的类,提供了 构造和管理字符的基本逻辑。
String 是 Immutable 类,其类和属性都被声明为 final。
保存字符串的数组被 final 修饰且为private,并且String 类没有提供/暴露修改这个字符串的方法。
String 类被 final 修饰导致其不能被继承,进而避免了子类破坏 String 不可变。
由于其不可变性,在对 String 对象实例做拼接、裁剪等操作时都会产生新的 String 对象。当需要大量对字符串进行修改操作时,往往会影响到应用性能。
StringBuffer:
是字符串的可变类,且是线程安全的 (通过 synch ...
Java对比项(1) Exception&Error
Exception & Error 运行时异常 & 一般异常
长得一样怎么实际上天差地别 🦹♀️
Author: Corissa
Date: Dec.28 2023
重点需要掌握🏁:
理解 Throwable, Exception, Error 的设计和分类
掌握常见的子类,知道如何自定义异常
掌握实操中的元素和语法 (try-catch-finally, try-with-resource, multiple catch, throw, throws, AutoCloseable, Closeable )
1 对比分析Error & Exception 相同点
二者都继承了 Throwable 类,只有这个类型的实例才能被抛出 (throw) 或者捕获 (catch)。
他们是异常处理机制的基本组成类型。
源码中对 Throwable 类的描述如下:
The Throwable class is the superclass of all errors and exceptions in the Java language. Only obje ...
leetcode212 word-search-ii
Leetcode 212. 单词搜索II
Author: Carissa ⛽️
Date: Dec.28 2023 😈
Link: 212. 单词搜索 II - 力扣(LeetCode)
1 题目给定一个 m x n 二维字符网格 board 和一个单词(字符串)列表 words, 返回所有二维网格上的单词 。
单词必须按照字母顺序,通过 相邻的单元格 内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母在一个单词中不允许被重复使用。
提示:
m == board.length
n == board[i].length
1 <= m, n <= 12
board[i][j] 是一个小写英文字母
1 <= words.length <= 3 * 10^4
1 <= words[i].length <= 10
words[i] 由小写英文字母组成
words 中的所有字符串互不相同
示例 1:
输入: board = [[“o”,”a”,”a”,”n”],[“e”,”t”,”a”, ...
leetcode289 game-of-life
Leetcode 289. 生命游戏
Author: Carissa 🎀
Date: Dec.26 2023 🎄
Link: 289. 生命游戏 - 力扣(LeetCode)
1 题目根据 百度百科 , 生命游戏 ,简称为 生命 ,是英国数学家约翰·何顿·康威在 1970 年发明的细胞自动机。
给定一个包含 m × n 个格子的面板,每一个格子都可以看成是一个细胞。每个细胞都具有一个初始状态: 1 即为 活细胞 (live),或 0 即为 死细胞 (dead)。每个细胞与其八个相邻位置(水平,垂直,对角线)的细胞都遵循以下四条生存定律:
如果活细胞周围八个位置的活细胞数少于两个,则该位置活细胞死亡;
如果活细胞周围八个位置有两个或三个活细胞,则该位置活细胞仍然存活;
如果活细胞周围八个位置有超过三个活细胞,则该位置活细胞死亡;
如果死细胞周围正好有三个活细胞,则该位置死细胞复活;
下一个状态是通过将上述规则同时应用于当前状态下的每个细胞所形成的,其中细胞的出生和死亡是同时发生的。给你 m x n 网格面板 board 的当前状态,返回下一个状态。
提示:
m == boar ...
leetcode211 design-add-and-search-words-data-structure
Leetcode 211. 添加与搜索单词 - 数据结构设计
Author: Carissa 🎀
Date: Dec.26 2023 🎄
Link: 211. 添加与搜索单词 - 数据结构设计 - 力扣(LeetCode)
1 题目请你设计一个数据结构,支持 添加新单词 和 查找字符串是否与任何先前添加的字符串匹配 。
实现词典类 WordDictionary :
WordDictionary() 初始化词典对象
void addWord(word) 将 word 添加到数据结构中,之后可以对它进行匹配
bool search(word) 如果数据结构中存在字符串与 word 匹配,则返回 true ;否则,返回 false 。word 中可能包含一些 '.' ,每个 . 都可以表示任何一个字母。
提示:
1 <= word.length <= 25
addWord 中的 word 由小写英文字母组成
search 中的 word 由 ‘.’ 或小写英文字母组成
最多调用 104 次 addWord 和 search
示例 1:
输入:[“W ...
Leetcode 190. reverse_bits
Leetcode 190. 颠倒二进制位
Author: Carissa 🦋
Date: Dec.25 2023 🎄
Link: 190. 颠倒二进制位 - 力扣(LeetCode)
1 题目颠倒给定的 32 位无符号整数的二进制位。
提示:
请注意,在某些语言(如 Java)中,没有无符号整数类型。在这种情况下,输入和输出都将被指定为有符号整数类型,并且不应影响您的实现,因为无论整数是有符号的还是无符号的,其内部的二进制表示形式都是相同的。
在 Java 中,编译器使用二进制补码记法来表示有符号整数。因此,在 示例 2 中,输入表示有符号整数 -3,输出表示有符号整数 -1073741825。
示例 1:
输入:n = 00000010100101000001111010011100输出:964176192 (00111001011110000010100101000000)解释:输入的二进制串 00000010100101000001111010011100 表示无符号整数 43261596,因此返回 964176192,其二进制表示形式为 001110010 ...
Hello World
Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub.
Quick StartCreate a new post1$ hexo new "My New Post"
More info: Writing
Run server1$ hexo server
More info: Server
Generate static files1$ hexo generate
More info: Generating
Deploy to remote sites1$ hexo deploy
More info: Deployment