下载 JDK

https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html

华为云

https://repo.huaweicloud.com/java/jdk/8u151-b12/

阿里云

  1. linux版本 jdk-11.0.7_linux-x64_bin.tar.gz

    https://code.aliyun.com/kar/oracle-jdk/raw/3c932f02aa11e79dc39e4a68f5b0483ec1d32abe/jdk-11.0.7_linux-x64_bin.tar.gz

  2. jdk11 mac jdk-11.0.7_osx-x64_bin.tar.gz

    https://code.aliyun.com/kar/oracle-jdk/raw/3c932f02aa11e79dc39e4a68f5b0483ec1d32abe/jdk-11.0.7_osx-x64_bin.tar.gz

  3. jdk11 windows jdk-11.0.7_windows-x64_bin.zip

    https://code.aliyun.com/kar/oracle-jdk/raw/3c932f02aa11e79dc39e4a68f5b0483ec1d32abe/jdk-11.0.7_windows-x64_bin.zip

  4. jdk8 linux jdk-8u251-linux-x64.tar.gz

    https://code.aliyun.com/kar/oracle-jdk/raw/3c932f02aa11e79dc39e4a68f5b0483ec1d32abe/jdk-8u251-linux-x64.tar.gz

  5. jdk8 mac jdk-8u251-macosx-x64.dmg

    https://code.aliyun.com/kar/oracle-jdk/raw/3c932f02aa11e79dc39e4a68f5b0483ec1d32abe/jdk-8u251-macosx-x64.dmg

  6. jdk8 windows jdk-8u251-windows-x64.exe

零基础 Java 教程

廖雪峰:https://www.liaoxuefeng.com/wiki/1252599548343744

java 复习快速导航

http://lhyd.top/?p=405313

Lambda

https://www.kancloud.cn/hanxt/javacrazy/1568811

Java反射

http://www.51gjie.com/java/82

基础

  1. Java 类中在没有构造方法时,有一个默认无参构造器。如果存在有参构造器,则默认无参构造器失效,需要添加无参构造器代码,否则无法无参实例化对象

巨坑

1
2
3
String s = "1,2,";
String[] arr = s.split(",");
// arr.length = 2

集合

简述

  • Collection

集合的顶级接口。

  • List 列表

保证元素的存储顺序 — 有序;

有下标 —- 存储重复的元素

List 是有序可重复的集合

  • ArrayList

底层用数组存储数据。内存连续的,默认初始容量为 10,每次默认在上一次长度上增加一半,底层是基于右移运算来实现的。是一个线程不安全的集合。便于查询,不便于增删

  • LinkedList

通过节点 Node 实现的链表,内存不连续,没有初始容量,不需要考虑扩容问题。是一个线程不安全的集合。便于增删,不便于查询元素

  • Vector

向量 — 基于数组来实现的。内存连续的。默认初始容量是 10,默认每次容量翻倍,基于三元运算来实现。是一个线程安全的集合

  • Stack

栈。是 Vector 的子类。遵循先进先出的原则。

向栈中放入元素 —- 入栈 / 压栈

从栈中取出元素 —- 出栈 / 弹栈

  • Set

接口,无序不允许有重复元素的集合

  • HashSet—- 线程不安全的

存储机制:底层是用的一个数组来存储的数据,这个数组的默认大小是 16.

数组的每个位置称为一个桶(bucket),每一个桶中维系了一个链式栈结构。

  • Queue

队列(先进先出)所有新的元素插入到队列的尾部

  • Iterator

迭代器 — 本质上是通过指针的挪动来获取每一个元素。在遍历的时候,会复制原集合,然后一次给每个元素一个标记,如果这个元素被移除,则标记为 false,反之为 true, 便利完成之后,会去比对原集合,如果标记为 false,则将该元素从原集合中移除 —– 在迭代过程中,不允许直接增删原集合中的元素

  • Map<K,V>— 映射 (散列表)

两组变量 — 键,值。每一个键必然对应一个值,键不可重复 —- 一个映射实际上是由多个键值对组成。

HashMap: 允许键或者值为 null. 默认初始容量是 16,加载因子是 0.75f,默认增加一倍 是一个异步式线程不安全的映射。

Hashtable: 不允许键或者值为 null. 默认初始容量 11,加载因子是 0.75f。是一个同步式线程安全的映射

ConcurrentHashMap— 异步式线程安全的映射

用法

  1. Java 集合中有两类,一类是 List,一类是 SetList 有序且可以重复,而 Set 无序不可重复

  2. 求 list 子集

    1
    list.subList(fromIndex, toIndex) ;
  3. 求两个 list 的并集:

    1
    list1.addAll(list2)
  4. 求两个 list 的差集

    1
    list1.removeAll(list2)

ArrayList、LinkedList

  1. 在使用 ArrayList 时,如果能提前预测到数据量大小,比较大时一定要指定其长度
  2. 尽可能避免使用 add(index,e) ,会导致复制数组,降低效率
  3. ArrayList 是数组结构,LinkedList 是双向链表
  4. ArrayList 不指定长度情况下,大批量插入数据 LinkedList 的写入效率高于 ArrayList
  5. ArrayList 指定长度情况下,写入效率高于 LinkedList
  6. Map 容器 HashMap 也是推荐要初始化长度从而避免扩容

Map、HashMap、LinkedHashMap、Set、HashSet、LinkedHashSet

  1. HashMap 底层实现是数组,但数组的每一项都是一条链

  2. HashMap 可以允许存在一个为 null 的 key 和任意个为 null 的 value

  3. HashTable 中的 key 和 value 都不允许为 null

  4. HashTable 的方法是同步的,线程安全,而 HashMap 的方法不是

  5. HashSet 基于 HashMap 来实现的,底层采用 HashMap 来保存元素

  6. Set 接口是一种不包括重复元素的 Collection

  7. LinkedHashSet 是有序的,非线程安全的

  8. map 添加元素

    1
    2
    3
    4
    5
    //添加 map 元素
    map.put(key, value);

    //添加一个同类型的 map
    map.putAll(subMap);

Set 转换 String

1
2
Set<String> result = XXXX;
String.join(",", result); //逗号连接

Iterable 数量

1
2
Iterable<Integer> newIterable = () -> iter;
long count = StreamSupport.stream(newIterable.spliterator(), false).count();

多参数「同类型」

1
2
3
4
5
6
7
8
9
public void del(String... key) {
if (key != null && key.length > 0) {
if (key.length == 1) {
redisTemplate.delete(key[0]);
} else {
redisTemplate.delete(CollectionUtils.arrayToList(key));
}
}
}

TreeMap、TreeSet

待完善

equals 与 hashCode

  1. 在重写 equals 方法的同时,必须重写 hashCode 方法,让equals方法和hashCode方法始终在逻辑上保持一致性
  2. 重写设计原则
  • 如果 x.equals(y) 返回“true”,那么 x 和 y 的 hashCode() 必须相等
  • 如果 x.equals(y) 返回“false”,那么 x 和 y 的 hashCode() 有可能相等,也有可能不等

Okhttp 封装工具类

  1. OkHttpUtil 源文件

    1
    https://gitee.com/championwang/Java/blob/master/Tools/src/main/java/com/example/tools/common/OkHttpUtil.java
  2. maven 引入其它依赖的 jar 包 pom.xml

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    <!-- okhttp 请求-->
    <dependency>
    <groupId>com.squareup.okhttp3</groupId>
    <artifactId>okhttp</artifactId>
    <version>4.0.1</version>
    </dependency>

    <!--json 转换-->
    <dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.9</version>
    </dependency>

    <!--org.apache.http.util.TextUtils-->
    <dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
    <version>4.5.3</version>
    </dependency>

经验

  1. 系统找不到文件 C:\ProgramData\Oracle\Java\javapath\java.exe 的问题

    解决:删除C:\ProgramData\Oracle目录,删除环境变量 Path 中上述路径

  2. 输出内容到response后抛出异常,不会影响输出

  3. e.printStackTrace() 输出到日志文件

    1
    2
    3
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    e.printStackTrace(new PrintStream(baos));
    log.error(baos.toString());

BigDecimal、Long、Int 之间转换

int 转换成 BigDecimal

1
2
int b = 5;
BigDecimal a = new BigDecimal(b);

Lont 转换成 BigDecimal

1
2
long b = 5;
BigDecimal a = new BigDecimal(b);

BigDecimal 转换成 Long

1
2
BigDecimal b = new BigDecimal(12);
Long c = b.longValue();

BigDecimal 转换成 int

1
2
BigDecimal b = new BigDecimal(12);
int c = b.intValue();

接口

  1. 成员变量均为:public static final 静态常量,类型不能为泛型「不确定类型」
  2. 方法均为:public abstract

Java finally 语句到底是在 return 之前还是之后执行?

https://www.cnblogs.com/lanxuezaipiao/p/3440471.html

关于后端URL参数中包含中文,页面接收参数问题

  1. Java 将参数编码后传输
    String encode = URLUtil.encode(“参数 信息”);
  2. 页面 js 获取参数并解码 decodeURIComponent