20201009黄春跃

20201009黄春跃

知识点总结

ArrayList、Vector、LinkList的区别

相同:

①都是java.util.List接口的实现类

②都是有序、可排列、可重复的集合,可存null。

③都支持迭代器操作

不同:

接口实现不同:

①ArrayList和Vector未实现Queue接口、Deque接口,不支持队列操作

②LinkList实现了Queue接口和Deque接口,支持队列操作同时支持栈操作。

内部实现不同:

①ArrayList,Vector内部采用数组来存储元素。

②LinkList内部采用链表来存储元素

线程安全不同

①ArrayList,LinkList是非线性安全,适用于单线程环境

②Vector是线程安全,适用于多线程环境。

增删不同:

①ArrayList、Vector内部采用数组,增删慢。

②LinkList内部采用链表,增删快。

扩容方式不同

①ArrayList内部采用1.5倍增长。

②Vector内部采用增加固定增量增长。

③LinkList内部采用链表,不需要扩容。

是否支持随机访问

ArrayList,Vector内部采用数组,随机访问效率较高。

LinkList内部采用链表,随机访问效率较低。

java.util.Map

Map 接口不是 Collection 的子类,使用键、值映射表来存储

注意:

①Map 不能有重复的键(覆盖),每个键可以映射到最多一个值

②允许将映射内容视为一组键,值集合或键值映射集合

③key 不要求有序, value 也不要求有序,但可以重复

④当使用对象作为 key 时,要重写 equals 和 hashCode 方法

抽象方法:

1602243401301

Map 的实现类较多,在此我们关注 HashMap 、 TreeMap 、 HashTable 、 LinkedHashMap

TreeMap

public class TreeMap<K,V>
extends AbstractMap<K,V>
implements NavigableMap<K,V>, Cloneable, Serializable

继承 AbstractMap ,一个红黑树基于 NavigableMap 实现
非线程安全的
key 不能存 null ,但是 value 可以存 null
key 必须是可比较的

Hashtable

public class Hashtable<K,V>
extends Dictionary<K,V>
implements Map<K,V>, Cloneable, Serializable

该类实现了一个哈希表,它将键映射到值
不允许 null 作为键和值
初始容量( initialCapacity )为 11 ,负载因子( loadFactor )为 0.75f
线程安全的
不保证顺序
扩容方式是旧容量的2倍 +1
数组 + 链表

HashMap

public class HashMap<K,V>
extends AbstractMap<K,V>
implements Map<K,V>, Cloneable, Serializable

基于哈希表的实现的 Map 接口
允许 null 的值和 null 键
非线程安全
初始容量 16,负载因子 0.75
扩容是 2倍旧的容量

LinkedHashMap

public class LinkedHashMap<K,V>
  extends HashMap<K,V>
  implements Map<K,V>

哈希表和双向链表实现的 Map 接口
具有可预测的迭代次序(有序)
非线程安全
允许空元素

Properties

public
class Properties extends Hashtable<Object,Object>

Properties 类表示一组持久的属性。 Properties 可以保存到流中或从流中加载。 属性列表中的每
个键及其对应的值都是一个字符串。
操作和 Hashtable 基本一致,主要用于从流中记载或保存到流中去。(后期 JDBC 模块会使用到)

Collections

java.util.Collections 是 java 提供的一个集合操作的工具类。它包含了大量的静态方法,用于实现对集合元素的排序、查找和替换等操作。

提示:Collections和Collection是不同的,前者是集合的操作类,后者是集合接口。

public static void main(String[] args) {
        List list = new ArrayList();
        list.add(1);
        list.add(2);
        List list2 = new ArrayList();
        list2.add(3);
        list2.add(4);
        list2.add(5);
        list2.add(6);
        list2.add(7);
        list2.add(8);
        Collections.addAll(list, 7, 8, 9);
        System.out.println(list);//[1, 2, 7, 8, 9]
        
        System.out.println(Collections.disjoint(list, list2)); // false
        
        
        Collections.copy(list2, list);
        System.out.println(list2);//[1, 2, 7, 8, 9]
        
        // 通过 compare / compareTo
        System.out.println(Collections.max(list)); // 9
        System.out.println(Collections.min(list)); // 1
        
        Collections.reverse(list2);
        System.out.println(list2); //[8, 9, 8, 7, 2, 1]
        
        Collections.shuffle(list2);
        System.out.println(list2); // [9, 2, 1, 8, 8, 7]
        
        Collections.binarySearch(list, 2);
        
        
    }

泛型

泛型是jdk1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数,使代码可以应用于多种类型。简单的来说,java语言引入泛型的好处是安全简单,且所有强制转换都是自动和隐式进行的,提高了代码的重用率。

泛型的定义:

类型 对象 = new 类型();

语法解析:

①<>是泛型的特征;

②E表示某种数据类型,也可以用其他字母表示,如T。在实际使用泛型时,需要明确的类型替换掉E。

例如:

List<String>  list = new ArrayList<String>();
//上述代码表示创建一个ArrayList集合,但规定该集合中存储的元素类型必须为String类型。

List list = new ArrayList();

标签

评论

this is is footer