黑马程序员___Java基础[08-集合]

时间:2022-05-12 00:43:58

一、集合的概念

1、为什么出现集合类?

面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,就对对象进行存储。

集合就是存储对象最常用的一种方式。

2、什么是集合?

集合是用来存储对象的(其实存储的是对象的引用),长度可变的容器。

基本数据类型也可以装入集合,但其实内部是先自动装箱成包装类对象,然后再存入集合的。

3、数组和集合类同是容器,有何不同?

a、存储内容:数组既可以存储基本数据类型也可以存储对象;集合只用于存储对象(或包装类对象)。

b、长度:数组长度是固定的;集合长度是可变的。

c、数据类型:数组只能存储同一种数据类型,集合可以存储不同类型的对象。

二、集合的分类

1、集合框架:存储对象的容器有很多种,工程师们在使用过程中发现它们有许多共性的内容,于是就把它们不断向上抽取,形成了体系——集合框架。

2、为什会出现这么多的容器:数据的存储方式称为“数据结构”,不同数据结构数据的操作特点不同,于是就出现了以不同存储方式存储数据的容器。

3、学习一个体系的原则:参阅顶层,创建底层

要先看顶层,因为顶层定义的是体系中最共性、最基本的内容;

然后创建子类对象使用,因为顶层有可能是抽象的不能创建对象,而且子类对象方法更多一些。

4、集合框架:最顶层是Collection接口存放在java.util包中

5、集合框架的构成及分类

黑马程序员___Java基础[08-集合]

a、Collection 一次存一个对象,单列集合

List:可重复,有索引(有存储顺序)

ArrayList 数组实现,增删慢,查找快

LinkedList 链表实现,增删快,查找慢

Vector  数组实现,原理和ArrayList相同,但线程安全

Set    不可重复,没索引

HashSet  使用哈希算法去重复,效率高,但元素无序

TreeSet  TreeSet是使用二叉树算法排序的,可以指定一个顺序,对象存入之后会按照指定的顺序排列

LinkedHashSet  HashSet的子类, 原理相同, 除了去重复之外还能保留存储顺序

b、Map  一次存两个对象, 键值对

HashMap  使用哈希算法对键去重复, 效率高, 但无序

TreeMap  使用二叉树算法排序, 可以自定义顺序

Hashtable  类似HashMap, 线程安全, 效率略低, 不允许null键和null值

LinkedHashMap  使用哈希算法去重复, 并且保留存储顺序

Properties  Hashtable的子类, 用来操作配置文件

三、集合的常用方法

1、常用方法

add(Object obj)    向集合中添加一个元素,添到最后的位置

get(int index)       获取集合中指定位置的元素

size()             获取集合的长度

add(int index, Object obj)  向集合中添加一个元素, 添到指定位置

set(int index, Object obj)  把集合中指定位置的元素替换

remove(int index)    删除集合中指定位置的元素

remove(Object obj)   删除集合中包含的obj对象(遍历集合中的元素如果传入的元素equals某个元素就调用remove方法、注意:角标要--)

2、迭代集合

a、for循环:从0循环到集合的size()-1,每次获取其中一个

b、迭代器:调用iterator()方法获取迭代器,使用hasNext()判断是否包含下一个元素,使用next()获取下一个元素

c、增强for循环:for (类型 变量名:容器) { 循环体 } 容器中有多少个元素就执行多少次循环体,每次循环变量指向容器中不同的元素

3、迭代时删除的问题

a、for循环:删除时由于后面的元素会向前移动,所以删除之后循环变量要--

b、迭代器:要删除元素时必须使用Iterator中的remove()否则会抛出异常

c、增强for循环:不能删除

四、HashSet

1、HashSet原理

我们使用Set集合都是需要去掉重复元素的, 如果在存储的时候逐个equals()比较, 效率较低

哈希算法提高了去重复的效率, 降低了使用equals()方法的次数

当HashSet调用add()方法存储对象的时候, 先调用对象的hashCode()方法得到一个哈希值, 然后在集合中查找是否有哈希值相同的对象

如果没有哈希值相同的对象就直接存入集合

如果有哈希值相同的对象, 就和哈希值相同的对象逐个进行equals()比较

比较结果为false就存入, true则不存

2、将自定义类的对象存入HashSet去重复

类中必须重写hashCode()和equals()方法

hashCode(): 属性相同的对象返回值必须相同, 属性不同的返回值尽量不同(提高效率)

equals(): 属性相同返回true, 属性不同返回false,返回false的时候存储

五、迭代(遍历)

1、List

a、普通for循环, 使用get()逐个获取

b、调用iterator()方法得到Iterator, 使用hasNext()和next()方法

c、增强for循环, 只要可以使用Iterator的类都可以用

d、Vector集合可以使用Enumeration的hasMoreElements()和nextElement()方法

2、Set

a、调用iterator()方法得到Iterator, 使用hasNext()和next()方法

b、增强for循环, 只要可以使用Iterator的类都可以用

六、TreeSet

1、特点

TreeSet是用排序的, 可以指定一个顺序, 对象存入之后会按照指定的顺序排列

2、使用方式

a、自然顺序(Comparable)

TreeSet类的add()方法中会把存入的对象强转成Comparable类型

调用对象的compareTo()方法和集合中的对象比较

根据compareTo()方法返回的结果进行存储

b、比较器顺序(Comparator)

创建TreeSet的时候可以制定 一个Comparator

如果传入了Comparator, 那么TreeSet就不会按照自然顺序排序了

add()方法内部会自动调用Comparator接口中compare()方法排序

c、两种方式的区别

TreeSet构造函数什么都不传, 默认按照类中Comparable的顺序(没有就报错ClassCastException)

TreeSet如果传入Comparator, 就优先按照Comparator

七、Map集合

1、Map集合的特点

Map集合一次存储两个对象, 一个键对象, 一个值对象

键对象在集合中是唯一的, 可以通过键来查找值

2、Map常用方法

put() 存储一条记录, 一个键和一个值

get() 根据键对象获取值

containsKey() 判断是否包含指定的键

containsValue() 判断是否包含指定的值

remove() 根据键删除一条记录

size() Map集合中的记录数

values() 得到所有的值对象组成的一个Collection集合

3、迭代Map集合

a、keySet()

先调用keySet()方法从Map集合中获取所有Key组成的一个Set集合

迭代Set集合可以得到每一个Key

然后再调用get()方法通过Key获取每一个Value

b、entrySet()

先调用entrySet()方法从Map集合中获取所有Entry(键值对)组成的一个Set集合

迭代Set集合可以得到每一个Entry

然后再调用getKey()和getValue()方法得到每一个Key和每一个Value

4、HashMap

在使用HashMap存储键值对的时候, 先调用Key对象的hashCode()方法计算一个哈希值, 在Map中查找是否有相同哈希值的Key对象

如果没有哈希值相同的Key对象, 这个键值对直接存入

如果有哈希值相同的Key对象, 那么就进行equals比较

比较结果为false就存入, true则覆盖原Value

5、LinkedHashMap

HashMap的子类, 算法相同, 但保留了存储的顺序

6、TreeMap

在使用TreeMap存储键值对的时候, 会使用Key对象和集合中已存储的Key对象进行比较, 确定二叉树上的位置

比较的方式和TreeSet指定的方式相同, Comparable和Comparator

7、Hashtable

类似HashMap, 线程安全, 效率略低, 不允许null键和null值

8、Properties

Hashtable的子类, 用来操作配置文件

八、集合的迭代

1、Collection

Iteraotr:   通过iterator()方法得到迭代器, 调用hasNext()和next()方法进行迭代

ForEach:    for (类型  变量名 : 容器) { 循环体 }

2、Map

keySet():   得到所有的键组成的Set, 遍历Set得到每一个键, 然后再分别获取值

entrySet(): 得到所有的Entry组成的Set, 遍历Set得到每一个Entry, 再分别getKey()和getValue()

3、List

Iterator

ForEach

for: 根据索引定义for循环, 调用get()方法根据索引获取每一个元素

4、Vector

Iterator

ForEach

for

Enumeration: 类似Iterator, 通过elements()方法得到Enumeration, 调用hasMoreElements()和nextElement()方法进行迭代

九、重点(必须会的)

1、了解ArrayList, LinkedList, HashSet, TreeSet, HashMap, TreeMap的特点

2、会迭代ArrayList, LinkedList, HashSet, TreeSet, HashMap, TreeMap

3、会用哈希算法(hashCode,equals), 会用二叉树算法(Comparable,Comparator)