记录生活中的点点滴滴

0%

进阶7

迭代器,集合获取到迭代器之后,可以使用迭代器去遍历集合
List

  存储元素的特点:有序可重复.有序,存进去是什么顺序,取出来时候还是这个顺序

  ArrayList底层使用的是数组存储元素的,所以ArrayList适合查询,不适合频繁的增删元素

  LinekList底层使用双向链表这种数据结构存储数据的,链表适合频繁的增删元素,不适合查询操作

  Vector集合底层和ArrayList相同,但是Vector是线程安全的,效率较低
Set

  存储元素的特点:无序不重复.存进去的时候是这样一个顺序,取出来的时候就不一定是这个顺序取出了

哈希表/散列表

Sorted 继承 Set

 存储元素的特点:无序不重复的。但是存储进去的元素可以按照元素的大小自动排序

Collection 常用方法

boolean add(Object element) 向集合中请添加元素
void clear() 清空集合
boolean isEmpty() 判断集合是否为空
int size() 获取集合中元素个数

Interator iterator() 获取集合所依赖的迭代器对象

 通过迭代器中方法完成集合的迭代(遍历)

 注意:这种方式是所有集合通用的遍历方式

迭代器面向接口编程
不需要关心底层集合的具体类型,所有集合依赖的迭代器都实现了java.util.Iterator接口
hasNext 判断是否还有更多的元素
next 将迭代器向下移动一位,并取出指向的元素

boolean contains(Object o) 集合中是否包含某个元素

 底层调用的是equals方法,如果equals返回true,就是包含
boolean remove(Object o) 删除集合中某个元素

存储在集合中的元素应该去重写equals方法

boolean remove(Object o)
remove和contains都需要集合中的元素重写equals方法,因为Object中的equals方法
比较内存地址,在现实的业务逻辑当中不能比较内存地址,该比较内容

深入remove方法

 1.迭代器的remove方法

 2.集合自身带的remove方法
推荐使用迭代器本身自带的方法删除元素

List集合存储元素特点:

 1.有序(List元素存储有下标):存进去是这样的顺序,取出来还是按照这个顺序取出

 2.可重复

深入List集合
ArrayList集合底层是数组,数组下标是有序的
所以在ArrayList集合有很多自己的特性
ArrayList集合底层默认初始化容量是10,扩大之后的容量是原容量的1.5倍
Vector集合底层默认初始化容量是10,扩大之后的容量是原容量的2倍

如何优化ArrayList和Vector

 尽量减少扩容操作,因为扩容需要数组拷贝,数组拷贝很耗内存

 一般推荐在创建集合的时候指定初始化容量

Set集合:HashSet

  • HashSet底层实际上是一个HashMap,HashMap底层采用了哈希表数据结构

  • 哈希表又叫散列表,哈希表底层是一个数组,这个数组中每一个元素是一个单向链表
    每个单向链表都有独一无二的hash值,代表数组的下标.在某个单向链表的每一个节点
    上的hash值是相等的.hash值实际上是key调用hashCode方法,再通过“hash function”

    转换成的值

  • 如何向哈希表中添加元素:

       先调用被存储的key的hashCode方法,经过某个算法得出hash值,如果在这个哈希表中

        不存在这个hash值,则直接添加元素.如果该hash值已经存在,继续调用key之间的equals

    方法,如果equals返回false,则将该元素添加。如果equals方法返回true,则放弃添加该元素

  • HashSet其实是HashMap中的key部分。HashSet有什么特点,HashMap中的key应该具有相同的特点
    5.HashMap和HashSet初始化容量都是16,默认加载因子是0.75

关于往Set集合中存储的元素,该元素的hashCode方法和equals方法
HashMap中有一个put方法,put(key,value) key是无序的不可重复的
结论:存储在HashSet集合或者HashMap集合key部分的元素,需要同时重写hashCode1+equals

java.util.Set

 java.util.SortedSet 无序不重复,但是存进去的元素可以按照元素大小自动排序

  java.util.TreeSet

SortedSet存储元素为什么可以自动排序? (equals返回false,才会比较)

  因为被存储的元素实现了Comparable接口,

 SUN编写TreeSet集合在添加元素的时候,会

 调用compareTo方法完成比较

让SortedSet集合做到排序还有另一种方式java..util.Comparator
单独编写一个比较器

map集合中的常用方法
void clear() 清空map
boolean containsKey(Object key) 判断集合中是否包含这样的key
boolean containsValue(Object value) 判断集合中是否包含这样的value

Set<Map.Entry<K,V>> entrySet()

  返回此映射中包含的映射关系的 Set 视图。

V get(Object key) 通过key获取value
boolean isEmpty() 判断该集合是否为空
Set keySet() 获取map中所有key
V put(K key, V value) 向集合中添加键值对
V remove(Object key) 通过key删除元素
int size() 获取map中键值对的个数
Collection values 获取map集合中所有value
Set keySet() 获取所有的key
set entrySet() Map转换成Set

注意:存储在Map集合key部分的元素需要同时重写hashCode+equals

  HashMap和HashSet初始化容量都是16,默认加载因子是0.75

Map中如果key重复了,value采用的是“覆盖”

HashMap和HashSet初始化容量都是16,默认加载因子是0.75
Hashtable默认初始化容量是11,默认加载因子是0.75
java.util.Properties 也是由key和value组成,但是key和value都是字符串类型

SortedMap中的key特点:无需不可重复,但是存进去的元素可以按照大小自动排序
如果想自动排序:key部分的元素需要,1.实现comparable接口 2.单独写一个比较器

关于集合工具类 java.util.Collections
java.util.Collecition 集合接口

  Collections工具类可以对List集合中的元素排序,但是集合中的元素必须是“可比较的”,实现comparable接口

关于JDK5.0新特性的新特性:泛型(编译期概念)

 1.为什么引入泛型?

  1.可以统一集合中的数据类型

  2.可以减少强制类型转换

 2.泛型语法如何实现?

  泛型是一个编译阶段的语法

  在编译阶段统一集合中的类型

 3.泛型的有点和缺点?

  优点:同一类型,减少强制转换

  缺点:类型太统一了

自定义泛型

JDK5.0新特性:

 关于增强for循环

 语法:

  for(类型 变量:数组名/集合名){}

 集合要想使用增强for循环这种语法,集合需要使用泛型

 如果集合不使用泛型,该集合在使用增强for循环的时候应该使用Object类型定义

关于增强for的缺点:没有下标