该备忘单是针对 Java 初学者的速成课程,有助于复习 Java 语言的基本语法。
# 入门
# Hello.java
public class Hello { | |
// 主要方法 | |
public static void main(String[] args) | |
{ | |
// 输出: Hello, world! | |
System.out.println("Hello, world!"); | |
} | |
} |
编译和运行
$ javac Hello.java | |
$ java Hello | |
Hello, world! |
# 变量 Variables
int num = 5; | |
float floatNum = 5.99f; | |
char letter = 'D'; | |
boolean bool = true; | |
String site = "jaywcjlove.github.io"; |
# 原始数据类型
数据类型
大小
默认
范围
byte
1 byte
0
-128 to 127
short
2 byte
0
-215 to 215-1
int
4 byte
0
-231 to 231-1
long
8 byte
0
-263 to 263-1
float
4 byte
0.0f
N/A
double
8 byte
0.0d
N/A
char
2 byte
\u0000
0 to 65535
boolean
N/A
false
true / false
# 字符串 Strings
String first = "John"; | |
String last = "Doe"; | |
String name = first + " " + last; | |
System.out.println(name); |
查看: Strings
# 循环 Loops
String word = "QuickRef"; | |
for (char c: word.toCharArray()) { | |
System.out.print(c + "-"); | |
} | |
// 输出: Q-u-i-c-k-R-e-f- |
查看: Loops
# 数组 Arrays
char[] chars = new char[10]; | |
chars[0] = 'a' | |
chars[1] = 'b' | |
String[] letters = {"A", "B", "C"}; | |
int[] mylist = {100, 200}; | |
boolean[] answers = {true, false}; |
查看: Arrays
# 交换变量 Swap
int a = 1; | |
int b = 2; | |
System.out.println(a + " " + b); // 1 2 | |
int temp = a; | |
a = b; | |
b = temp; | |
System.out.println(a + " " + b); // 2 1 |
# 类型转换 Type Casting
// Widening | |
// byte<short<int<long<float<double | |
int i = 10; | |
long l = i; // 10 | |
// Narrowing | |
double d = 10.02; | |
long l = (long)d; // 10 | |
String.valueOf(10); // "10" | |
Integer.parseInt("10"); // 10 | |
Double.parseDouble("10"); // 10.0 |
# 条件语句 Conditionals
int j = 10; | |
if (j == 10) { | |
System.out.println("I get printed"); | |
} else if (j > 10) { | |
System.out.println("I don't"); | |
} else { | |
System.out.println("I also don't"); | |
} |
查看: [Conditionals](# 条件语句 Conditionals)
# 用户输入
Scanner in = new Scanner(System.in); | |
String str = in.nextLine(); | |
System.out.println(str); | |
int num = in.nextInt(); | |
System.out.println(num); |
# Java 字符串
# 基本的
String str1 = "value"; | |
String str2 = new String("value"); | |
String str3 = String.valueOf(123); |
# 字符串连接
String s = 3 + "str" + 3; // 3str3 | |
String s = 3 + 3 + "str"; // 6str | |
String s = "3" + 3 + "str"; // 33str | |
String s = "3" + "3" + "23"; // 3323 | |
String s = "" + 3 + 3 + "23"; // 3323 | |
String s = 3 + 3 + 23; // 29 |
# 字符串生成器
StringBuilder sb = new StringBuilder(10); |
┌───┬───┬───┬───┬───┬───┬───┬───┬───┐ | |
| | | | | | | | | | | |
└───┴───┴───┴───┴───┴───┴───┴───┴───┘ | |
0 1 2 3 4 5 6 7 8 9 |
sb.append("Reference"); |
┌───┬───┬───┬───┬───┬───┬───┬───┬───┐ | |
| R | e | f | e | r | e | n | c | e | | |
└───┴───┴───┴───┴───┴───┴───┴───┴───┘ | |
0 1 2 3 4 5 6 7 8 9 |
sb.delete(3, 9); |
┌───┬───┬───┬───┬───┬───┬───┬───┬───┐ | |
| R | e | f | | | | | | | | |
└───┴───┴───┴───┴───┴───┴───┴───┴───┘ | |
0 1 2 3 4 5 6 7 8 9 |
sb.insert(0, "My "); |
┌───┬───┬───┬───┬───┬───┬───┬───┬───┐ | |
| M | y | | R | e | f | | | | | |
└───┴───┴───┴───┴───┴───┴───┴───┴───┘ | |
0 1 2 3 4 5 6 7 8 9 |
sb.append("!"); |
┌───┬───┬───┬───┬───┬───┬───┬───┬───┐ | |
| M | y | | R | e | f | ! | | | | |
└───┴───┴───┴───┴───┴───┴───┴───┴───┘ | |
0 1 2 3 4 5 6 7 8 9 |
# 比较
String s1 = new String("QuickRef"); | |
String s2 = new String("QuickRef"); | |
s1 == s2 // false | |
s1.equals(s2) // true | |
"AB".equalsIgnoreCase("ab") // true |
# 操纵
String str = "Abcd"; | |
str.toUpperCase(); // ABCD | |
str.toLowerCase(); // abcd | |
str.concat("#"); // Abcd# | |
str.replace("b", "-"); // A-cd | |
" abc ".trim(); // abc | |
"ab".toCharArray(); // {'a', 'b'} |
# 信息
String str = "abcd"; | |
str.charAt(2); // c | |
str.indexOf("a") // 0 | |
str.indexOf("z") // -1 | |
str.length(); // 4 | |
str.toString(); // abcd | |
str.substring(2); // cd | |
str.substring(2,3); // c | |
str.contains("c"); // true | |
str.endsWith("d"); // true | |
str.startsWith("a"); // true | |
str.isEmpty(); // false |
# 不可变
String str = "hello"; | |
str.concat("world"); | |
// 输出: hello | |
System.out.println(str); |
String str = "hello"; | |
String concat = str.concat("world"); | |
// 输出: helloworld | |
System.out.println(concat); |
一旦创建就不能修改,任何修改都会创建一个新的 String
# Java 数组
# 声明 Declare
int[] a1; | |
int[] a2 = {1, 2, 3}; | |
int[] a3 = new int[]{1, 2, 3}; | |
int[] a4 = new int[3]; | |
a4[0] = 1; | |
a4[2] = 2; | |
a4[3] = 3; |
# 修改 Modify
int[] a = {1, 2, 3}; | |
System.out.println(a[0]); // 1 | |
a[0] = 9; | |
System.out.println(a[0]); // 9 | |
System.out.println(a.length); // 3 |
# 循环 (读 & 写)
int[] arr = {1, 2, 3}; | |
for (int i=0; i < arr.length; i++) { | |
arr[i] = arr[i] * 2; | |
System.out.print(arr[i] + " "); | |
} | |
// 输出: 2 4 6 |
# Loop (Read)
String[] arr = {"a", "b", "c"}; | |
for (int a: arr) { | |
System.out.print(a + " "); | |
} | |
// 输出: a b c |
# 二维数组 Multidimensional Arrays
int[][] matrix = { {1, 2, 3}, {4, 5} }; | |
int x = matrix[1][0]; // 4 | |
// [[1, 2, 3], [4, 5]] | |
Arrays.deepToString(matrix) | |
for (int i = 0; i < a.length; ++i) { | |
for(int j = 0; j < a[i].length; ++j) { | |
System.out.println(a[i][j]); | |
} | |
} | |
// 输出: 1 2 3 4 5 6 7 |
# 排序 Sort
char[] chars = {'b', 'a', 'c'}; | |
Arrays.sort(chars); | |
// [a, b, c] | |
Arrays.toString(chars); |
# Java 条件语句
# 运算符
+
(加法运算符 (也用于字符串连接))-
(减法运算符)*
(乘法运算符)/
(分区运算符)%
(余数运算符)=
(简单赋值运算符)++
(增量运算符;将值增加 1)--
(递减运算符;将值减 1)!
(逻辑补码运算符;反转布尔值)
==
(等于)!=
(不等于)>
(比... 更棒)>=
(大于或等于)<
(少于)<=
(小于或等于)
&&
条件与||
条件或- ?: 三元 (if-then-else 语句的简写)
instanceof
(将对象与指定类型进行比较)
~
(一元按位补码)<<
(签名左移)>>
(有符号右移)>>>
(无符号右移)&
(按位与)^
(按位异或)|
(按位包含 OR)
# If else
int k = 15; | |
if (k > 20) { | |
System.out.println(1); | |
} else if (k > 10) { | |
System.out.println(2); | |
} else { | |
System.out.println(3); | |
} |
# Switch
int month = 3; | |
String str; | |
switch (month) { | |
case 1: | |
str = "January"; | |
break; | |
case 2: | |
str = "February"; | |
break; | |
case 3: | |
str = "March"; | |
break; | |
default: | |
str = "Some other month"; | |
break; | |
} | |
// 输出: Result March | |
System.out.println("Result " + str); |
# 三元运算符
int a = 10; | |
int b = 20; | |
int max = (a > b) ? a : b; | |
// 输出: 20 | |
System.out.println(max); |
# Java 循环
# For 循环
for (int i = 0; i < 10; i++) { | |
System.out.print(i); | |
} | |
// 输出: 0123456789 |
for (int i = 0,j = 0; i < 3; i++,j--) { | |
System.out.print(j + "|" + i + " "); | |
} | |
// 输出: 0|0 -1|1 -2|2 |
# 增强的 For 循环
int[] numbers = {1,2,3,4,5}; | |
for (int number: numbers) { | |
System.out.print(number); | |
} | |
// 输出: 12345 |
用于循环数组或列表
# While 循环
int count = 0; | |
while (count < 5) { | |
System.out.print(count); | |
count++; | |
} | |
// 输出: 01234 |
# Do While 循环
int count = 0; | |
do { | |
System.out.print(count); | |
count++; | |
} while (count < 5); | |
// 输出: 01234 |
# 继续声明
for (int i = 0; i < 5; i++) { | |
if (i == 3) { | |
continue; | |
} | |
System.out.print(i); | |
} | |
// 输出: 01245 |
# 中断语句
for (int i = 0; i < 5; i++) { | |
System.out.print(i); | |
if (i == 3) { | |
break; | |
} | |
} | |
// 输出: 0123 |
# Java 框架搜集
# Java 集合
集合
Interface
有序
已排序
线程安全
复制
Nullable
ArrayList
List
Y
N
N
Y
Y
Vector
List
Y
N
Y
Y
Y
LinkedList
List, Deque
Y
N
N
Y
Y
CopyOnWriteArrayList
List
Y
N
Y
Y
Y
HashSet
Set
N
N
N
N
One null
LinkedHashSet
Set
Y
N
N
N
One null
TreeSet
Set
Y
Y
N
N
N
CopyOnWriteArraySet
Set
Y
N
Y
N
One null
ConcurrentSkipListSet
Set
Y
Y
Y
N
N
HashMap
Map
N
N
N
N (key)
One null
(key)
HashTable
Map
N
N
Y
N (key)
N (key)
LinkedHashMap
Map
Y
N
N
N (key)
One null
(key)
TreeMap
Map
Y
Y
N
N (key)
N (key)
ConcurrentHashMap
Map
N
N
Y
N (key)
N
ConcurrentSkipListMap
Map
Y
Y
Y
N (key)
N
ArrayDeque
Deque
Y
N
N
Y
N
PriorityQueue
Queue
Y
N
N
Y
N
ConcurrentLinkedQueue
Queue
Y
N
Y
Y
N
ConcurrentLinkedDeque
Deque
Y
N
Y
Y
N
ArrayBlockingQueue
Queue
Y
N
Y
Y
N
LinkedBlockingDeque
Deque
Y
N
Y
Y
N
PriorityBlockingQueue
Queue
Y
N
Y
Y
N
# ArrayList
List<Integer> nums = new ArrayList<>(); | |
// 添加 | |
nums.add(2); | |
nums.add(5); | |
nums.add(8); | |
// 检索 | |
System.out.println(nums.get(0)); | |
// 为循环迭代编制索引 | |
for (int i = 0; i < nums.size(); i++) { | |
System.out.println(nums.get(i)); | |
} | |
nums.remove(nums.size() - 1); | |
nums.remove(0); // 非常慢 | |
for (Integer value : nums) { | |
System.out.println(value); | |
} | |
//lambda 打印元素 | |
nums.forEach(e -> System.out.println(e.toString())); |
# HashMap
Map<Integer, String> m = new HashMap<>(); | |
m.put(5, "Five"); | |
m.put(8, "Eight"); | |
m.put(6, "Six"); | |
m.put(4, "Four"); | |
m.put(2, "Two"); | |
// 检索 | |
System.out.println(m.get(6)); | |
// Lambda forEach | |
m.forEach((key, value) -> { | |
String msg = key + ": " + value; | |
System.out.println(msg); | |
}); |
# ConcurrentHashMap
ConcurrentHashMap<Integer, String> m | |
= new ConcurrentHashMap<>(); | |
m.put(100, "Hello"); | |
m.put(101, "Geeks"); | |
m.put(102, "Geeks"); | |
// 移除 | |
m.remove(101, "Geeks"); | |
// 如果不存在,就添加,存在就不变更 | |
m.putIfAbsent(103, "Hello"); | |
// 替换 | |
m.replace(101, "Hello", "For"); | |
System.out.println(m); |
# HashSet
Set<String> set = new HashSet<>(); | |
if (set.isEmpty()) { | |
System.out.println("Empty!"); | |
} | |
set.add("dog"); | |
set.add("cat"); | |
set.add("mouse"); | |
set.add("snake"); | |
set.add("bear"); | |
if (set.contains("cat")) { | |
System.out.println("Contains cat"); | |
} | |
set.remove("cat"); | |
for (String element : set) { | |
System.out.println(element); | |
} | |
set.forEach(e -> System.out.println(e.toString())); |
# ArrayDeque
Deque<String> a = new ArrayDeque<>(); | |
// 使用 add () | |
a.add("Dog"); | |
// 使用 addFirst () | |
a.addFirst("Cat"); | |
// 使用 addLast () | |
a.addLast("Horse"); | |
// [Cat, Dog, Horse] | |
System.out.println(a); | |
// 访问元素 | |
System.out.println(a.peek()); | |
// 移除元素 | |
System.out.println(a.pop()); |
# 杂项 Misc
# 访问修饰符
修饰符
Class
Package
Subclass
World
public
Y
Y
Y
Y
protected
Y
Y
Y
N
no modifier
Y
Y
N
N
private
Y
N
N
N
# 常用表达
String text = "I am learning Java"; | |
// 删除所有空格 | |
text.replaceAll("\\s+", ""); | |
// 拆分字符串 | |
text.split("\\|"); | |
text.split(Pattern.quote("|")); |
查看: Regex in java
# 注释 Comment
// 我是单行注释! | |
/* | |
而我是一个 | |
多行注释! | |
*/ | |
/** | |
* 这个 | |
* 是 | |
* 文档 | |
* 注释 | |
*/ |
# 关键字
- abstract
- continue
- for
- new
- switch
- assert
- default
- goto
- package
- synchronized
- boolean
- do
- if
- private
- this
- break
- double
- implements
- protected
- throw
- byte
- else
- import
- public
- throws
- case
- enum
- instanceof
- return
- transient
- catch
- extends
- int
- short
- try
- char
- final
- interface
- static
- void
- class
- finally
- long
- strictfp
- volatile
- const
- float
- native
- super
- while
# 数学方法
Math.max(a,b)
a
和 b
的最大值
Math.min(a,b)
a
和 b
的最小值
Math.abs(a)
绝对值
Math.sqrt(a)
a
的平方根
Math.pow(a,b)
b
的幂
Math.round(a)
最接近的整数
Math.sin(ang)
正弦
Math.cos(ang)
ang
的余弦
Math.tan(ang)
ang
的切线
Math.asin(ang)
ang
的反正弦
Math.log(a)
a
的自然对数
Math.toDegrees(rad)
以度为单位的角度弧度
Math.toRadians(deg)
以弧度为单位的角度度
# 异常 Try/Catch/Finally
try { | |
// something | |
} catch (Exception e) { | |
e.printStackTrace(); | |
} finally { | |
System.out.println("always printed"); | |
} |
# 反射
/** | |
* 利用反射动态加载依赖库 | |
* java9 及以上版本可用 | |
* @param jar jar 文件 | |
*/ | |
Method method = URLClassLoader.class.getDeclaredMethod("addURL", URL.class); | |
method.setAccessible(true); | |
MethodHandle addURL = lookup.unreflect(method); | |
URL url = jar.toURI().toURL(); | |
URLClassLoader urlClassLoader = new URLClassLoader(new URL[] {url}); | |
addURL.invoke(urlClassLoader, url); | |
//java8 | |
Method method = URLClassLoader.class.getDeclaredMethod("addURL", URL.class); | |
method.setAccessible(true); | |
method.invoke(classLoader, url); |
# util 工具类
ArrayDeque
提供 resizable-array 并实现 Deque 接Arrays
包含一个静态工厂,允许将数组视为列表Collections
包含对集合进行操作或返回集合的静态方法Date
表示特定的时间瞬间,精度为毫秒Dictionary
是任何类的抽象父类,例如 Hashtable,它将键映射到值EnumMap
一个专门用于枚举键的 Map 实现EnumSet
一个专门用于枚举键的 Set 实现Formatter
提供对布局对齐和对齐、数字、字符串和日期 / 时间数据的常用格式以及特定于语言环境的输出的支持SecureRandom
实例用于生成安全的伪随机数流UUID
表示一个不可变的通用唯一标识符Vector
实现了一个可增长的对象数组LocalDate
表示没有时区的日期,只包含年月日,不可变并且线程安全的,java8 及以上版本可用LocalTime
表示没有时区的时间,只包含时分秒,不可变并且线程安全的,java8 及以上版本可用LocalDateTime
表示没有时区的日期时间,同时包含年月日时分秒,不可变并且线程安全的,java8 及以上版本可用
# IO 流
// 输入流转输出流 | |
byte[] inputContent = "test".getBytes(); | |
try (InputStream inputStream = new ByteArrayInputStream(inputContent); | |
OutputStream outputStream = new ByteArrayOutputStream()) { | |
byte[] buffer = new byte[1024]; | |
int len; | |
while ((len = inputStream.read(buffer)) != -1) { | |
outputStream.write(buffer, 0, len); | |
} | |
} catch (IOException e) { | |
throw new RuntimeException(e); | |
} |
# Collections 工具类
// 计算出现频率 | |
List<Integer> list = new ArrayList<>(); | |
list.add(1); | |
list.add(2); | |
list.add(2); | |
list.add(3); | |
list.add(3); | |
list.add(3); | |
int frequency = Collections.frequency(list, 2); // frequency = 2 |
# Stream 流
// 统计词频 | |
List<Integer> list = new ArrayList<>(); | |
list.add(1); | |
list.add(1); | |
list.add(3); | |
list.add(2); | |
list.add(2); | |
list.add(2); | |
Map<Integer, Long> frequencyMap = list.stream().collect(Collectors.groupingBy(x -> x, Collectors.counting())); | |
// 1: 2 | |
// 2: 3 | |
// 3: 1 |
# 另见
- Java 官网 (oracle.com/cn/java)
© 2022 Kenny Wang.