Map<T>、Set<T>、List<T>比较总结
| Map<T> | Set<T> | List<T> |
元素特点 | Key-value存储 Key不可重复 Value可重复 | 直接存储 不可重复 | 直接存储 可重复 |
遍历方式取出时 | KeySet+Iterator方式 EntrySet+Iterator方式 | Iterator方式
| Iterator方式 或索引方式 |
遍历取出时 | HashMap无序 TreeMap Key有序 | HashSet无序 TreeSet有序 | 有序(先添加的索引为0) |
使用时注意 事项 | HashMap的Key是否自定义重复规则 TreeMap是否需要自定义比较排序的规则 | 是否需要自定义重复规则 TreeSet是否需要自定义比较排序规则 | 是否有删除或者插入操作,有就LinkedList,有搜索操作用ArrayList |
有无get方式取出 | 有get(Key)方式 | 无get方法 | 有get(index)方式 |
一、List<T>接口的实现类的用法
1、ArrayList<T>直接创建对象进行方法调用,常用方法如下。
1、创建List<T> list = new ArrayList<>();
名称 | 功能 |
add(T) | 增加一个元素 |
get(i ) | 取出某个元素 |
Contains(T) | 是否包含某元素 |
isEmpty() | 集合是否为空 |
Set(index,T) | 替换指定位置的元素 |
Remove(index) | 删除指定元素 |
Clear() | 清空 |
2、遍历方式
1、有索引遍历
For(int i = 0; i < list.size(); i++ )
{
T t = list.get(i);
}
2无索引方式
For(Iterator iter = list.iterator();iter.hasNext();)
{
T t = iter.next();
}
3、底层维护的是数组,是有序的,可以添加重复的元素
2、LinkedList<T>直接创建对象进行方法调用,常用方法如下。
1、创建List<T> list = new LinkedList<>();
名称 | 功能 |
add(T) | 增加一个元素 |
get(i ) | 取出某个元素 |
Contains(T) | 是否包含某元素 |
isEmpty() | 集合是否为空 |
Set(index,T) | 替换指定位置的元素 |
Remove(index) | 删除指定元素 |
Clear() | 清空 |
2、遍历方式
1、有索引遍历
For(int i = 0; i < list.size(); i++ )
{
T t = list.get(i);
}
2无索引方式
For(Iterator iter = list.iterator();iter.hasNext();)
{
T t = iter.next();
}
3、底层维护的是一个个的Entry对象,是有序的,可以添加重复的元素,可以用来实现队列与栈的数据结构。
LinkedList与ArrayList总结
| LinkedList | ArrayList |
使用方式 | New | New |
遍历 | For循环+索引或者Iterator | For循环+索引或者Iterator |
底层 | 双向循环链表 | 数组 |
使用特点 | 有删除和插入操作时 | 搜索操作时 |
List是元素是可重复的,取出是有序的,有get方法取出。 |
二、Set<T>接口的实现类的用法
1、HashSet<T>直接创建对象进行方法调用,常用方法如下。
1、创建Set<T> set = new HashSet<>();
名称 | 功能 |
add(T) | 增加一个元素 |
Contains(T) | 是否包含某元素 |
isEmpty() | 集合是否为空 |
Remove(index) | 删除指定元素 |
Clear() | 清空 |
2、遍历方式
1、只有无索引方式
For(Iterator iter = set.iterator();iter.hasNext();)
{
T t = iter.next();
}
3、HashSet的元素特点是元素无重复,取出时无序,所以在添加元素到集合的时候需要判断此对象是否已经被添加,判断规则需要自己实现,实现的时候一般是元素类中重写HashCode与equals方法。String类已经重写了HashCode与equals方法,内容一样则说明俩个对象一样,默认的Object类的比较方法是判断俩个对象的地址是否一样决定是否为同一元素。
2、TreeSet<T>直接创建对象进行方法调用,常用方法如下。
1、创建Set<T> set = new TreeSet<>();
名称 | 功能 |
add(T) | 增加一个元素 |
Contains(T) | 是否包含某元素 |
isEmpty() | 集合是否为空 |
Remove(index) | 删除指定元素 |
Clear() | 清空 |
First() | 返回第一个元素 |
Last() | 返回最后一个元素 |
2、遍历方式
1、只有无索引方式
For(Iterator iter = set.iterator();iter.hasNext();)
{
T t = iter.next();
}
3) TreeSet的元素特点是元素无重复,取出时有序,所以在添加元素,不仅需要进行对象是否存在的判断,还要进行排序,TreeSet的默认排序规则是自然排序(数字大小)或者字母顺序,对象的顺序需要调用实现自己的比较规则,在元素类定义时实现comparator接口,修改compare方法;
HashSet与TreeSet总结
| Hashset | TreeSet |
使用方式 | New | New |
遍历 | Iterator方式 | Iterator方式 |
使用特点 | 元素无重复 | 元素无重复并有序 |
注意事项 | 实现对象重复比较 | 实现对象重复比较外还需实现有序的规则 |
使用特点在代码上的体现 | 元素类重写HashCode与equals方法 | 元素类实现Comparator接口,并重写compare方法 |
Set<T>元素不可重复,取出时HashSet无序,TreeSet有序,没有get方法取元素,遍历只能用Iterator接口迭代的方法。 |
一、Map<T>接口的实现类的用法(映射机制 Key - value)
1、HashMap<T>直接创建对象进行方法调用,常用方法如下。
1、创建Map<T> map = new HashMap<>();
名称 | 功能 |
put(Key,value) | 增加一对值 |
get(key ) | 取出对应Key的Value值 |
ContainsKey() | 是否包含某个Key |
ContainsValue() | 是否包含某个Value; |
isEmpty() | 集合是否为空 |
EntrySet() | 返回所有实体的Set集合 |
KeySet() | 返回所有key的Set集合 |
Remove(key) | 删除指定Key元素 |
Clear() | 清空 |
Values(); | 返回所有的value集合 |
2、遍历方式
1、KeySet方式遍历
Set<T> set = map.keySet();
For(Iterator iter = set.iterator;iter.hasNext();)
{
T key = iter.next();
T value = map.get(key);
}
2、EntrySet方式遍历
Set<Map.Entry<T>> set = map.EntrySet();
For(Iterator iter = set.iterator;iter.hasNext();)
{
Map.Entry<T> entry = iter.next();
T Key = entry.getKey()
T value = entry.getValue();
}
3、HashMap的元素特点是Key-Value对存储的,Key不能重复,Value可以重复,增加元素对的时候如果该key存在时,则用现在的value代替原来的value值,遍历取出元素对时是无序的,可以用get(Key)的方式取value,如果该Key不存在则返回null;
2、TreeMap<T>直接创建对象进行方法调用,常用方法如下。
1、创建Map<T> map = new TreeMap<>();
名称 | 功能 |
put(Key,value) | 增加一对值 |
get(key ) | 取出对应Key的Value值 |
ContainsKey() | 是否包含某个Key |
ContainsValue() | 是否包含某个Value; |
isEmpty() | 集合是否为空 |
EntrySet() | 返回所有实体的Set集合 |
KeySet() | 返回所有key的Set集合 |
Remove(key) | 删除指定Key元素 |
Clear() | 清空 |
Values(); | 返回所有的value集合 |
2、遍历方式
1、KeySet方式遍历
Set<T> set = map.keySet();
For(Iterator iter = set.iterator;iter.hasNext();)
{
T key = iter.next();
T value = map.get(key);
}
2、EntrySet方式遍历
Set<Map.Entry<T>> set = map.EntrySet();
For(Iterator iter = set.iterator;iter.hasNext();)
{
Map.Entry<T> entry = iter.next();
T Key = entry.getKey()
T value = entry.getValue();
}
3、TreeMap的元素特点是Key-Value对存储的,Key不能重复,Value可以重复,增加元素对的时候如果该key存在时,则用现在的value代替原来的value值,遍历取出元素对时Key是有序的,默认是自然顺序,可以让key类实现Comparator接口自定义Key的排序,可以用get(Key)的方式取value,如果该Key不存在则返回null;
HashMap与TreeMap总结
| Hashset | TreeSet |
使用方式 | New | New |
遍历 | KeySet+Iterator方式 EntrySet+Iterator方式 | KeySet+Iterator方式 EntrySet+Iterator方式 |
使用特点 | Key不可重复Value可重复并取出时无序 | Key不可重复Value可重复并取出时Key有序 |
注意事项 | 无 | 实现对Key的有序的规则 |
使用特点在代码上的体现 | 无 | MyCoparator<Key类型>类实现Comparator接口,并重写compare方法 |
Map<T> 中Key-value对中Key不可重复,value可重复,取出时HashMap无序,TreeSet有序,有get(Key)方法取Value,遍历都可以用KetSet()+Iterator接口迭代和EntrySet()+Iterator接口迭代的方法。 |
TreeMapTreeSet用到设计模式(策略模式 Strategy)
1) 抽象策略角色abstractStrategy(一个抽象类或接口)例如comparator接口
2) 具体策略角色(包装了相关的算法和行为,例如:比较行为)
3) 环境角色(持有抽象策略角色的一个引用,以及改变策略的方法,最终给客户端调用,)
4) 客户端(开发者)
策略模式定义了一系列的算法,并将每一个算法封装起来,而且使他们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。