------- android培训、java培训、期待与您交流! ----------
Map
Map集合:该集合存储键值对,一对一对的往里存且保证键的唯一性(其实Set中保证元素唯一就是底层使用了Map集合)
Map的三个子类:
HashTable:底层是哈希表数据结构,不可以存入null键null值,线程是同步的。JDK1.0版本出现
HashMap:底层是哈希表数据结构,允许null键null值,线程不同步的。JDK1.2版本后出现
TreeMap:底层是二叉树数据结构,线程不同步,可以用于Map集合中的用键排序。
map.put(key,value):当存入相同key的时候,后来的value替换原来的value并且返回原value,原来没有value的话则返回null
重点:Map集合的两种取出方式
1,keySet:将map中所有的键存入到set集合中,在通过迭代取出key,再根据get(key)获取每一个键对应的值
2,entrySet:将map集合中的映射关系取出存入到set集合中
Set<Map.entry<key,value>> entrySet=map.entrySet();
Iterator<Map.entry<key,value>> it=entrySet.iterator();
注意:(这个注意是我在黑马论坛中得来的)TreeMap中存放值的对象类,实现自然比较顺序必须有意义(不能单纯返回0,1,-1,)要不然,这个map用entrySet方式迭代会报空指针异常,下面是其中的链接:
报空指针异常
小知识点:
interface Map{
public static interface Entry{ //只有接口在成员变量的位置上才能加静态修饰符,能加静态修饰符static的接口一定是内部接口
public abstract Object getKey();
public abstract Object getValue();
}
}
实现接口方法一:
class HashMap implements Map.Entry{
...//实现上面两个抽象方法
}
实现接口方法二:
class HashMap implements Map{
class Hah implements Map.Entry{
...//实现上面两个抽象方法
}
}
写这两个小知识点是为了回顾接口方面的知识,个人感觉对理解API和Java代码是必不可少的知识
Map的扩展:
即三个以上的映射关系:毕老师的视频上举了例子:在学校中有两个班,每个班有60名学生,每个学生有自己对应的学号
即:Map<String,HashMap>
Collections
Collections:是对集合进行操作的类,即集合工具类
主要的方法有:
sort(List<T> list):按照list中存放的元素T的自然顺序升序排序
public static <T extends Comparable<? super T>> void sort(List<T> list)
这句代码的理解:
T extends Comparable:T必须实现Comparable接口,这样T才有可比性
? super T:此比较方法比较的时候可以接收T的父类
sort(List<T> list, Comparator<? super T> com):按照指定的比较器排序
binarySearch:二分查找
fill(list,"pp"):将list中所有的元素都换成“pp”
replaceAll(list,目标,值);//将值替换掉目标
reverseOrder("比较器对象"):返回的是反转后的“比较器”
线程不安全的解决方案:synchronized List(List<T> list)
swap(List<T> list,int i,int j)替换角标为i和j的位置
应用(扑克牌洗牌):shuffle(List<T> list) //随机置换
Arrays
Arrays:操作数组的工具类。
其中,包括的功能有:
①二分查找
②数组的复制
③数组的比较(内容比较和深层比较)
④数组的排序(局部排序)
⑤数组变成字符串
⑥数组变为List集合
其中①至⑤查阅API即可,⑥重点掌握
static <T> List<T> asList(T... a):将数组变为List集合
将数组变为集合的好处:可以使用集合的思想和方法来操作数组中的元素
注意:将数组变为集合,不可以使用集合的增删方法,因为数组的长度是固定的,要不然会抛UnsupportedOperationException(不支持操作异常)
int[] nums={4,5,6};
List<int[]> list=Arrays.asList(nums);//必须加泛型
如果数组中的元素都是对象,那么变成集合是,数组中的元素就直接转成集合中的元素。
如果数组中的元素都是基本数据类型,那么会将该数组作为集合中元素的存在。
Collection接口中定义的Object[] toArray()和<T> T[] toArray(T[] a)可以将集合变为数组
例:
//i=al.size();
String[] arr=al.toArray(new String[i]);//其中al为一个Collection子类对象,i为定义String数组元素的个数,如果al集合的元素个数少于i,则得到的数组多出的部分由默认的初始化补全,此处为null
解说:
1.当指定类型数组长度(上述的new String[i]中的i)小于集合size,那么该方法内部会创建一个新的数组,长度为集合的size;当指定类型数组长度(上述的new String[i]中的i)大于集合size,就不会新建数组,而是用传递进来的数组,所以,创建一个刚好长度数组最优
2.为什么要将集合变为数组:为了限定对元素的操作,不需要增删!
JDK1.5版本后的新特性
Collection在1.5版本后实现了Iterable<T>接口。
实现Iterable<T>接口允许对象成为“foreach”语句的目标。
高级for循环:for(数据类型 变量名:将赋予变量的集合或者数组)
局限:只能对集合中的元素进行取出,并不能做出修改(原因,没有角标)
迭代器除了遍历,还可以进行remove集合中元素的动作
如果是ListIterator,还可以在遍历过程中对集合进行增删改查动作
传统的for循环:功能强大。
高级for循环:必须有被遍历的目标(集合或者数组)
public static void show(int... arr){}
可变参数:隐式地将...封装成了数组arr,传入参数无论多少都行,不传即数组长度为0。
使用可变参数时需注意:可变参数一定要定义在参数列表的最后面。
staticImport:静态导入。
当类名重名时,需要指定具体的包;
当方法重名时,需要制定具体所属的类或对象。
体会:
普通导入import:导入的是一个类;
静态导入import static:导入的是类中的静态成员。