Java-集合框架

Collection集合

Collection集合总结

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
Collection
|---List 有序,可重复
|---ArrayList
底层数据结构是数组,查询快,增删慢。
线程不安全,效率高
|---Vector
底层数据结构是数组,查询快,增删慢。
线程安全,效率低
|---LinkedList
底层数据结构是链表,查询慢,增删快。
线程不安全,效率高
|---Set 无序,唯一
|---HashSet
底层数据结构是哈希表。
如何保证元素唯一性的呢?
依赖两个方法:hashCode()和equals()
开发中自动生成这两个方法即可
|---LinkedHashSet
底层数据结构是链表和哈希表
由链表保证元素有序
由哈希表保证元素唯一
|---TreeSet
底层数据结构是红黑树。
如何保证元素排序的呢?
自然排序
比较器排序
如何保证元素唯一性的呢?
根据比较的返回值是否是0来决定

Collection使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
针对Collection集合我们到底使用谁呢?(掌握)
唯一吗?
是:Set
排序吗?
是:TreeSet
否:HashSet
如果你知道是Set,但是不知道是哪个Set,就用HashSet。

否:List
要安全吗?
是:Vector
否:ArrayList或者LinkedList
查询多:ArrayList
增删多:LinkedList
如果知道是List,但是不知道是哪个List,就用ArrayList。

如果知道是Collection集合,但是不知道使用谁,就用ArrayList。

如果知道用集合,就用ArrayList。

遍历方式

  1. 迭代器遍历
    • 注意:并发修改异常!
  2. 增强for
    • 注意:底层其实就是迭代器遍历!
  3. 普通for

集合中常见数据结构

1
2
3
4
5
在集合中常见的数据结构(掌握)
ArrayXxx : 底层数据结构是数组,查询快,增删慢
LinkedXxx : 底层数据结构是链表,查询慢,增删快
HashXxx : 底层数据结构是哈希表。依赖两个方法:hashCode()和equals()
TreeXxx : 底层数据结构是二叉树。两种方式排序:自然排序和比较器排序

Map集合

将键映射到值的对象。一个映射不能包含重复的键;每个键最多只能映射到一个值。

Map集合总结

1
2
3
4
5
6
7
Map
|---HashMap
键是哈希表结构,可以保证键的唯一性
|---LinkedHashMap
Map 接口的哈希表和链接列表实现,具有可预知的迭代顺序。
由哈希表保证唯一性
由链表保证有序性(存储和取出的顺序一致)

Map和Collection的区别

Map 存储的是键值对形式的元素,键唯一,值可以重复。夫妻对
Collection 存储的是单独出现的元素,子接口Set元素唯一,子接口List元素可重复。光棍

遍历方式

  1. 键找值
    • 获取所有键的集合
    • 遍历键的集合,得到每一个键
    • 根据键到集合中去找值
  2. 键值对对象找键和值
    • 获取所有的键值对对象的集合
    • 遍历键值对对象的集合,获取每一个键值对对象
    • 根据键值对对象去获取键和值

栗子🌰:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Map<String,String> hm = new HashMap<String,String>();

hm.put("it002","hello");
hm.put("it003","world");
hm.put("it001","java");

//方式1 键找值
Set<String> set = hm.keySet();
for(String key : set) {
String value = hm.get(key);
System.out.println(key+"---"+value);
}

//方式2 键值对对象找键和值
Set<Map.Entry<String,String>> set2 = hm.entrySet();
for(Map.Entry<String,String> me : set2) {
String key = me.getKey();
String value = me.getValue();
System.out.println(key+"---"+value);
}

Collections工具类

1
2
3
4
5
6
7
8
9
10
(1)是针对集合进行操作的工具类
(2)面试题:Collection和Collections的区别
A:Collection 是单列集合的顶层接口,有两个子接口List和Set
B:Collections 是针对集合进行操作的工具类,可以对集合进行排序和查找等
(3)常见的几个小方法:
A:public static <T> void sort(List<T> list)
B:public static <T> int binarySearch(List<?> list,T key)
C:public static <T> T max(Collection<?> coll)
D:public static void reverse(List<?> list)
E:public static void shuffle(List<?> list)

注意:在Collection中有一些线程不安全的集合类,当在需要多线程操作的时候,可以使用这个工具类来将线程不安全的集合转为一个线程安全的集合。


阅读全文
Java-初识正则表达式

正则表达式概述及基本使用

指一个用来描述或者匹配一系列符合某个句法规则的字符串的单个字符串。其实就是一种规则。有自己特殊的应用。

常见规则

规则字符在java.util.regex包下的Pattern类中。

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
A:字符
x 字符 x。举例:'a'表示字符a
\\ 反斜线字符。
\n 新行(换行)符 ('\u000A')
\r 回车符 ('\u000D')

B:字符类
[abc] a、b 或 c(简单类)
[^abc] 任何字符,除了 a、b 或 c(否定)
[a-zA-Z] a到 z 或 A到 Z,两头的字母包括在内(范围)
[0-9] 0到9的字符都包括

C:预定义字符类
. 任何字符。我的就是.字符本身,怎么表示呢? \.
\d 数字:[0-9]
\w 单词字符:[a-zA-Z_0-9]
在正则表达式里面组成单词的东西必须有这些东西组成

D:边界匹配器
^ 行的开头
$ 行的结尾
\b 单词边界
就是不是单词字符的地方。
举例:hello world?haha;xixi

E:Greedy 数量词
X? X,一次或一次也没有
X* X,零次或多次
X+ X,一次或多次
X{n} X,恰好 n 次
X{n,} X,至少 n 次
X{n,m} X,至少 n 次,但是不超过 m 次

常用功能

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
A:判断功能
String类的public boolean matches(String regex):判断此字符串是否匹配给定的正则表达式

B:分割功能
String类的public String[] split(String regex):根据给定正则表达式的匹配拆分此字符串。

C:替换功能
String类的public String replaceAll(String regex,String replacement):使用给定的 replacement 替换此字符串所有匹配给定的正则表达式的子字符串。

D:获取功能
Pattern和Matcher
Pattern p = Pattern.compile("a*b");
Matcher m = p.matcher("aaaaab");

find():查找存不存在
group():获取刚才查找过的数据

获取功能的典型调用如下:

1
2
3
4
5
6
7
8
9
// 典型的调用如下
// 模式和匹配器的典型调用顺序
// 把正则表达式编译成模式对象
Pattern p = Pattern.compile("a*b");
// 通过模式对象得到匹配器对象,这个时候需要的是被匹配的字符串
Matcher m = p.matcher("aaaaab");
// 调用匹配器对象的功能
boolean b = m.matches();
System.out.println(b);

举个栗子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/*
* 获取功能:
* 获取下面这个字符串中由三个字符组成的单词
* da jia ting wo shuo,jin tian yao xia yu,bu shang wan zi xi,gao xing bu?
*/
public class RegexDemo2 {
public static void main(String[] args) {
// 定义字符串
String s = "da jia ting wo shuo,jin tian yao xia yu,bu shang wan zi xi,gao xing bu?";
// 规则
String regex = "\\b\\w{3}\\b";

// 把规则编译成模式对象
Pattern p = Pattern.compile(regex);
// 通过模式对象得到匹配器对象
Matcher m = p.matcher(s);

while (m.find()) {
System.out.println(m.group());
}
}
}

阅读全文
C-结构体

结构体内存对齐的知识总结。

阅读全文
Java-基础

名词释义

JVMJava Virtual Machine,Java虚拟机

因为有了 JVM,所以同一个 Java 程序在三个不同的操作系统中都可以执行。这样就实现了 Java 程序的跨平台性。也称 Java 具有良好的可移植性。

JREJava Runtime Environment,Java运行环境

包括Java虚拟机和 Java 程序所需的核心类库等,如果想要运行一个开发好的 Java 程序,计算机中只需要安装 JRE 即可。

JDKJava Developme Kit,Java开发工具包

JDK 是提供给开发人员使用的,其中包含了 Java 的开发工具,也包括了 JRE 。所以安装了JDK,就不用再单独安装 JRE 了。其中的开发工具:编译工具 Javac.exe ,打包工具 Jar.exe 等。

简单而言:使用 JDK 开发完成的 Java 程序,交给 JRE 去运行,由 JVM 保证跨平台。

命名规则

在开发中命名我们要尽量做到“见名知意”,这是一个良好的习惯。

1
2
3
全部小写。
单级包:ahojcn
多级包:cn.ahoj

类或接口

1
2
一个单词:单词的首字母必须大写(Student、Dog)
多个单词:每个单词的首字母必须大写(HelloWorld、StudentName)

方法或变量

1
2
一个单词:单词的首字母小写(main、age)
多个单词:从第二个单词开始,每个单词的首字母大写(studentAge、showAllClass())

常量

1
2
一个单词:全部大写
多个单词:每个字母都大写,用_隔开

数据的表示

2、8、10、16进制

二进制:0b开头

八进制:0开头

十进制:整数默认是十进制的

十六进制:0x开头

1
2
3
4
System.out.println(0b1001);	// 2
System.out.println(0100); // 8
System.out.println(1001); // 10
System.out.println(0xffff); // 16

数据类型

Java 是强类型语言,对于每一种数据都定义了明确的具体数据类型,在内存中分配了不同大小的内存空间。

基本数据类型:

  1. 数值型:

    • 整数类型:byte(1),short(2),int(4),long(8,超过了int范围需要加L或l,建议使用L)

    • 浮点类型:float(4,单精度浮点数用f或F标记,建议使用F,不加默认是double类型),double(8)

    • 字符型:char(2)

    • 布尔型:boolean(1)

  2. 引用数据类型:

    • 类:class

    • 接口:interface

    • 数组:[]

变量使用注意事项: 作用域,初始化值,一行建议只定义一个变量。

强制类型转换

注意:boolean类型不能转换为其他的数据类型

  1. 默认转换

    • byte,short,char => int => long => float => double

    • byte,short,char 相互之间不转换,他们参与运算首先转换为 int 类型

  2. 强制转换

    • 目标类型 变量名 = (目标类型)(被转换的数据)

    例如:byte c = (byte)(a+b);

一些特别的

  1. 跳出多重循环

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    class test {
    public static void main(String[] args) {

    OUT: // 相当于给循环起了个名字
    for (int i = 0; i < 10; i++) {
    for (int j = 0; j < 10; j++) {
    for (int k = 0; k < 10; k++) {
    System.out.println("test");
    break OUT;
    }
    }
    }

    }
    }
  2. ….


阅读全文
跳表

此文是学习《数据结构与算法之美》时的笔记。

阅读全文
二分查找

之前在bilibili看到一个有趣的视频,关于二分查找的。戳我看这个有趣的视频

此文是学习《数据结构与算法之美》时的笔记。

阅读全文
C-指针

还是总结下,嘿嘿,这个之前还没理解。要注意,数组和指针没啥关系!

阅读全文
C-数据在内存中存储

C语言中各种数据类型在内存中是怎么存储的。

阅读全文
C-大小端

大端存储模式:数据的低位保存在内存的高地址中,数据的高位,保存在内存的低地址中。
小端存储模式:数据的低位保存在内存的低地址中,数据的高位,保存在内存的高地址中。

阅读全文
错题整理

整理了一下一些错题,以便日后回顾。

阅读全文