List Map区别
Collection
是对象集合,
Collection
有两个子接口
List
和
Set
List
可以通过下标
(1,2..)
来取得值,值可以重复
而
Set
只能通过游标来取值,并且值是不能重复的
ArrayList
,
Vector
,
LinkedList
是
List
的实现类
ArrayList
是线程不安全的,
Vector
是线程安全的,这两个类底层都是由数组实现的
LinkedList
是线程不安全的,底层是由链表实现的
Map
是键值对集合
HashTable
和
HashMap
是
Map
的实现类
HashTable
是线程安全的,不能存储
null
值
HashMap
不是线程安全的,可以存储
null
值
Collection接口中有两个常用的子接口:List(列表),Set(集)。
List:可存放重复元素,元素存取是有序的。
ArrayList:底层为数组结构。查询速度快。增删稍慢。线程不同步。
LinkedList:底层为链表结构。增删速度快,查询稍慢。线程不同步
Vector:底层为数组结构。线程同步。被ArrayList替代了。因为效率低。
Set:不可以存放重复元素,元素存取是无序的
HashSet:数据结构是哈希表。线程不同步。hashCode和equals
TreeSet:可以对Set集合中的元素进行排序,数据结构为二叉树
实现Comparable接口,覆盖compareTo(Object obj)方法
实现Comparator接口,覆盖compare(Object o1,Object o2)方法
Map:存储键值对,键不可以重复,值可以重复。
取出map集合元素的两种方式方法keySet()和entrySet()
Hashtable: 数据结构为哈希表,不可以存入null键null值,线程同步。
HashMap:数据结构为哈希表,允许使用 null 值和 null 键,线程不同步。
TreeMap:数据结构为二叉树。线程不同步。
用于给map集合中的键进行排序(排序方法和TreeSet一样,实现comparable和comparator两个接口即可)。
注:其实Set底层就是使用了Map集合
entryset遍历hashmap
Map
map
=
new
HashMap();
map .put( "姓名" , "alexander" );
map .put( "年龄" , "14" );
map .put( "性别" , "男" );
System. out .println( map );
Iterator it = map .entrySet().iterator();
while ( it .hasNext()){
Map.Entry entry = (Entry) it .next();
Object key = entry .getKey();
Object value = entry .getValue();
map .put( "姓名" , "alexander" );
map .put( "年龄" , "14" );
map .put( "性别" , "男" );
System. out .println( map );
Iterator it = map .entrySet().iterator();
while ( it .hasNext()){
Map.Entry entry = (Entry) it .next();
Object key = entry .getKey();
Object value = entry .getValue();
System.out.println(key+":::"+value);
因为hashmap无序,用迭代器迭代遍历
keyset entryset keyset只遍历key键集 entryset通过map.entry(映射关系)遍历键值对。
Collection 接口的接口 对象的集合
├ List 子接口 按进入先后有序保存 可重复
│├ LinkedList 接口实现类 链表 插入删除 没有同步 线程不安全
│├ ArrayList 接口实现类 数组 随机访问 没有同步 线程不安全
│└ Vector 接口实现类 数组 同步 线程安全
│ └ Stack
└ Set 子接口 仅接收一次,并做内部排序
├ HashSet
│
└
LinkedHashSet
└
TreeSet
public static void method_2(Map<Integer,String> map){
//第一个返回null,存进去的都是返回前一个
map.put(8,"zhaoliu");//返回Null
map.put(2,"zhaoliu");//返回zhaoliu
map.put(7,"xiaoqiang");//返回zhaoliu
map.put(6,"wangcai");//返回wangcai
System.out.println("*********");
System.out.println(map.put(5,"wangcai5"));
System.out.println(map.put(5,"wangcai5"));
System.out.println(map);
System.out.println("*********");
//Collection!!!1
Collection<String> values = map.values();
Iterator<String> it2 = values.iterator();
while(it2.hasNext()){
//遍历拿到的是Vaule!!!
System.out.println("1111111111111:" + it2.next());
}
/*
* 通过Map转成set就可以迭代。
* 找到了另一个方法。entrySet。
* 该方法将键和值的映射关系作为对象存储到了Set集合中,而这个映射关系的类型就是Map.Entry类型(结婚证)
*
* 允许重复
*/
//Set<Map.Entry<Integer, String>>!!!2
Set<Map.Entry<Integer, String>> entrySet = map.entrySet();
Iterator<Map.Entry<Integer, String>> it = entrySet.iterator();
while(it.hasNext()){
//遍历拿到的是关系!!!
Map.Entry<Integer, String> me = it.next();
Integer key = me.getKey();
String value = me.getValue();
System.out.println(key+"::2222222222::"+value);
}
//取出map中的所有元素。
//原理,通过keySet方法获取map中所有的键所在的Set集合,在通过Set的迭代器获取到每一个键,
//在对每一个键通过map集合的get方法获取其对应的值即可。
//Set<Integer> keySet!!!3
Set<Integer> keySet = map.keySet();
Iterator<Integer> it21 = keySet.iterator();
while(it21.hasNext()){
//遍历拿到的是Key!!!
Integer key = it21.next();
String value = map.get(key);
System.out.println(key+":3333333333:"+value);
}
}
public static void method(Map<Integer,String> map){//学号和姓名
// 添加元素。
System.out.println(map.put(8, "wangcai"));//null
System.out.println(map.put(8, "xiaoqiang"));//wangcai 存相同键,值会覆盖。
map.put(2,"zhangsan");
map.put(7,"zhaoliu");
//删除。
// System.out.println("remove:"+map.remove(2));
//判断。
// System.out.println("containskey:"+map.containsKey(7));
//获取。
System.out.println("get:"+map.get(6));
System.out.println(map);
Outer.Inner.show();
}
}