Java集合(List/Set/Map)
Java集合(List/Set/Map)
List:
集合框架的体系
1.什么是集合:可以看成是一个容器
2.集合可以做什么:
装数据,感觉容器是一种高级数组, 集合相比数组而言,还要高级一点,集合可以存储任意多个任意类型的数据.
3.继承体系
Collection(所有集合类接口的超级接口)
|–List:特点 有序(添加的顺序)可以重复的数据
|–ArrayList :查询和修改效率高,但是删除和插入效率低。(线程不安全)
|–LinkedList :插入和删除效率高 (线程不安全)
|–Vector : 线程安全
4.学习方式:多查API
5.如何选择
1.有序(添加的顺序)可以重复的数据
2.如果查询和修改的频率高–ArrayList
3.如果插入删除频率高–LinkedList
4.如果要求线程安全–Vector
6. 学习的注意的点:
1.集合的实现类非常多 只需要掌握最常用的
2.会看到 T K V E 现在不用管它 全部当成是Object
7. 重点:
第一:各种集合类的基本使用(创建对象,调用方法)。
第二:分析它们的设计结构。
8.主要学习的内容:ArrayList,LinkedList
ArrayList 内部基于数组的一个容器类;
LinkedList 内部基于链表结构的一个容器类;
ArrayList
1.语法特点
1、内部基于数组实现的一个集合类。查询比较快,添加和删除相对比较慢
2、猜ArrayList中会有哪些功能(方法): 添加、删除、查询、插入、修改。。。【CRUD】
3、不是同步的(存在线程安全问题),如何解决:敬请期待… 用Vector
2.基本使用:参考API一个一个写
1 三个构造函数
2 增删改查【CRUD】
3 数组和List相互转化
3.遍历方式:
(1)for循环
(2)增强for循环【for each】
(3)单向迭代器 Iterator 就是一个迭代器(也是一个接口)
其中的方法如下:
boolean hasNext() 判断是否有下一个元素,如果返回true表示有下一个;
Object next() 调用一次获得一个元素(每调用一次指针会向后移动一个);
void remove() 会从迭代器指向的结合容器中删除一个元素
代码:
ArrayList bag = new ArrayList();
bag.add(“电脑”);
bag.add(200);
bag.add(“鼠标”);
bag.add(“小人书”);
bag.add(“教材”);
bag.add(“牛奶”);
//使用迭代器遍历集合ArrayList bag
// 获得一个迭代器
Iterator it = bag.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
一个一个next
多次迭代
遍迭代遍删除-两个错误演示
结果:只遍历了一次,为什么?
原因:上面两个while使用的是同一个迭代器,第一个while循环完毕就把指针移动到末尾了,所以第二个while不会执行了
(4)双向迭代器
Iterator 单向的迭代器接口,从左到右依次获得数据,判断是否有下一个;获得下一个
|-- ListIterator 双向的迭代器接口,它的主要方法如下:
Iterator中有的它也有;
boolean hasPrevious() 判断是否有上一个;
Object previous() 获得上一个元素;
代码清单:
ArrayList bag = new ArrayList();
bag.add(“电脑”);
bag.add(200);
bag.add(“鼠标”);
bag.add(“小人书”);
bag.add(“教材”);
bag.add(“牛奶”);
// 获得双向的迭代器
ListIterator iterator = bag.listIterator();
while(iterator.hasNext()){
System.out.println(iterator.next());
}
System.out.println("------------------------------------------");
while(iterator.hasPrevious()){
System.out.println(iterator.previous());
}
LinkedList
- 语法特点
1、 内部是基于双向链表结构实现的。添加和删除比较快,查询相对ArrayList比较慢
2、 内部相对于ArrayList而言多了一些操作头和尾的方法
3、 可以充当队列,堆栈
4、 不是线程安全的(同步的)
总结:LinkedList底层是基于双向链表容器类,添加和删除比较快。查找和修改较慢。
2.基本使用:也是多看API
3.遍历方式同ArrayList
Set
1.Set使用大环境
1.无序(以添加的顺序为序,打印出来不是那个顺序),不可重复
2.HashSet - HashSet介绍
(1)HashSet 达到的效果:不能够添加重复的元素.
(2)无序(不保证和添加顺序一致)
(3)可以添加不同类型的数据
2.判断重复的标准
(1)hashCode()???? hashCode 的值有可能会重复)
(2)equals():
(3)如果两个对象的hashCode值相等,并且equals返回为true 就表示对象相等(重复)
(4)根据业务需求,覆写这两个方法
3.覆写equals方法
(1)核心代码
4.覆写hashCode方法
3.TreeSet
- TreeSet介绍
(1) 不能添加重复元素,无序的(添加顺序和打印顺序不一致:不记录添加顺序)
(2) TreeSet容器对象:添加一种类型之后不能再添加其他类型 - 排序方式
(1)Comparable 自然排序
①如果一个类实现了Comparable接口,可以认为这个类的对象具有自然排序的能力(本质就是这个对象可以调用比较的方法compareTo),这种比较和排序的规则就是自然排序
②一般存在3种情况,-1,0,1表示,0表示相等
(2)Comparator 自定义比较器
4.集合的体系Map
|–Hashtable:底层是哈希表数据结构,不可以存入null键null值。该集合是线程同步的。jdk1.0.效率低。
|–HashMap:底层是哈希表数据结构,允许使用 null 值和 null 键,该集合是不同步的。将hashtable替代,jdk1.2.效率高。
|–TreeMap:底层是二叉树数据结构。线程不同步。可以用于给map集合中的键进行排序。
1.什么是Map?
(1)Map是一个接口:将键映射到值的对象。一个映射不能包含重复的键;每个键最多只能映射到一个值
(2)注意实现类HashMap TreeMap
(3)键(Key) 值(value)
(4)Key判断重复的标准: 和 HashSet 、TreeSet一样,是hashCode()与equals()
2.Map方法
(1) put(K key, V value) 在此映射中关联指定值与指定键。
put方法特点:
1.如果key不存在,直接添加进去
2.如果key相同,value值使用最新的值替换key对应的老值.
put方法会返回 对应key对应的老值
(2)boolean containsKey(Object key) 如果此映射包含对于指定键的映射关系,则返回 true。
(3)boolean containsValue(Object value) 如果此映射将一个或多个键映射到指定值,则返回 true
(4)get(Object key) 返回指定键所映射的值。(通过键得到值)
(5)putAll(Map<? extends K,? extends V> m) 将指定映射的所有映射关系复制到此映射中,这些映射关系将替换此映射目前针对指定映射中所有键的所有映射关系。(相当于Collection下面的addAll,把另外一个Map放到当前Map的容器里面)
(6)remove(Object key) 从此映射中移除指定键的映射关系(通过key ,找到value,然后把一对键和值都删掉)
3.Map遍历
(1) 遍历方式一:
Set<Map.Entry<K,V>> entrySet()
返回此映射中包含的映射关系的 Set 视图。
先得到所有的Entry对象,Entry对象就包装了key,values,
②遍历Entry对象的集合,然后依次从Entry对象中调用方法:
getKey(),getValue()
(2) 遍历方式二:
Set keySet() 返回此映射中包含的键的 Set 视图
①先得到所有key,怎么得到?
通过keySet方法取到;
②然后遍历keySet,依次通过key来查找value。
通过Object get(Object key)方法;