黑马程序员Java笔记——集合篇(一)

来源:互联网 发布:淘宝搜索引擎工作流程 编辑:程序博客网 时间:2024/05/18 02:25

----------- android培训java培训、java学习型技术博客、期待与您交流! ---------

集合

关键词:集合框架 堆栈 队列  二叉树 List Set

(1)为什么出现集合类?

面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,就对对象进行存储,集合就是存储对象最常用的一种方式

 

(2)数组和集合类同是容器,有何不同?

2.1数组虽然也可以存储对象,但长度是固定的;

2.2集合长度是可变的;

2.3数组中可以存储基本数据类型,集合能存储任意对象(其实存储的是地址引用);

 

(3)集合类的特点

集合只用于存储对象,集合长度是可变的,集合可以存储不同类型的对象。

集合容器因为内部的数据结构不同,有多种具体容器。向上抽取共性,集合框架。

框架的顶层Collection接口体系:

(本来是用XMind做好的,要搬到博客上才发现贴图太麻烦,就用缩进做了个大概,各位看官先凑活看吧)

Collection (体系根接口)
List接口
(常用实现子类)
ArrayList
LinkedList
Vector
Set接口
(常用实现子类)
HashSet
TreeSet

Collection的常见功能:

1.添加:

1.1 boolean add(Object obj):

1.2 boolean  addAll(Collection coll):

2.删除:

2.1 boolean remove(Object obj):

2.2 boolean removeAll(Collection coll):

2.3 void clear( );

3.判断:

3.1 boolean  contains(Object obj)

3.2 boolean containsAll(Collection  coll);

3.3 boolean  isEmpty( ):判断集合中是否有元素

4.获取:

4.1 int size( );

4.2 iterator( ):取出元素的方式:迭代器——原理:内部类实现

该对象必须依赖于具体的容器因为每一个容器的数据结构都不同。所以迭代器对象是在容器中进行内部实现的。

只要通过容器获取到该实现的迭代器的对象即可。

在迭代过程中,不要使用集合操作元素,容易发生异常(并发线程异常)

可以使用Iterator接口的子接口ListIterator来完成

Iterator接口就是对所有的Collection容器进行元素的公共接口


5.其他:

5.1  boolean retainAll(Collection coll):取交集

5.2 Object[ ] toArray( ):将集合转换成数组

 

-----------------------------------------------------------------------------------------------------------------

Collection

|

|

List:有序:存入和取出的顺序一致;元素都有索引(角标);元素可以重复

|

|

Set: 元素不重复,无序。(也有可能有序)

 

--------------------------------------------------------------------------------------------------------------

List:常见方法

(1) 添加: 

1.1 void add( index, element):

1.2 void add(index, collection):

(2) 删除:

2.1 Object remove(index):

(3) 修改:

3.1 Object set(index element):

(4) 获取

4.1 Object get(index):——List专有

4.2 int indexOf(Object);

4.3 int lastIndexOf(Object);

4.4 List subList(from, to); 

 

ListIterator接口可以实现在迭代过程中完成对元素的增删改查;且只有List集合具备该迭代功能

List:常用子类(不同步的子类为了效率)

|——Vector:内部是数组数据结构,此实现是同步的。增 删 查询,速度慢

|——ArrayList:内部是数组数据结构,此实现是不同步的。替代了Vector查询速度快

|——LinkedList:内部是链表数据结构,此实现是不同步的。增删元素速度快

(链表结构———铁索连舟)

 

LinkedList类中方法

addFirst():

addLast():

JDK1.6中为:

offerFirst():

offerLast():

getFirst():获取但不移除,如果链表为空,调用此方法时会抛出异常

getLast():

JDK1.6中为:

peekFirst():获取但不移除,如果链表为空,调用此方法时会返回null

peekLast()

 

removeFirst():获取但移除,如果链表为空,调用此方法时会抛出异常

removeLast():

JDK1.6中为:

pollFirst():获取但移除,如果链表为空,调用此方法时会抛出异常

pollLast():

 

ArrayList类中方法:

(如何在ArrayList集合存储自定对象)

 

 

Set:不包含重复元素的Collection,是无序。

判断元素唯一性的方式:就是根据比较方法的返回结果是否为00就是相同元素,不存。

Set接口中的方法与Collection接口中的一种

|——HashSet( )内部数据结构是哈希表;此实现不同步;

|       |——LinkedHashSet( ):有序

|           

|——TreeSet( )使用元素的自然顺序对Set集合元素进行排序;此实现是不同步


使用TreeSet( )方法来进行排序方式1

让元素自身具有比较功能:让元素实现compare接口覆写compare()方法;

 

排序方式2:(如果对象没有排序标准)

如果不具备自然顺序,可以让集合自身具备比较功能:定义一个类实现Compareto接口,并覆盖compare方法,将该类对象最为参数传递给TreeSet集合的构造函数。

 

二叉树:也叫红黑树;一种数据结构,可以用来排序

 

关于哈希表:

可以理解为类似为数组,根据算法来对元素进行运算并获取其存储位置。

(如果,再次查找这个元素,不必遍历数组,而是在用算法进行一次运算,得到位置后,到该位置上进行验证)

哈希表确定元素是否相同:

1.判断的两个元素的哈希值是否相同;如果相同,再判断两对象的内容是否相同。

2.判断哈希值相同,用判断对象的hashCode的方法;判断内容相同,用equals方法。(如果哈希值冲突,内容不同,则要么串联,要么顺延等多种方法来解决)

3.注意:如果哈希值不同,不必判断内容。

 

泛型:(直译)广泛的类型 <Date Type >。泛型类; 泛型方法;   泛型接口;

 

Java是一种强类型语言,它为每一种数据确定了强制的类型;

泛型是JDK1.5出现的安全机制;加强了编译时期的数据类型安全,编译完成后生成的class文件,中是不带泛型的,这个称为泛型的擦除。这样做的原因是为了兼容运行的类加载器。

泛型的补偿:在运行时通过获取元素的类型进行转换动作。()不用使用者进行强制转换了

 

优点:

1.将运行时期的问题ClassCastException转到了编译时期;(提高了编译时期的安全系数,确保了类型的安全)

2.避免了强制类型转换的麻烦;

< >应用情景:

当操作的引用数据类型不确定的时候。就使用< >。将要操作的引用数据类型传人即可。其实,< >就是一个用于接收具体引用数据类型的参数范围。

在程序中,只要用到带有< >的类型或者接口,就要明确传入的具体引用数据类型

泛型在集合中应用广泛,因为,集合可以接受多种类型的参数,需要用泛型来指定类型。

注意:泛型中不能传人基本数据类型。因为集合是存储对象(引用数据类型不定)的一种容器;

迭代器的泛型数据类型和获取迭代器对象集合的泛型数据类型一致。

 

泛型类:在JDK1.5版本后,使用泛型来接收类中要操作的引用数据类型被称为泛型类。

适用情景:当引用的数据类型不确定时。

使用好处:将运行时的错误提前暴露在编译阶段。

 

泛型方法:将泛型定义在方法上。

当方法是静态时,不能访问类上定义的泛型。如果静态方法使用泛型,只能将泛型定义在方法上。

 

泛型接口:把泛型定义在接口上;

 

泛型通配符用法:

 通配符 ? 代表含义:未知类型;一般情况下泛型左右两边要一致

当数据类型未知的情况下可以用?表示。

泛型的限定:只有符号条件的一部分类型可以通过

? extends E:接收E类型或者是E的子类型对象。泛型限定上限 

? super E:接收E类型或者是E的父类型对象。泛型设定下限

适用情景:

当往集合中存元素的时候,多用泛型限定上限,因为取出元素都是按照类型上限来进行运算的,不会出现类型安全隐患。

 

集合的一些技巧:

根据命名来判断和记忆:后缀名就是该集合所属的体系;

1.存取集合中的元素需要唯一用 Set

  |——需要指定顺序:TreeSet

  |——不需要指定顺序:HashSet

  |——需要一个和存储一致的顺序: LinkedHashSet 

 

2.存取集合中的元素不需要唯一用 List

|——需要频繁增删:LinkedList

|——不需要频繁增删:ArrayList

 

 

3.如何记忆每一个容器的结构和所属体系

Set

 |——HashSet

 |——TreeSet

 

List

|——ArrayList

|——LinkedList

 

 

前缀名就是该集合的数据结构。

Array:代表数据有角标,查询快;

Link:代表链表,增删快;方法 add get remove first / last

Hash:代表哈希表,唯一性;覆写hashcode方法 和 equals方法。

Tree:代表二叉树,排序;接口Comparable, Comparator

 

通常这些常用的集合容器都是不同步的,效率较高。

 Collections:工具类

常用方法:

排序 - sort()

折半 - binarySearch()

逆序 - reverseOrder()

乱序 - shuffle()

复制 - copy()

0 0
原创粉丝点击