集合Collection

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了集合Collection相关的知识,希望对你有一定的参考价值。

集合

因为容器中数据结构不同。容器有很多种,不断的共性功能抽取,形成了集合体系-->集合框架称之为collection接口

集合框架

Collection接口中的共性功能

 

1.添加

Boolean add(Object obj);一次添加一个

Boolean addAll(Collection c);将制定容器中的所有元素添加

2.删除

void clear();

boolean remove(object o);

boolean remove(collection c);

3.获取长度

         int size();

4.判断

   boolean isEmpty();

   boolean contains(Object o)

   boolean containsAll(Collection c)

 

5.将集合转成数组

toArray()

toArray([]);

 

6.取出集合元素

Iterator   iterator[]

迭代:获取集合中元素迭代功能的迭代器对象,是取出元素的一种方式

有没有啊?有!取一个,还有没有啊?没有,算了。

迭代器:具备迭代功能的对象

迭代器对象不需要new,直接通过iterator()方法获取即可

 

迭代器是取出collection集合中元素的公共方法

 

 

Collection

         |--List:有序(存入的顺序和取出的顺序一致)有索引 使用频率非常高

         |--Set

重点list接口中的方法:它的特有方法是围绕着索引定义的

 

支持增删改查

增:

add(index,element)

 

删:

remove(index)

 

set(index , new element)

indexOf(element);

根据某一元素获取其位置

 

 

List集合的具体子类。子类之所以区分是因为内部的数据结构(存储数据的方式)不同

     |---Vector:数据结构是数组。数组是可变长度的(不断new新数组并将新数组元素复制到新数组)增删和查询都慢!

          |---ArrayList:也是数组结构,也是长度可变的,线程是不同步的,替代了Vector。增删速度不快。查询速度很快

          |--LinkedList:链表结构,线程是不同步的。增删速度很快。查询速度较慢

 

LinkedList : 特殊的方法

 

Set集合:不允许重复元素,和Collection的方法相同。Set集合中取出元素的方法只有一个:迭代器

     |--HashSet:哈希表结构,如何保证唯一性?元素必须覆盖HashCode和equals方法

覆盖HashCode方法是根据元素自身的特点确定哈希值,覆盖equals方法是为了解决哈希值冲突。

如何保证元素唯一性?

参考的就是比较方法的返回值是否为零,是,就是重复元素,否则不是

     |--TreeSet:可以对元素进行排序,二叉树数据结构,非同步的。排序方式:需要元素具备比较功能,所以元素需要实现Comparable接口

 

 

 

技巧:jdk以后出现的集合框架中的常用子类对象,存在的规律。前缀名是数据结构名,后缀名是数据结构,后缀名是所属体系名

 

 

ArrayList:数据结构。看到数组,就知道查询快,看到list,就知道可以重复,可以增删改查

 

LinkedList:链表结构,增删快, xxxFirst xxxLast  xxx:add get move

 

HashSet:哈希表,查询速度更快,不保证有序。看到sec就知道不可以重复

 

LinkedHashSet:链表+哈希表。可以实现有序,因为有链表

 

TreeSet:二叉树,可以排序。就想要两种比较方式:一种是自然排序Compareable,一种是比较器CompareTo

泛型:

         在jdk1.4版本以前,容器什么类型的对象都可以存储,但是在取出时,需要用到对象的特有内容,需要做向下转型,但是对象的类型不一致,导致了向下转型发生了classCastException异常

为了避免这个问题,只能主观上控制,往集合中存储的对象类型保持一致

 

Jdk1.5以后解决了该问题,在定义集合时,就直接明确集合中元素的具体类型

这样编译器在编译时,就可以对集合中存储的对象类型进行检查。一旦发现类型不匹配,就编译失败,这个技术就是泛型技术

 

好处:

1.将运行时期的问题转移到了编译时期,可以更好的让程序员发现问题并解决问题

2.避免了向下转型问题

总结

泛型就是应用在编译时期的一项安全机制

 

泛型的擦除

编译器通过泛型对元素类型进行检查,只要检查过,就会生成class文件,但在class文件就将泛型标识去掉了

 

泛型的表现:泛型技术在集合框架中应用的范围很大

                            什么时候需要泛型呢?1.只要看到类,或者接口在描述时右边定义<>就需要泛型。其实是容器在不明确操作元素的类型的情况下,对外提供了一个参数<>

使用容器时,只要将具体的类型实参传递给参数即可

说白了,泛型就是,传递类型参数。

 

Map:双列集合,一次存一对,键值对。要保证键的唯一性

共性的功能:

1.添加

V put(key.value)

putAll

2.删除  void clear();

3.判断

          boolean  contiansKey(object)

     boolean  contiansValue(object)

4.获取

          V get(key)

 

 

 

        

Map

         |--Hashtable:哈希表,是同步的,不允许null键,null值。

         |--HashMap: 哈希表,是不同步的,允许null键,null值。

         |--TreeMap: 二叉树,不同步的。可以对map集合中的键进行排序。

 

 

练习:

 

学生对象(姓名,年龄)都有对应的归属地。

key=Student  value=String.

 

1,

将学生和归属存储到HashMap集合中并取出。

同姓名同年龄视为同一个学生。

 

 

2,

按照学生的年龄进行升序排序并取出。

按照学生的姓名进行升序排序并取出。

集合

因为容器中数据结构不同。容器有很多种,不断的共性功能抽取,形成了集合体系-->集合框架称之为collection接口

集合框架

Collection接口中的共性功能

 

1.添加

Boolean add(Object obj);一次添加一个

Boolean addAll(Collection c);将制定容器中的所有元素添加

2.删除

void clear();

boolean remove(object o);

boolean remove(collection c);

3.获取长度

         int size();

4.判断

   boolean isEmpty();

   boolean contains(Object o)

   boolean containsAll(Collection c)

 

5.将集合转成数组

toArray()

toArray([]);

 

6.取出集合元素

Iterator   iterator[]

迭代:获取集合中元素迭代功能的迭代器对象,是取出元素的一种方式

有没有啊?有!取一个,还有没有啊?没有,算了。

迭代器:具备迭代功能的对象

迭代器对象不需要new,直接通过iterator()方法获取即可

 

迭代器是取出collection集合中元素的公共方法

 

 

Collection

         |--List:有序(存入的顺序和取出的顺序一致)有索引 使用频率非常高

         |--Set

重点list接口中的方法:它的特有方法是围绕着索引定义的

 

支持增删改查

增:

add(index,element)

 

删:

remove(index)

 

set(index , new element)

indexOf(element);

根据某一元素获取其位置

 

 

List集合的具体子类。子类之所以区分是因为内部的数据结构(存储数据的方式)不同

     |---Vector:数据结构是数组。数组是可变长度的(不断new新数组并将新数组元素复制到新数组)增删和查询都慢!

          |---ArrayList:也是数组结构,也是长度可变的,线程是不同步的,替代了Vector。增删速度不快。查询速度很快

          |--LinkedList:链表结构,线程是不同步的。增删速度很快。查询速度较慢

 

LinkedList : 特殊的方法

 

Set集合:不允许重复元素,和Collection的方法相同。Set集合中取出元素的方法只有一个:迭代器

     |--HashSet:哈希表结构,如何保证唯一性?元素必须覆盖HashCode和equals方法

覆盖HashCode方法是根据元素自身的特点确定哈希值,覆盖equals方法是为了解决哈希值冲突。

如何保证元素唯一性?

参考的就是比较方法的返回值是否为零,是,就是重复元素,否则不是

     |--TreeSet:可以对元素进行排序,二叉树数据结构,非同步的。排序方式:需要元素具备比较功能,所以元素需要实现Comparable接口

 

 

 

技巧:jdk以后出现的集合框架中的常用子类对象,存在的规律。前缀名是数据结构名,后缀名是数据结构,后缀名是所属体系名

 

 

ArrayList:数据结构。看到数组,就知道查询快,看到list,就知道可以重复,可以增删改查

 

LinkedList:链表结构,增删快, xxxFirst xxxLast  xxx:add get move

 

HashSet:哈希表,查询速度更快,不保证有序。看到sec就知道不可以重复

 

LinkedHashSet:链表+哈希表。可以实现有序,因为有链表

 

TreeSet:二叉树,可以排序。就想要两种比较方式:一种是自然排序Compareable,一种是比较器CompareTo

泛型:

         在jdk1.4版本以前,容器什么类型的对象都可以存储,但是在取出时,需要用到对象的特有内容,需要做向下转型,但是对象的类型不一致,导致了向下转型发生了classCastException异常

为了避免这个问题,只能主观上控制,往集合中存储的对象类型保持一致

 

Jdk1.5以后解决了该问题,在定义集合时,就直接明确集合中元素的具体类型

这样编译器在编译时,就可以对集合中存储的对象类型进行检查。一旦发现类型不匹配,就编译失败,这个技术就是泛型技术

 

好处:

1.将运行时期的问题转移到了编译时期,可以更好的让程序员发现问题并解决问题

2.避免了向下转型问题

总结

泛型就是应用在编译时期的一项安全机制

 

泛型的擦除

编译器通过泛型对元素类型进行检查,只要检查过,就会生成class文件,但在class文件就将泛型标识去掉了

 

泛型的表现:泛型技术在集合框架中应用的范围很大

                            什么时候需要泛型呢?1.只要看到类,或者接口在描述时右边定义<>就需要泛型。其实是容器在不明确操作元素的类型的情况下,对外提供了一个参数<>

使用容器时,只要将具体的类型实参传递给参数即可

说白了,泛型就是,传递类型参数。

 

Map:双列集合,一次存一对,键值对。要保证键的唯一性

共性的功能:

1.添加

V put(key.value)

putAll

2.删除  void clear();

3.判断

          boolean  contiansKey(object)

     boolean  contiansValue(object)

4.获取

          V get(key)

 

 

 

        

Map

         |--Hashtable:哈希表,是同步的,不允许null键,null值。

         |--HashMap: 哈希表,是不同步的,允许null键,null值。

         |--TreeMap: 二叉树,不同步的。可以对map集合中的键进行排序。

 

 

练习:

 

学生对象(姓名,年龄)都有对应的归属地。

key=Student  value=String.

 

1,

将学生和归属存储到HashMap集合中并取出。

同姓名同年龄视为同一个学生。

 

 

2,

按照学生的年龄进行升序排序并取出。

按照学生的姓名进行升序排序并取出。

以上是关于集合Collection的主要内容,如果未能解决你的问题,请参考以下文章

Java 集合

java之集合概述

Java基础之Collection

容器 的定义

MyBatis 传入数组 集合类 使用foreach遍历

java集合框架collection