集合就是存储对象最常用的一种方式
数组和集合同是容器,有何不同?
数组存储基本数据类型,也可以存对象(什么都能存储),数组长度是固定的。
集合只能存储对象,集合长度是可变的。
集合类的特点:
集合只用于存储对象,集合长度是可变的,集合可以存储不同类型的对象。
因为容器中数据结构不同。
容器有很多种,不断地共性功能抽取,形成了集合体系-->集合框架顶层就称之为Collection接口。
collection接口中的共性功能。
1.添加
boolean add(Object obj); 一次添加一个 <返回值boolean表示成功返回true>
boolean addAll(Collection c); 将指定容器中的所有元素添加
2.删除
void clear(); 移除集合中所有元素
boolean remove(Object o); 删除指定的一个元素
boolean removeAll(Collection c); 删除一批元素 c1.removeAll(c2) //将c1中和c2相同的元素从c1中删除
retainAll(Collection c); 和removeAll正相反 c1.retainAll(c2) //将c1中和c2不同的元素从c1中删除。保留c1中和c2相同的元素
3.获取长度
int size(); 有几个元素
4.判断
boolean isEmpty(); 判断有没有元素,如果size为0,返回true
boolean contains(Object o); 判断包含指定的元素
boolean containsAll(Collection c); 判断包含制定collection中的所有元素
5.将集合转成数组
toArray();
6.取出集合元素。迭代器
Iterator iterator()
获取集合中元素上迭代功能的迭代器对象
迭代:取出集合的一种方式。有没有啊?有!取一个。还有没有啊?有!取一个。还有没有啊?没有。算了。
迭代器:具备着迭代功能的对象。
而迭代器对象不需要new。直接通过iterator()方法获取即可。
迭代器是取出collection集合中元素的公共方法
1.添加
boolean add(Object obj); 一次添加一个 <返回值boolean表示成功返回true>
boolean addAll(Collection c); 将指定容器中的所有元素添加
2.删除
void clear(); 移除集合中所有元素
boolean remove(Object o); 删除指定的一个元素
boolean removeAll(Collection c); 删除一批元素 c1.removeAll(c2) //将c1中和c2相同的元素从c1中删除
retainAll(Collection c); 和removeAll正相反 c1.retainAll(c2) //将c1中和c2不同的元素从c1中删除。保留c1中和c2相同的元素
3.获取长度
int size(); 有几个元素
4.判断
boolean isEmpty(); 判断有没有元素,如果size为0,返回true
boolean contains(Object o); 判断包含指定的元素
boolean containsAll(Collection c); 判断包含制定collection中的所有元素
5.将集合转成数组
toArray();
6.取出集合元素。迭代器
Iterator iterator()
获取集合中元素上迭代功能的迭代器对象
迭代:取出集合的一种方式。有没有啊?有!取一个。还有没有啊?有!取一个。还有没有啊?没有。算了。
迭代器:具备着迭代功能的对象。
而迭代器对象不需要new。直接通过iterator()方法获取即可。
迭代器是取出collection集合中元素的公共方法
---------------------------------------------------------------------------------------------------
Collection 有两个子接口
|--List:有序(存入的顺序和取出的顺序一致)。有索引,允许重复元素。
|--Set :不允许重复元素
重点List接口中的特有方法:它的特有方法都是围绕索引定义的
Collection 有两个子接口
|--List:有序(存入的顺序和取出的顺序一致)。有索引,允许重复元素。
|--Set :不允许重复元素
重点List接口中的特有方法:它的特有方法都是围绕索引定义的
支持增删查改
增:
add(index,element) //element:元素
删:
remove(index);
改:
set(index,newelement);
查:
int indexOf(element);
element get(index);
增:
add(index,element) //element:元素
删:
remove(index);
改:
set(index,newelement);
查:
int indexOf(element);
element get(index);
List集合的具体子类。子类之所以区分是因为内部的数据结构(存取数据的方式)不同。
|--Vector:数据结构是数组。数组是可变长度的(不断new新数组并将原数组元素复制到新数组)。线程同步的。增删和查询都慢!
|--ArrayList:也是数组结构,也是长度可变的。线程不同步的,代替了Vector。增删速度不快,查询速度很快。 判断元素是否相同依赖equals
|--LinkedList:链表结构,线程不同步的。增删速度很快。查询速度较慢。 链表:链接的列表,每一个记录了上一个元素的地址
Set集合:不允许重复元素(也就是Set集合这个大框架下面所有的子类都不允许)
和Collection的方法相同。Set集合取出方法只有一个:迭代器 取出元素是无序的
|--HashSet:哈希(散列)表结构。
如何保证唯一性?
元素必须覆盖hashcode和equals方法
覆盖hashcode方法是为了根据元素自身的特点确定哈希值
覆盖equals方法,是为了解决哈希值的冲突
|--TreeSet:二叉树数据结构。可以对元素进行排序。不同步的。
如何保证元素唯一性?
参考的就是比较方法的返回值是否为0,是,就是重复元素,不存。
排序方式:需要元素具备比较功能。所以元素需要实现Comparable接口。覆盖compareTo方法。
需求中也有这样一种情况,元素具备的比较功能不是所需要的,也就是说不想按照
自然排序的方法,而是按照自定义的排序方式,对元素进行排序。
而且,存储到TreeSet中的元素万一没有比较功能,该如何排序呢?
这时,就只能使用第二种比较方式--是让集合具备比较功能,定义一个比较器
实现Comparator接口,覆盖compare方法。将Comparator接口的对象,
作为实参传递给TreeSet集合的构造函数。
比较器更为灵活。自然排序通常作为元素的默认排序。
用于存储元素和哈希值对应关系的容器称之为哈希表。
不允许存储重复元素,因为会发生查找的不确定性。不保证存入和取出的顺序一致。比数组的查询效率高。
当哈希算法算出的两个元素的值相同时,称为哈希冲突。冲突后,需要对元素进行进一步判读,判断的是元素的内容,依赖equals
哈希表在判断元素是否相同:依据hashCode方法,如果哈希冲突(哈希值相同),再判断元素equals方法。equals返回true,不存。返回false,存储!
堆的底层就是一种哈希表结构,所以每个对象都具备hashCode方法。 hashCode()这个方法它本身调用的是系统本地(windows)的算法
技巧:
jdk1.2以后出现的集合框架中的常用子类对象,存在的规律
前缀名是数据结构名,后缀名是所属体系名
和Collection的方法相同。Set集合取出方法只有一个:迭代器 取出元素是无序的
|--HashSet:哈希(散列)表结构。
如何保证唯一性?
元素必须覆盖hashcode和equals方法
覆盖hashcode方法是为了根据元素自身的特点确定哈希值
覆盖equals方法,是为了解决哈希值的冲突
|--TreeSet:二叉树数据结构。可以对元素进行排序。不同步的。
如何保证元素唯一性?
参考的就是比较方法的返回值是否为0,是,就是重复元素,不存。
排序方式:需要元素具备比较功能。所以元素需要实现Comparable接口。覆盖compareTo方法。
需求中也有这样一种情况,元素具备的比较功能不是所需要的,也就是说不想按照
自然排序的方法,而是按照自定义的排序方式,对元素进行排序。
而且,存储到TreeSet中的元素万一没有比较功能,该如何排序呢?
这时,就只能使用第二种比较方式--是让集合具备比较功能,定义一个比较器
实现Comparator接口,覆盖compare方法。将Comparator接口的对象,
作为实参传递给TreeSet集合的构造函数。
比较器更为灵活。自然排序通常作为元素的默认排序。
用于存储元素和哈希值对应关系的容器称之为哈希表。
不允许存储重复元素,因为会发生查找的不确定性。不保证存入和取出的顺序一致。比数组的查询效率高。
当哈希算法算出的两个元素的值相同时,称为哈希冲突。冲突后,需要对元素进行进一步判读,判断的是元素的内容,依赖equals
哈希表在判断元素是否相同:依据hashCode方法,如果哈希冲突(哈希值相同),再判断元素equals方法。equals返回true,不存。返回false,存储!
堆的底层就是一种哈希表结构,所以每个对象都具备hashCode方法。 hashCode()这个方法它本身调用的是系统本地(windows)的算法
技巧:
jdk1.2以后出现的集合框架中的常用子类对象,存在的规律
前缀名是数据结构名,后缀名是所属体系名
ArrayList:数组结构。看到数组就知道查询快,看到list,就知道可以重复,可以增删改查。
LinkedList:链表结构。增删快。 xxxFirst xxxLast xxx:add get remove
HashSet:哈希表,就要想到元素必须覆盖hashCode equals,不保证有序。看到Set,就知道不可以重复。
LinkedHashSet:链表+哈希表。可以实现有序,因为有列表。
TreeSet:二叉树,可以排序,就要想两种比较方式:一是自然顺序comparable, 一种是比较器compartor
--------------------------------------------------------------------------------------------------
泛型:
在JDK1.4版本前,容器什么类型的对象都可以存储。但是在取出时,需要用到对象的特有内容时,需要向下转型。
对象的类型不一致,导致向下转型发生ClassCastException异常。
在JDK1.5解决了该问题,在定义集合时候,就明确了集合中储存元素的类型。
这样,编译器在编译时,就可以对集合中储存的对象类型进行检查。
一旦发现类型不匹配,就编译失败。这就是泛型技术
好处:
1.将运行时期的问题转移到了编译时期,可以更好的发现问题
2.避免向下转型的麻烦
总结:泛型就是应用在编译时期的一项安全机制
1.将运行时期的问题转移到了编译时期,可以更好的发现问题
2.避免向下转型的麻烦
总结:泛型就是应用在编译时期的一项安全机制
泛型的擦除:编译器通过泛型对元素类型进行检查,只要检查通过,
就会生成class文件,但在class文件中,就将泛型标识去掉了
泛型的表现:泛型技术在集合集合框架中应用的范围很大
什么时候需要写泛型呢?1,只要看到类,或者接口在描述时右边定义<>,就需要泛型。
使用容器时,只要将具体类型实参传递给该参数即可。
说白了,泛型就是,传递类型实参。
就会生成class文件,但在class文件中,就将泛型标识去掉了
泛型的表现:泛型技术在集合集合框架中应用的范围很大
什么时候需要写泛型呢?1,只要看到类,或者接口在描述时右边定义<>,就需要泛型。
使用容器时,只要将具体类型实参传递给该参数即可。
说白了,泛型就是,传递类型实参。
--------------------------------------------------------------------------------------------------
Map:双列集合,一次存一对,键值对。要保证键的唯一性。
共性的功能:
1.添加
v put(key,value);
putAll(Map<k,v> map);
2.删除
void clear();
v remove(key);
3.判断
boolean containKey(object)
boolean containValue(object);
boolean isEmpty();
4.获取
v get(key)
int size()
Map
|-- Hashtable:哈希表,是同步的,不允许null键和null值
|-- HashMap:哈希表,是不同步的,允许null键null值
|-- TreeMap:二叉树,是不同步的。可以对map中的键进行排序。
HashSet和TreeSet的底层就是 HashMap和TreeMap。
Map集合取出(遍历)所有元素,用keySet,entrySet方法获取元素,元素转为Set集合,再用迭代器
--------------------------------------------------------------------------------------------------
集合框架的工具类。
Collections:定义的都是操作Collection的静态方法
1.对list排序。
sort(list);
2.逆序
reverseOrger
3.max min
4.二分查找:binarySearch
5.将非同步集合转成同步集合
----------------------------------------------------------
Map:双列集合,一次存一对,键值对。要保证键的唯一性。
共性的功能:
1.添加
v put(key,value);
putAll(Map<k,v> map);
2.删除
void clear();
v remove(key);
3.判断
boolean containKey(object)
boolean containValue(object);
boolean isEmpty();
4.获取
v get(key)
int size()
Map
|-- Hashtable:哈希表,是同步的,不允许null键和null值
|-- HashMap:哈希表,是不同步的,允许null键null值
|-- TreeMap:二叉树,是不同步的。可以对map中的键进行排序。
HashSet和TreeSet的底层就是 HashMap和TreeMap。
Map集合取出(遍历)所有元素,用keySet,entrySet方法获取元素,元素转为Set集合,再用迭代器
--------------------------------------------------------------------------------------------------
集合框架的工具类。
Collections:定义的都是操作Collection的静态方法
1.对list排序。
sort(list);
2.逆序
reverseOrger
3.max min
4.二分查找:binarySearch
5.将非同步集合转成同步集合
----------------------------------------------------------
Arrays:用来操作数组的工具类,方法都是静态的