Java相关

1. Collection和Collections

Collection 是Java中各种集合结构的父接口。
Collections是包含各种集合操作的私有方法,静态方法。

Java的集合框架有2种类型的容器,一种是集合Collection,存储元素的集合。一种是图Map,存储键值对。

大概框架图:
关注3点:1.接口。2.具体类。3.算法。
在这里插入图片描述

(1)List列表 —— 有序、值可重复

1、ArrayList
优点: 底层数据结构是数组Array,查询快。增删慢。
缺点: 线程不安全,效率高

2、Vector
优点: 底层数据结构是数组Array,查询快。增删慢。
缺点: 线程安全,效率低

*Vector是实现了 synchronized 的,这也是Vector和ArrayList的唯一的区别。

** 需注意这里:
ArrayList 本身不是线程安全的,通过 Collections.synchronizedList(List list) 可以将其包装成一个线程安全的 List

List list = Collections.synchronizedList(new ArrayList());
synchronized (list) {
Iterator i = list.iterator(); // 必须在同步代码块里
while (i.hasNext())
foo(i.next());
}

Collections.synchronizedList() 返回的是 SynchronizedList。
SynchronizedList 的同步,使用的是synchronized 代码块对 mutex 对象加锁,这个 mutex 对象还能够通过构造函数传进来,也就是说我们可以指定锁定的对象。而 Vector 则使用了synchronized 方法,同步方法的作用范围是整个方法,所以没办法对同步进行细粒度的控制。而且同步方法加锁的是 this 对象,没办法控制锁定的对象。这也是 vector 和 SynchronizedList 的一个区别。

3、LinkedList
优点: 底层数据结构是链表LinkedList,增删快。查询慢。
缺点: 线程不安全,效率高

(2)Set 集 —— 值不可重复

1、HashSet
调用add()方法向Set中添加对象,底层数据结构是哈希表,无序。
依赖两个方法来保证元素唯一性:hashCode()和equals()。使用对象的值来计算hashcode值,对于两个对象来说hashcode可能相同,所以equals()方法用来判断对象的相等性。

2、LinkedHashSet
底层数据结构是双向链表和哈希表,有序。
由链表保证元素有序,由哈希表保证元素唯一。

3、TreeSet
底层数据结构是红黑树,内部实现排序,也可以自定义排序规则。
自然排序、比较器排序保证元素排序。根据比较的返回值是否是0来保证元素唯一性。

LinkedHashSet
继承于HashSet、又基于 LinkedHashMap 来实现
TreeSet
使用二叉树的原理对新add()的对象按照指定的顺序排序(升序、降序),每增加一个对象都会进行排序,将对象插入的二叉树指定的位置。
HashSet
存储元素的顺序并不是按照存入时的顺序(和 List 显然不同) 而是按照哈希值来存的所以取数据也是按照哈希值取得
> TreeSet自然排序,LinkedHashSet按添加顺序排序

(3) 扩展

其实只要明白了线程安全的 List 的实现机制后,Set 和 Map 也就很容易明白了,它们的机制是相似的。

Collections 也提供了 synchronizedSet 和 synchronizedMap 方法,它们的原理也和 synchronizedList 一样。

java.util 包下也提供了线程安全的 Map —— HashTable。HashTable(安全) 与 HashMap 的关系同 Vector 与 ArrayList 的关系一样,都是对读写方法加锁。但是 HashTable 的 Key 和 Value 都不允许为 null。

java.util.concurrent 包下也提供了像 CopyOnWriteArrayList 类似的 CopyOnWriteSet。而且实际上 CopyOnWriteSet 内部就是通过 CopyOnWriteArrayList 实现的,它的 add 方法内部调用了 CopyOnWriteArrayList 的 addIfAbsent() 方法,这个方法的作用是如果要添加的元素在集合中不存在才会加入集合中,否则集合不会发生改变,并返回 false。

支持线程安全的 Set 还有 ConcurrentSkipListSet。

java.util.concurrent 包下还提供了线程安全的 Map —— ConcurrentHashMap。它与 HashTable 的主要区别是二者加锁粒度的不同,HashTable 的加锁方法是给每个方法加上 synchronized 关键字,这样锁住的是整个 Table 对象。而 ConcurrentHashMap 是更细粒度的加锁,在JDK1.8之前,ConcurrentHashMap加的是分段锁,也就是Segment锁,每个Segment 含有整个 table 的一部分,这样不同分段之间的并发操作就互不影响。

在这里插入图片描述
上图还缺少Queue。
下图大概:
在这里插入图片描述

2. JAVA泛型通配符T,E,K,V区别,T以及Class,Class<?>的区别
3. this() 放在类的构造器的第一行,表示,调用其它的构造器

public App(int input) {
}

public App(String input) {
this(Integer.parseInt(input));
}

4. final关键字

final关键字

1.final修饰变量,则等同于常量
2.final修饰方法中的参数,称为最终参数。
3.final修饰类,则类不能被继承
4.final修饰方法,则方法不能被重写。
5. 接口和抽象类不能是final的,它们需要被实现和继承
6. 重载和重写要区分开,父子之间是重写,同一个类里面是重载,final修饰的子类没法重写,而不是重载。

5.1 父类和子类调用

子类继承父类后,重写的方法,会覆盖父类的方法。除非父类中该方法是静态的,这种会隐藏,不覆盖。
当遇到super.methodone()时,会到父类中,但如果是重写的,还是会调用子类的该方法的实现。
每个类都使用Object类作为超类。
Class类中的forName()方法能够装载其它类,返回该类和接口相关的。

5.2 类加载

1.Java类加载有5个过程:加载,验证,准备,解析,初始化。
2. 类加载器的任务,根据类的全限定名称,读取该类的二进制字节流到jvm中,然后转换为一个与目标对应的java.lang.Class对象实例。
3. Java中有3种类加载器:引导BootStrap类加载器,扩展Extention类加载器,系统System类加载器。
4. 类加载器要保证线程安全。
5. 类的加载采用的是双亲委派模式,原理:当一个类加载器收到了类加载请求,它不会自己先去加载,而是把这个请求委托给父类的加载器去执行,依次递归向上委托,最终到达顶层的类加载器。如果父类加载成功,就成功返回,否则,子加载器才会尝试自己去加载。
6. 自定义类加载器,继承ClassLoader后,可以重写findClass方法,从而可以加载自己指定路径上的class。

6. 多态的作用

1.提高可重用性
2.扩展代码模块

隐藏细节,是封装的作用

7. 流式编程

Stream流其实是一个集合元素的函数模型,它并不是集合,也不是数据结构,其本身并不存储任何 元素(或其地址值)***,Stream是一个来自数据源的元素队列。它是有关算法和计算的,它更像一个高级版本的 Iterator

Stream 就如同一个迭代器(Iterator),单向,不可往复,数据只能遍历一次,遍历过一次后即用尽了,就好比流水从面前流过,一去不复返。

操作类型:
***Intermediate:***一个流可以后面跟随零个或多个 intermediate 操作。其目的主要是打开流,做出某种程度的数据映射/过滤,然后返回一个新的流,交给下一个操作使用。这类操作都是惰性化的。

包含的操作有:map (mapToInt, flatMap 等)、 filter、 distinct、 sorted、 peek、
limit、 skip、 parallel、 sequential、 unordered

***Terminal:***一个流只能有一个 terminal 操作,当这个操作执行后,流就被使用“光”了,无法再被操作。所以这必定是流的最后一个操作。Terminal 操作的执行,才会真正开始流的遍历,并且会生成一个结果,或者一个 side effect。

包含的操作有:forEach、 forEachOrdered、 toArray、 reduce、 collect、 min、 max、
count、 anyMatch、 allMatch、 noneMatch、 findFirst、 findAny、 iterator

8. 锁

同步方法,锁定的是this固有对象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值