集合
因为容器中数据结构不同。容器有很多种,不断的共性功能抽取,形成了集合体系-->集合框架称之为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,
按照学生的年龄进行升序排序并取出。
按照学生的姓名进行升序排序并取出。