----------------------- android培训、java培训、java学习型技术博客、期待与您交流! ----------------------
Map集合
4.1 Map集合:
该集合存储键值对。一对一对往里存。而且要保证键的唯一性。(值可以有相同的)
Map集合存储和Collection有着很大不同:
Collection一次存一个元素;Map一次存一对元素。
Collection是单列集合;Map是双列集合。
Map中的存储的一对元素:一个是键,一个是值,键与值之间有对应(映射)关系。
1,添加。
put(Kkey, V value)
当存储的键相同时,新的值会替换老的值,并将老值返回。如果键没有重复,返回null
putAll(Map<?extends K,? extends V> m)
2,删除。
clear()
remove(Objectkey)
3,判断。
containsValue(Objectvalue)
containsKey(Objectkey)
isEmpty()
4,获取。
get(Objectkey)
size()
values()
entrySet()
keySet()
Map
|--Hashtable:底层是哈希表数据结构,不可以存入null键null值。该集合是线程同步的。jdk1.0.效率低。
|--HashMap:底层是哈希表数据结构,允许使用 null 值和 null 键,该集合是不同步的。将hashtable替代,jdk1.2.效率高。
|--TreeMap:底层是红黑树数据结构。线程不同步。可以用于给map集合中的键进行排序。
和Set很像。
其实大家,Set底层就是使用了Map集合。
4.2 Map集合的两种取出方式:
1,Set<k> keySet:
将map中所有的键存入到Set集合。因为set具备迭代器。
所有可以迭代方式取出所有的键,再根据get方法。获取每一个键对应的值。
Map集合的取出原理:将map集合转成set集合。在通过迭代器取出。
2,Set<Map.Entry<k,v>> entrySet:
Map集合的第二种取出方式,利用键值对的映射关系,进行取出
好比:通过结婚证来获取,java中,键值映射关系对象,描述接口是Map.Entry
Map.Entry在Map接口中,有一个内部接口 接口名叫做 static Entry
Map接口中有一个方法是 entrySet()将Map集合中的键值映射关系保存到Set集合:Set<Map.Entry<K,V>> entrySet()
练习:Map集合的两种取出方式:
import java.util.*;
class MapDemo2
{
publicstatic void main(String[] args)
{
Map<String,String>map = new HashMap<String,String>();
map.put("02","zhangsan2");
map.put("03","zhangsan3");
map.put("01","zhangsan1");
map.put("04","zhangsan4");
//第二种方法
//将Map集合中的映射关系取出。存入到Set集合中。
Set<Map.Entry<String,String>>entrySet = map.entrySet();
//有了Set集合,建立迭代器
Iterator<Map.Entry<String,String>>it = entrySet.iterator();
while(it.hasNext())
{
Map.Entry<String,String>me = it.next();
//获取到了关系对象后,就可以获取键和值了
//在Map.Entry接口用有两个方法 getKey() getValue()
Stringkey = me.getKey();
Stringvalue = me.getValue();
System.out.println(key+":"+value);
}
/*
//第一种方法
//先获取map集合的所有键的Set集合,keySet();
Set<String> keySet = map.keySet();
//有了Set集合。就可以获取其迭代器。
Iterator<String> it = keySet.iterator();
while(it.hasNext())
{
String key = it.next();
//有了键可以通过map集合的get方法获取其对应的值。
String value = map.get(key);
System.out.println("key:"+key+",value:"+value);
}
*/
}
}
集合的嵌套形式
一个大的集合中,嵌套的多个小集合,后期JAVA Web比较常见的。要会存,会取 keySet()
/*
* 用集合的形式,描述一下的数据结构,集合的嵌套形式
*
* 传智播客 -- 集合
* 基础班 -- 集合
* 001 张三
* 002 李四
* 就业班 -- 集合
* 001 王五
* 002 赵六
*/
import java.util.*;
public class MapDemo1 {
public static void main(String[] args) {
// 传智播客 -- 集合
HashMap<String, HashMap<String, String>> czbk = new HashMap<>();
// System.out.println(czbk);
// 基础班 -- 集合
HashMap<String, String> jichu = new HashMap();
// 就业班 -- 集合
HashMap<String, String> jiuye = new HashMap<String, String>();
// 将两个班级,存储到传智播客的大集合中
czbk.put("基础班", jichu);
czbk.put("就业班", jiuye);
// 向就业班和基础班这两个集合中,存储学生的信息
jichu.put("001", "张三");
jichu.put("002", "李四");
jiuye.put("001", "王五");
jiuye.put("002", "赵六");
jiuye.put("012", "赵六");
jiuye.put("003", "赵六");
jiuye.put("022", "赵六");
// System.out.println(czbk);
// 迭代传智播客的大集合
Set<String> set = czbk.keySet();
Iterator<String> it = set.iterator();
while (it.hasNext()) {
// System.out.println(it.next());获取到的是班级的名字,基础,就业
String className = it.next();
System.out.println(className);
HashMap<String, String> classbanji = czbk.get(className);
// 获取的,班级的小集合,对这个集合进行取出
Set<String> classbanjiSet = classbanji.keySet();
Iterator<String> classbanjiIt = classbanjiSet.iterator();
while (classbanjiIt.hasNext()) {
String key = classbanjiIt.next();
String value = classbanji.get(key);
System.out.println(key + "..." + value);
}
}
}
}
6.使用集合的技巧:
看到Array就是数组结构,有角标,查询速度很快。
看到link就是链表结构:增删速度快,而且有特有方法。addFirst; addLast; removeFirst(); removeLast(); getFirst();getLast();
看到hash就是哈希表,就要想要哈希值,就要想到唯一性,就要想到存入到该结构的中的元素必须覆盖hashCode,equals方法。
看到tree就是二叉树,就要想到排序,就想要用到比较。
比较的两种方式:
一个是Comparable:覆盖compareTo方法;
一个是Comparator:覆盖compare方法。
LinkedHashSet,LinkedHashMap:这两个集合可以保证哈希表有存入顺序和取出顺序一致,保证哈希表有序。
集合什么时候用?
当存储的是一个元素时,就用Collection。当存储对象之间存在着映射关系时,就使用Map集合。
保证唯一,就用Set。不保证唯一,就用List。
Collections工具类,操作集合的静态方法
Collections:集合框架的工具类。里面定义的都是静态方法。
Collections和Collection有什么区别?
Collection是集合框架中的一个顶层接口,它里面定义了单列集合的共性方法。
它有两个常用的子接口
List:对元素都有定义索引。有序的。可以重复元素。
Set:不可以重复元素。无序。
Collections是集合框架中的一个工具类。该类中的方法都是静态的提供一系列静态方法,实现对集合的查找、排序、替换、线程安全化(将非同步的集合转换成同步的)等操作。
Collections.sort(list) list集合进行元素的自然顺序排序。
Collections.sort(list,new MyComparator()) 按指定的比较器方法排序。
Collections.reverseOrder() 逆向反转排序。
Collections.reverseOrder(new MyComparator())返回一个比较器,它强行逆转指定比较器的顺序。
reverseOrder()逆转比较器实现Comparator,逆转对象的自然顺序,实现Comparable
Collections.max(Collection c) 返回list中字典顺序最大的元素。
static void swap(List<?> list, int i, int j) 在指定列表的指定位置处交换元素。
Collections.shuffle(list) 随机对list中的元素进行位置的置换。洗牌
Collections.fill()将集合中的全部的元素填充
int index = Collections.binarySearch(list,"zz") 二分查找,返回角标。
将非同步集合转成同步集合的方法:Collections中的 XXX synchronizedXXX(XXX);
List synchronizedList(list);
Map synchronizedMap(map);
原理:定义一个类,将集合所有的方法加同一把锁后返回。
8.Arrays工具类,操作数组的静态方法
|-- binarySearch()有序数组的折半查找法
|-- sort()对数组进行升序排序
|-- static toString()将数组变成字符串
集合与数组的互转
用于操作数组对象的工具类,里面都是静态方法。
asList方法:将数组转换成list集合。
String[] arr = {"abc","kk","qq"};
List<String> list = Arrays.asList(arr);//将arr数组转成list集合。
将数组转换成集合,有什么好处呢?用aslist方法,将数组变成集合;
可以通过list集合中的方法来操作数组中的元素:isEmpty()、contains、indexOf、set;
注意(局限性):数组是固定长度,不可以使用集合对象增加或者删除等,会改变数组长度的功能方法。比如add、remove、clear。(会报不支持操作异常UnsupportedOperationException);
如果数组中存储的引用数据类型,直接作为集合的元素可以直接用集合方法操作。
如果数组中存储的是基本数据类型,asList会将数组实体作为集合元素存在。
集合变数组:用的是Collection接口中的方法:toArray();
如果给toArray传递的指定类型的数据长度小于了集合的size,那么toArray方法,会自定再创建一个该类型的数据,长度为集合的size。
如果传递的指定的类型的数组的长度大于了集合的size,那么toArray方法,就不会创建新数组,直接使用该数组即可,并将集合中的元素存储到数组中,其他为存储元素的位置默认值null。
所以,在传递指定类型数组时,最好的方式就是指定的长度和size相等的数组。
将集合变成数组后有什么好处?限定了对集合中的元素进行增删操作,只要获取这些元素即可。
集合框架总结
1集合跟数组有什么区别
|-- 集合的长度是可变的,可以添加,删除,而数组的长度是不可变的
|-- 集合里面只能存储对象(或者说引用数据类型),而数组存储的是基本数据类型,也可以存储对象
2集合中常用的方法
|--add()添加
|--remove()删除
|--size()获取集合长度
|--contains()判断是否包含某个对象或集合
|--isEmpty()判断集合是否为空
|--toArray()将集合转换为数组
|--iterator()迭代集合中的每个对象既取出集合中的对象
3集合体系
|--Collection下有Set和List集合,它们都是接口,Collection 上面还有一个超级父接口是Iterable,
|--List集合下有ArrayList和LinkedList和Vector,Set下有HashSet和TreeSet,
|--单独有一个Map体系,其下有HashMap和TreeMap和Hashtable(出现在JDK1.0版本),Hashtable下有一个子类是Properties
4集合体系各自的特点
|--List集合特点
1.有序的集合,怎么存的,怎么取出;2.有下标;3.线程不同步,不安全;其下有一个ListIterator迭代器
在迭代的过程中是不允许操作集合的,因为迭代器Iterator it = coll.iterator();是在迭代之前就建立好的,它已知到了集合的长度,所以在迭代过程中是不能用集合的方法去操作集合的,但在List集合下有一个特有的迭代器ListIterator,它可以用it.hasNext()和it.next()来正向迭代集合,也可以用it.hasPrevious和it.previous(){拿到对象}来逆向迭代集合
|--List集合下特有的方法
1.add(index,object)在指定角标处插入对象,原来位置处的对象自动后移
2.remove(index)移除指定角标处的对象
3.get(index)取出指定角标处的对象
|--ArrayList集合的特点
|--有序的集合,怎么存的,怎么取出
|--存在这个集合中的对象是有下标的,可以用下标来获取,可以重复
|--底层是可变数组结构每次增长50%
|--添加删除对象原理:再次创建一个新的数组,容量是比前一个扩容50%,再放进去,因此增慢,查询快
|--LinkedList集合的特点
|--有序的集合,怎么存的,怎么取出
|--也是有下标的,存储的对象可以重复
|--底层是链表结构存储进的上一个对象后面有一个指什指向下一个对象的首地址
|--相比ArrayList而言,LinkedList增删快,查询慢
|--其下面有一些独特的操作列表头和列表尾的方法
|--addFirst()将指定对象添加到集合的开头
|--addLast()将指定对象添加到集合的末尾
|--getFirst()获取集合的第一个对象
|--getLast()获取集合的最后一个对象
|--removeFirst()移除并返回此集合的第一个对象
|--removeLast()移除并返回此集合的最后一个对象
****************可以用contains()配合equals()方法去除集合中的重复对象
Vector集合和Hashtable与其子类Properties是线程安全的,也是出现在JDK1.0版本,
vector底层也是可变数组结构,每次扩容100%
|--Set集合的特点
|--无序的,无下标,不能重复,默认调用hashCode()和equals()方法去除重复的对象
|--HashSet集合特点
|--底层是哈希表,桶状结构,存储到HashSet中的非其本数据类型的对象默认要重写hashCode()方法和equals()方法来去除重复的对象
|--TreeSet集合的特点
|--底层是二叉树,具有自然排序功能
|--实现排序有两种方式
|--第1种:对象所在的类实现java.lang包下的Comparable接口,并复写接口上的compareTo()方法
|--第2种 在建立TreeSet集合的时候传递比较器对象(Comparator),并创建比较器类
泛型:用来限制传入集合中的数据类型,可以自定义泛型类,创建对象时传入什么样的数据类型,就是什么样的类型
静态方法必须写在static之后,返回类型void之前
5.Map集合
|--Map<k,v>,是一个双列集合,一次存储一个键值对
|--不允许重复的键,但可以有重复的值
|--put(k,v);将键值对存储到Map集合中
|--get(k),通过键来获取对应的值
|--size()返回集合中存储的键值对的个数
|--keySet()获取集合中的键,将其存储到一个Set集合中
|--entrySet()获取集合中的键值关系对Map.Entry<>将其存储到一个Set集合中
|--values()将集合中的值存储到Collection集合
HashMap
底层是哈希表,键值可以是null
需要重写hashCode()和equals()去除重复的对象
TreeMap
底层是红黑树,会对存储进来的键进行默认的排序,去掉重复键(对象)与TreeSet相同
----------------------- android培训、java培训、java学习型技术博客、期待与您交流! ----------------------