//
Java提供的这一套容器类,其中基本类型是List、Set、Queue和Map,
// 这些对象类型也称之为集合类。
// 9个核心接口
// Collection List Queue Map SortedMap NavigableMap
// Set SortedSet NavigableSet
// 13个核心具体实现类
// Map Set List Queue
// HashMap HashSet ArrayList
// Hashtable LinkedHashSet Vector PriorityQueue
// TreeMap TreeSet LinkedList
// LinkedHashMap 实用工具 Collections Arrays
// 容器与集合
// Container
// Collection
// 数组
// 长度固定,在整个生命周期中不可改变
// 可以存储基本数据类型和引用数据类型
// 长度可以动态改变
// 可以动态的从容器中插入或删除对象
// 只能存储引用数据类型(基本数据类型经装箱后可存入)
// 迭代遍历容器,逐个查看每个元素
// 容器包括集合和映射
// 集合Collection:
// List 按索引顺序排列的事物列表(实现了List接口)
// Set 不能存储重复的事物(实现Set接口)
// Queue 按照被处理的顺序排列的事物
// 映射Map 由键-值对组成的事物,键不可重复(实现了Map接口)
// List的使用
// ArrayList
// LinkedList
// 列表( List ):关心的是索引
// 对象按索引存储
// 可以存储重复元素
// ArrayList:线性表
// 快速迭代,少量插入删除
// LinkedList:链表
// 迭代速度慢,快速插入删除
// ArrayList就是动态数组,动态的增加和减少元素,可灵活的设置数组的大小
// ArrayList的使用方法
// 创建ArrayList的对象
// 向该对象中添加元素
// 根据需要修改该对象中的元素
// 构造方法
// ArrayList():构造一个初始容量为 10 的空列表
// ArrayList (int initialCapacity):构造一个具有指定初始容量的空列表
// 其他方法
// add(E e):将指定的元素添加到此列表的尾部
// add(int index, E element):将指定的元素插入此列表中的指定位置
// remove(ine index):移除此列表中指定位置上的元素
// get(int index):返回此列表中指定位置上的元素
// set(int index, E element):用指定的元素替代此列表中指定位置上的元素
// size():返回此列表中的元素数
// 对于动态数组,有人可能会使用Vector类
// 为什么用ArrayList取代Vector类?
// Vector类的方法是同步的,同步操作将耗费大量时间
// ArrayList类的方法不是同步的,故建议在不需要同步时使用
// 使用方法
// 创建LinkedList对象
// 添加元素
// 维护对象中的元素(添加、更新、删除)
// 构造方法
// LinkedList():构造一个空列表
// LinkedList():构造一个包含指定 collection 中的元素的列表
// 其他方法
// add(E e):将指定的元素添加到此列表的尾部
// add(int index, E element):在此列表中指定的位置插入指定的元素
// remove(ine index):移除此列表中指定位置上的元素
// size():返回此列表中的元素数
// Set的使用
// HashSet
// TreeSet
// LinkedHashSet
// 集(Set)是最简单的一种集合:关心唯一性
// 对象无序存储
// 不能存储重复元素
// 主要实现类
// HashSet:使用被插入对象的Hash码
// LinkedHashSet:HashSet的ordered版本
// TreeSet:二叉树结构,保证元素按照元素的自然顺序进行升序排序
// HashSet
// 基于 HashMap 实现的,HashSet 底层采用 HashMap 来保存所有元素
// 不允许有重复元素
// 不关心集合中元素的顺序
// 构造方法
// HashSet():构造一个空散列集,其底层 HashMap 实例的默认初始容量是 16
// HashSet(Collection<? extends E> c)):构造一个散列集,并将集合中的
// 所有元素添加到这个散列集中
// HashSet(intinitialCapacity):构造一个空的具有指定容量(桶数)的散列集
// 其他方法
// add(E e):如果此 set 中尚未包含指定元素,则添加指定元素
// clear():从此 set 中移除所有元素
// remove(Object o):如果指定元素存在于此 set 中,则将其移除
// size():返回此 set 中的元素的数量(set 的容量)
// isEmpty():如果此 set 不包含任何元素,则返回 true
// HashSet(intinitialCapacity)参数是负载因子
// 在java语言中,通过负载因子(load factor)来决定何时对散列表进行再 散列.
// 例如:如果负载因子是0.75,当散列表中已经有75%的位置已经放满,那么将进行散列.
// 负载因子越高(越接近1.0),内存的使用率越高,元素的寻找时间越长.
// 负载因子越低(越接近0.0),元素的寻找时间越短,内存浪费越多.
// 注意事项
// HashSet不能重复存储equals相同的数据 。原因就是equals相同,数据的散列码
// 也就相同(hashCode必须和equals兼容)。大量相同的数据将存放在同一个散列单元
// 所指向的链表中,造成严重的散列冲突,对查找效率是灾难性的。
// HashSet的存储是无序的 ,没有前后关系,他并不是线性结构的集合。
// hashCode必须和equals必须兼容
// TreeSet(树集)类似HashSet(散列集)
// 可以以任意顺序将元素插入到集合中
// 对集合遍历时,每个值会自动的按照排序后的顺序呈现
// 添加操作速率比散列集慢(因为迭代器总是以排好序的顺序访问每个元素)
// 构造方法
// TreeSet():构造一个新的空 set,该 set 根据其元素的自然顺序进行排序
// 其他方法
// add():将指定的元素添加到此 set(如果该元素尚未存在 set 中)
// remove(Object o):将指定的元素从 set 中移除(如果该元素存在于此 set 中)
// first():返回此 set 中当前第一个(最低)元素
// last():返回此 set 中当前最后一个(最高)元素
// isEmpty():如果此 set 不包含任何元素,则返回 true
// size():返回 set 中的元素数(set 的容量)
// LinkedHashSet
// 在Hash的实现上添加了Linked的支持,在每个节点上通过一个链表串联起来,
// 有确定的顺序。适用于有常量复杂度的高效存取性能要求、同时又要求排序的情况
// 非同步
// 继承于HashSet、又基于LinkedHashMap来实现
// 构造方法
// LinkedHashSet():构造一个带默认初始容量 (16) 和加载因子 (0.75)
// 的新空链接哈希 set
// 其他方法
// 包含继承与HashSet的方法:add, clear, isEmpty, remove, size
//三个类比较
// HashSet
// 不能保证元素的排列顺序,顺序有可能发生变化
// 不是同步的,集合元素可以是null,但只能放入一个null
// 哈希表是通过使用称为散列法的机制来存储信息的,元素并没有以某种特定顺序来存放;
// LinkedHashSet
// 以元素插入的顺序来维护集合的链接表,允许以插入的顺序在集合中迭代;
// 遍历性能比HashSet好,但是插入时性能稍微逊色于HashSet
// TreeSet
// 提供一个使用树结构存储Set接口的实现,对象以升序顺序存储,访问和遍历的时间很快
// 映射(Map)
// 对象以键-值对(key-value)存储
// key不允许有重复,value允许有重复
// Map中元素,可以将key序列、value序列单独抽取出来
// 使用keySet()抽取key序列,将map中的所有keys生成一个Set。
// 使用values()抽取value序列,将map中的所有values生成一个Collection。
// HashMap
// 基于哈希表的 Map 接口的实现
// HashMap是非线程安全的
// 常用方法:
// Object put(K key,V value)
// Object get(Object K)
// containsKey(Object K)
// 遍历HashMap
// TreeMap
// 基于红黑树实现
// 按照元素的自然顺序排序
// LinkedHashMap
// HashMap的ordered版本
// hashCode契约
// equals方法比较相等的两个对象hashCode返回值必须相同
// equals方法比较不相等的两个对象hashCode返回值可以不相同,也可以相同
// 如果没有修改对象的equals比较内的任何属性信息,则这个对象多次调用hashCode
// 返回相同结果
// 重写equals方法
// 首先,确保检测对象类型正确
// 其次,比较我们所关心的属性
// Equals契约
// 自反的 对任意的x引用,x.equals(x)都应返回true
// 对称的 对任意的x、y引用,当且仅当x.equals(y)时,y.equals(x)才返回true
// 传递的 对任意的x、y、z引用,如果x.equals(y)和y.equals(z)返回true,
// 则z.equals(x)返回true
// 一致的 对任意的x、y引用,对象中的信息没有做休息的前提下多次调用x.equals(y)
// 返回一致的结果
// 对任意非NULL引用x,x.equals(null)返回false
// 泛型
// 两个模块的功能非常相似,一个是处理int数据,另一个是处理string数据,
// 或者其他自定义的数据类型
// 解决方案
// 写多个方法处理每个数据类型
// 为了提高代码的重用性,用通用的数据类型Object来实现
// 优点
// 灵活
// 通用性强
// 缺点
// 1.处理值类型时,会出现装箱、拆箱操作,性能损失非常严重
// 2.处理引用类型时,虽然没有装箱和拆箱操作,但将用到数据类型的强制转换操作,
// 增加处理器的负担
// 3.如果处理数据是数组,数组中数据类型不一致
// 运行时类型转换异常
// 编译器无法检查出来
// 既增强代码通用性,又避免编译器无法检查编译错误的问题——泛型
// 泛型用一个通用的数据类型T来代替object,在类实例化时指定T的类型,
// 运行时自动编译为本地代码,运行效率和代码质量都有很大提高,并且保证数据类型安全
// 泛型的作用就是提高代码的重用性,避免强制类型转换,减少装箱拆箱提高性能,减少错误
class Info<T> {
private T var;
public T getVar() {
return var;
}
public void setVar(T var) {
this.var = var;
}
}
// 泛型(Generics)
// 所谓泛型,即通过参数化类型来实现在同一份代码上操作多种数据类型
// 泛型编程是一种编程范式,它利用“参数化类型”将类型抽象化,从而实现更为灵活的复用
// 泛型赋予了代码更强的类型安全,更好的复用,更高的效率,更清晰的约束
// 泛型的语法在表面上与C++中的模板非常类似,但是二者之间有着本质的区别
// Java 中的泛型只接受【引用类型】作为类型参数
// 如:可以定义 List<Integer>,不可以定义 List<int>
// C++中List<A>和List<B>实际上是两个不同的类,而java中
// ArrayList<Integer> 和 ArrayList<String>共享相同的类
// ArrayList<T>
// 语法
// class 名称<泛型列表>
// 如:class ArrayList<E>
// 参数E是泛型,它可以是任何类或接口(除基本数据类型外)
// 集合中使用泛型
// List<E>
// 方法参数
// void do(List<Dog> dogs){…}
// 返回类型
// List<Dog> getDogs(){…}
// 变量声明的类型必须匹配传递给实际对象的类型
// List<Animal> animals = new ArrayList<Animal>();正确
// List<Animal> animals = new ArrayList<Dog>();错误
// 声明一个类型参数为<Object>的List,相当于非泛型集合
// (可将任何Object放入集合中)
// 使用通配符(?)
// 接受所声明变量类型的任何子类型
// void addAnimal(List<? extends Animal> animals)
// Animal可以是类或接口
// 接受父类型的变量
// void addAnimal(List<? super Dog> animals)
// 接受super右边类型或其超类型
// List<?> 与List<? extents Object>完全相同
// List<Object>与List<?>完全不同
// 泛型通配符只能用于引用的声明中,不可以在创建对象时使用
// Fruit<?> fruit=new Fruit<?>();错误
// 不可以使用采用了泛型通配符的引用调用使用了泛型参数的方法
// 这些对象类型也称之为集合类。
// 9个核心接口
// Collection List Queue Map SortedMap NavigableMap
// Set SortedSet NavigableSet
// 13个核心具体实现类
// Map Set List Queue
// HashMap HashSet ArrayList
// Hashtable LinkedHashSet Vector PriorityQueue
// TreeMap TreeSet LinkedList
// LinkedHashMap 实用工具 Collections Arrays
// 容器与集合
// Container
// Collection
// 数组
// 长度固定,在整个生命周期中不可改变
// 可以存储基本数据类型和引用数据类型
// 数组中存储相同类型的数据
// 长度可以动态改变
// 可以动态的从容器中插入或删除对象
// 只能存储引用数据类型(基本数据类型经装箱后可存入)
// 迭代遍历容器,逐个查看每个元素
// 容器包括集合和映射
// 集合Collection:
// List 按索引顺序排列的事物列表(实现了List接口)
// Set 不能存储重复的事物(实现Set接口)
// Queue 按照被处理的顺序排列的事物
// 映射Map 由键-值对组成的事物,键不可重复(实现了Map接口)
// List的使用
// ArrayList
// LinkedList
// 列表( List ):关心的是索引
// 对象按索引存储
// 可以存储重复元素
// 具有与索引相关的一套方法
// ArrayList:线性表
// 快速迭代,少量插入删除
// LinkedList:链表
// 迭代速度慢,快速插入删除
// ArrayList就是动态数组,动态的增加和减少元素,可灵活的设置数组的大小
// ArrayList的使用方法
// 创建ArrayList的对象
// 向该对象中添加元素
// 根据需要修改该对象中的元素
// 构造方法
// ArrayList():构造一个初始容量为 10 的空列表
// ArrayList (int initialCapacity):构造一个具有指定初始容量的空列表
// 其他方法
// add(E e):将指定的元素添加到此列表的尾部
// add(int index, E element):将指定的元素插入此列表中的指定位置
// remove(ine index):移除此列表中指定位置上的元素
// get(int index):返回此列表中指定位置上的元素
// set(int index, E element):用指定的元素替代此列表中指定位置上的元素
// size():返回此列表中的元素数
// 对于动态数组,有人可能会使用Vector类
// 为什么用ArrayList取代Vector类?
// Vector类的方法是同步的,同步操作将耗费大量时间
// ArrayList类的方法不是同步的,故建议在不需要同步时使用
// 使用方法
// 创建LinkedList对象
// 添加元素
// 维护对象中的元素(添加、更新、删除)
// 构造方法
// LinkedList():构造一个空列表
// LinkedList():构造一个包含指定 collection 中的元素的列表
// 其他方法
// add(E e):将指定的元素添加到此列表的尾部
// add(int index, E element):在此列表中指定的位置插入指定的元素
// remove(ine index):移除此列表中指定位置上的元素
// size():返回此列表中的元素数
// Set的使用
// HashSet
// TreeSet
// LinkedHashSet
// 集(Set)是最简单的一种集合:关心唯一性
// 对象无序存储
// 不能存储重复元素
// 主要实现类
// HashSet:使用被插入对象的Hash码
// LinkedHashSet:HashSet的ordered版本
// TreeSet:二叉树结构,保证元素按照元素的自然顺序进行升序排序
// HashSet
// 基于 HashMap 实现的,HashSet 底层采用 HashMap 来保存所有元素
// 不允许有重复元素
// 不关心集合中元素的顺序
// 构造方法
// HashSet():构造一个空散列集,其底层 HashMap 实例的默认初始容量是 16
// HashSet(Collection<? extends E> c)):构造一个散列集,并将集合中的
// 所有元素添加到这个散列集中
// HashSet(intinitialCapacity):构造一个空的具有指定容量(桶数)的散列集
// 其他方法
// add(E e):如果此 set 中尚未包含指定元素,则添加指定元素
// clear():从此 set 中移除所有元素
// remove(Object o):如果指定元素存在于此 set 中,则将其移除
// size():返回此 set 中的元素的数量(set 的容量)
// isEmpty():如果此 set 不包含任何元素,则返回 true
// HashSet(intinitialCapacity)参数是负载因子
// 在java语言中,通过负载因子(load factor)来决定何时对散列表进行再 散列.
// 例如:如果负载因子是0.75,当散列表中已经有75%的位置已经放满,那么将进行散列.
// 负载因子越高(越接近1.0),内存的使用率越高,元素的寻找时间越长.
// 负载因子越低(越接近0.0),元素的寻找时间越短,内存浪费越多.
// 注意事项
// HashSet不能重复存储equals相同的数据 。原因就是equals相同,数据的散列码
// 也就相同(hashCode必须和equals兼容)。大量相同的数据将存放在同一个散列单元
// 所指向的链表中,造成严重的散列冲突,对查找效率是灾难性的。
// HashSet的存储是无序的 ,没有前后关系,他并不是线性结构的集合。
// hashCode必须和equals必须兼容
// TreeSet(树集)类似HashSet(散列集)
// 可以以任意顺序将元素插入到集合中
// 对集合遍历时,每个值会自动的按照排序后的顺序呈现
// 添加操作速率比散列集慢(因为迭代器总是以排好序的顺序访问每个元素)
// 构造方法
// TreeSet():构造一个新的空 set,该 set 根据其元素的自然顺序进行排序
// 其他方法
// add():将指定的元素添加到此 set(如果该元素尚未存在 set 中)
// remove(Object o):将指定的元素从 set 中移除(如果该元素存在于此 set 中)
// first():返回此 set 中当前第一个(最低)元素
// last():返回此 set 中当前最后一个(最高)元素
// isEmpty():如果此 set 不包含任何元素,则返回 true
// size():返回 set 中的元素数(set 的容量)
// LinkedHashSet
// 在Hash的实现上添加了Linked的支持,在每个节点上通过一个链表串联起来,
// 有确定的顺序。适用于有常量复杂度的高效存取性能要求、同时又要求排序的情况
// 非同步
// 继承于HashSet、又基于LinkedHashMap来实现
// 构造方法
// LinkedHashSet():构造一个带默认初始容量 (16) 和加载因子 (0.75)
// 的新空链接哈希 set
// 其他方法
// 包含继承与HashSet的方法:add, clear, isEmpty, remove, size
//三个类比较
// HashSet
// 不能保证元素的排列顺序,顺序有可能发生变化
// 不是同步的,集合元素可以是null,但只能放入一个null
// 哈希表是通过使用称为散列法的机制来存储信息的,元素并没有以某种特定顺序来存放;
// LinkedHashSet
// 以元素插入的顺序来维护集合的链接表,允许以插入的顺序在集合中迭代;
// 遍历性能比HashSet好,但是插入时性能稍微逊色于HashSet
// TreeSet
// 提供一个使用树结构存储Set接口的实现,对象以升序顺序存储,访问和遍历的时间很快
// 映射(Map)
// 对象以键-值对(key-value)存储
// key不允许有重复,value允许有重复
// Map中元素,可以将key序列、value序列单独抽取出来
// 使用keySet()抽取key序列,将map中的所有keys生成一个Set。
// 使用values()抽取value序列,将map中的所有values生成一个Collection。
// HashMap
// 基于哈希表的 Map 接口的实现
// HashMap是非线程安全的
// 常用方法:
// Object put(K key,V value)
// Object get(Object K)
// containsKey(Object K)
// 遍历HashMap
// TreeMap
// 基于红黑树实现
// 按照元素的自然顺序排序
// LinkedHashMap
// HashMap的ordered版本
// hashCode契约
// equals方法比较相等的两个对象hashCode返回值必须相同
// equals方法比较不相等的两个对象hashCode返回值可以不相同,也可以相同
// 如果没有修改对象的equals比较内的任何属性信息,则这个对象多次调用hashCode
// 返回相同结果
// 重写equals方法
// 首先,确保检测对象类型正确
// 其次,比较我们所关心的属性
// Equals契约
// 自反的 对任意的x引用,x.equals(x)都应返回true
// 对称的 对任意的x、y引用,当且仅当x.equals(y)时,y.equals(x)才返回true
// 传递的 对任意的x、y、z引用,如果x.equals(y)和y.equals(z)返回true,
// 则z.equals(x)返回true
// 一致的 对任意的x、y引用,对象中的信息没有做休息的前提下多次调用x.equals(y)
// 返回一致的结果
// 对任意非NULL引用x,x.equals(null)返回false
// 泛型
// 两个模块的功能非常相似,一个是处理int数据,另一个是处理string数据,
// 或者其他自定义的数据类型
// 解决方案
// 写多个方法处理每个数据类型
// 为了提高代码的重用性,用通用的数据类型Object来实现
// 优点
// 灵活
// 通用性强
// 缺点
// 1.处理值类型时,会出现装箱、拆箱操作,性能损失非常严重
// 2.处理引用类型时,虽然没有装箱和拆箱操作,但将用到数据类型的强制转换操作,
// 增加处理器的负担
// 3.如果处理数据是数组,数组中数据类型不一致
// 运行时类型转换异常
// 编译器无法检查出来
// 既增强代码通用性,又避免编译器无法检查编译错误的问题——泛型
// 泛型用一个通用的数据类型T来代替object,在类实例化时指定T的类型,
// 运行时自动编译为本地代码,运行效率和代码质量都有很大提高,并且保证数据类型安全
// 泛型的作用就是提高代码的重用性,避免强制类型转换,减少装箱拆箱提高性能,减少错误
class Info<T> {
private T var;
public T getVar() {
return var;
}
public void setVar(T var) {
this.var = var;
}
}
// 泛型(Generics)
// 所谓泛型,即通过参数化类型来实现在同一份代码上操作多种数据类型
// 泛型编程是一种编程范式,它利用“参数化类型”将类型抽象化,从而实现更为灵活的复用
// 泛型赋予了代码更强的类型安全,更好的复用,更高的效率,更清晰的约束
// 泛型的语法在表面上与C++中的模板非常类似,但是二者之间有着本质的区别
// Java 中的泛型只接受【引用类型】作为类型参数
// 如:可以定义 List<Integer>,不可以定义 List<int>
// C++中List<A>和List<B>实际上是两个不同的类,而java中
// ArrayList<Integer> 和 ArrayList<String>共享相同的类
// ArrayList<T>
// 语法
// class 名称<泛型列表>
// 如:class ArrayList<E>
// 参数E是泛型,它可以是任何类或接口(除基本数据类型外)
// 集合中使用泛型
// List<E>
// 方法参数
// void do(List<Dog> dogs){…}
// 返回类型
// List<Dog> getDogs(){…}
// 变量声明的类型必须匹配传递给实际对象的类型
// List<Animal> animals = new ArrayList<Animal>();正确
// List<Animal> animals = new ArrayList<Dog>();错误
// 声明一个类型参数为<Object>的List,相当于非泛型集合
// (可将任何Object放入集合中)
// 使用通配符(?)
// 接受所声明变量类型的任何子类型
// void addAnimal(List<? extends Animal> animals)
// Animal可以是类或接口
// 接受父类型的变量
// void addAnimal(List<? super Dog> animals)
// 接受super右边类型或其超类型
// List<?> 与List<? extents Object>完全相同
// List<Object>与List<?>完全不同
// 泛型通配符只能用于引用的声明中,不可以在创建对象时使用
// Fruit<?> fruit=new Fruit<?>();错误
// 不可以使用采用了泛型通配符的引用调用使用了泛型参数的方法

被折叠的 条评论
为什么被折叠?



