您的位置:首页 > 编程语言 > Java开发

——JAVASE-集合(下)

2015-07-20 16:19 453 查看
一、Map集合

1、概念

Map集合是将键映射到值的对象。Map集合是以键值对的形式存在的,键-值对称为映射项。一个映射不能包含重复的键;每个键最多只能映射到一个值。

2、Map集合的特点

Map集合一次存储两个对象, 一个键对象, 一个值对象

键对象在集合中是唯一的, 可以通过键来查找值

3、Map常用方法

put(K key, V value) 存储一条记录, 一个键和一个值

get(Object key) 根据键对象获取值

containsKey(Object key) 判断是否包含指定的键

boolean containsValue(Object value) 判断是否包含指定的值

remove(Object key) 根据键删除一条记录

isEmpty() 判断此集合是否为空

size() Map集合中的记录数

values() 得到所有的值对象组成的一个Collection集合

keySet() 返回此映射中包含的键的 Set 视图。

entrySet() 返回此映射中包含的映射关系的 Set 视图

4、迭代Map集合

(1)、keySet()方法

先调用keySet()方法从Map集合中获取所有Key组成的一个Set集合,迭代Set集合可以得到每一个Key,然后再调用get()方法通过Key获取每一个Value

(2)、entrySet()

先调用entrySet()方法从Map集合中获取所有Entry(键值对)组成的一个Set集合

迭代Set集合可以得到每一个Entry,然后再调用getKey()和getValue()方法得到每一个Key和每一个Value

代码示例:
class  MapTest
{
public static void main(String[] args)
{
HashMap<Student,String> hm = new HashMap<Student,String>();
hm.put(new Student("lisi1",21),"beijing");
hm.put(new Student("lisi1",21),"tianjin");
hm.put(new Student("lisi2",22),"shanghai");
hm.put(new Student("lisi3",23),"nanjing");
hm.put(new Student("lisi4",24),"wuhan");
//第一种取出方式 keySet
Set<Student> keySet = hm.keySet;
Iterator<Student> it = keySet.iterator();
while(it.hasNext())
{
Student stu = it.next();
String addr = hm.get(stu);
System.out.println(stu+".."+addr);
}
//第二种取出方式 entrySet
Set<Map.Entry<Student,String>> entrySet = hm.entrySet();
Iterator<Map.Entry<Student,String>> iter = entrySet.iterator();
while(iter.hasNext())
{
Map.Entry<Student,String> me = iter.next();
Student stu = me.getKey();
String addr = me.getValue();
System.out.println(stu+"........."+addr);
}
}
}


5、HashMap

在使用HashMap存储键值对的时候, 先调用Key对象的hashCode()方法计算一个哈希值, 在Map中查找是否有相同哈希值的Key对象,如果没有哈希值相同的Key对象, 这个键值对直接存入;如果有哈希值相同的Key对象, 那么就进行equals比较,比较结果为false就存入, true则覆盖原Value

6、LinkedHashMap

HashMap的子类, 算法相同, 但保留了存储的顺序

7、TreeMap

在使用TreeMap存储键值对的时候, 会使用Key对象和集合中已存储的Key对象进行比较, 确定二叉树上的位置

比较的方式和TreeSet指定的方式相同, Comparable和Comparator

8、Hashtable

类似HashMap, 线程安全, 效率略低, 不允许null键和null值

二、集合和数组的转换

1、数组变成List集合

使用的是java.util包中的类 Arrays中的方法:

public static List asList(T… a)

注意1:将数组变成集合,不能使用集合的增删方法,因为数组的长度是固定的,如果增删的话会发生UnsupportedOperationException,contains()、get()、indexOf()、subList()方法可以使用。

注意2:如果数组中的元素都是对象。那么变成集合时,数组中的元素就直接转成集合中的元素。如果数组中的元素都是基本数据类型,那么会将该数组作为集合中的元素存在。

import java.util.*;
class  ArraysDemo
{
public static void main(String[] args)
{

String[] arr = {"abc","cc","kkkk"};
List<String> list = Arrays.asList(arr);
sop(list);
}
}


2、数组变成集合好处

好处:可以使用集合的思想和方法来操作数组中的元素

3、集合变成数组

(1)、使用的是Collection接口中的toArray()方法

(2)、Collections和Collection有什么区别?

Collection是集合框架中的一个顶层接口,它里面定义了单列集合的共性方法。

它有两个常用的子接口,

List:对元素都有定义索引。有序的。可以重复元素。

Set:不可以重复元素。无序。

Collections是集合框架中的一个工具类。该类中的方法都是静态的

提供的方法中有可以对list集合进行排序,二分查找等方法。

通常常用的集合都是线程不安全的。因为要提高效率。

如果多线程操作这些集合时,可以通过该工具类中的同步方法,将线程不安全 的集合,转换成安全的。

import java.util.*;
class  CollectionToArray
{
public static void main(String[] args)
{
ArrayList<String> al = new ArrayList<String>();
al.add("abc1");
al.add("abc2");
al.add("abc3");
/*
1,指定类型的数组到底要定义多长呢?
当指定类型的数组长度小于了集合的size,那么该方法内部会创建一个新的数组。长度为集合的size。
4000

当指定类型的数组长度大于了集合的size,就不会新创建了数组。而是使用传递进来的数组。
所以创建一个刚刚好的数组最优。
String[] arr = al.toArray(new String[al.size()]);
ystem.out.println(Arrays.toString(arr));
}
}


4、集合变数组的原因

为了限定对元素的操作。不需要进行增删了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: