一、重点知识
LinkedHashMap的两种遍历方式 一entryset+迭代器 entryset+ for—each
https://blog.csdn.net/qq_40351478/article/details/87949852
HashMap没有增加新功能,只是实现了Map的定义的功能
Hashtable不支持存储空值
HashMap支持null存储,key和value都可以是空,打印时候为null,他把null看为了一个对象去进行存储
hashmap的key和value全为null的情况 打印结果为 {null=null}
properties集合中存储的都是string类的信息,它的泛型规定了<string,string>
路径分隔符\ \ 两个\是因为要取消转义字符
静态方法想使用泛型要单独声明泛型,泛型位于static后返回值之前
静态方法的泛型不用在使用它的时侯指定,它会根据你传入的参数自动判断
泛型中的继承并不能延申到类的继承
举例
list<object> 不是list<string>的父类
二、重点问题
涉及到collections的排序方法问题
没有下标的集合不能排序,所以collections只对list集合有用
自定义类,想用工具类的sort进行排序就要实现比较器举例Arrays.sort(goods,com);Collections.sort(coll,com);new TreeSet(com);
总结:想要排序,就要使自定义类可以比较,可以比较了,别人才能给你排序
三、课堂知识
3.1、Map.Entry
Entry可以认为是一个键值对对象。理解为:将键值对看成一个整体的对象。
包含了Key,Value。
Map中操作的是一对对象。key和value。存在一个映射关系。对应的。
Map.entryst --->得到了Entry对象
getKey()-->Key
getValue()-->Value
对于map集合,无法直接迭代获取里面的元素。
3.2、获取Map中的每一个元素的方法(Map的遍历)
* 1.map中的所有的key,存储到一个Set中
* A:keySet()--->Set集合
* B:iterator()-->迭代获取每一个key
* C:根据key获取map中对应的value
*
* 2.map中的键值对组合entry,存储到一个Set中
* A:entrySet()--->Set集合
* B:iterator()-->迭代获取每一个entry
* C:根据entry对象,获取里面的key和value
* for-each也可以用于Map集合的遍历
* 注意点:
* iterator()--->Collection接口
* List,Set----->实现类:ArrayList,linkedList,HashSet,TreeSet
* map是没有迭代器的
3.3、LinkedHashMap
记录了存储的顺序。去重的原理和HashMap相同。他是HashMap的子类,在HashMap的基础上添加了一对指针,所以他的遍历效率高于HashMap。
3.4、HashTable
哈希表:HashTable旧的类。
笔试题:问HashMap和HashTable的区别?
HashMap和HashTable都是Map的实现类
父类不一样:继承结构不同。
HashTable的父类是:Dictionary
HashMap的父类是:AbstractMap
HashMap是HashTable的替代品。HashTable是旧的类,线程安全,效率低。
对于null的处理
HashMap对null,看成了普通的对象。可以key为null,也可以value为null
HashTable对null没有进行处理。抛出异常:NullPointerException
3.5、Properties
1、Properties类从结构来看,是HashTable的子类,也是集合中的一员。也是用于存储数据的,都是一些配置信息。泛型<key,value>,String类型。
其他的集合存储对象的,Properties存储属性信息。
2、将属性集合Properties中的数据——>file文件中
file文件中——>属性集合Properties中
3.6、泛型限定
泛型:JDK1.5之后出现的。
Listlist=newArrayList();
list.add(Object);//存储Object类型
JDK1.5之前存入集合中的数据,失去自己原有的数据类型,-->Object类型。当从容器中获取数据,向下转型。
引入了泛型:
List<E>
element,元素
Map<K,V>
key,value,键值对
T:type,类型
1、泛型应用在集合上。
声明集合的时候,使用<>来限制集合能够操作的数据类型,从而保护类型安全。
List<String>list=newArrayList();
list.add(String);//存储String类型
2、泛型应用在类上。
声明一个类的时候使用<>,限制数据类型,泛型作用在类上。普通方法和普通的属性。属于对象的,可以直接使用该泛型。但是不能给静态用。因为作用在类上的泛型,当对象被创建的时候确定的。
class 类名<T>{
//T这个类型,当创建对象的时候决定好。
}
泛型擦除:如果创建对象的时候,没有指明泛型,那么该类型T——>Object类型。
3、泛型作用在静态方法上
方法的声明上使用泛型的声明<>。
类的静态方法如果使用泛型,需要单独进行泛型的声明,声明泛型要写在static关键字之后,返回值类型之前。
//3.<M>,静态方法上自己独立声明泛型,不能使用类的。
publicstatic<M>Mtest(Mm){
System.out.println(m);
returnm;
}
4、泛型的限定:集合中
?:代表了任意集合中可以存储任意类型,区分于Object
List<?>,List<Object>
List<?>指代可以存储任意泛型类型的集合
List<Object>集合中的对象,就是Object类型,其他类型的对象会自动转为Object类型。
?extends T:限定了上限
接收集合的泛型:中可以存储T,以及T的子类类型。
?super T:限定了下限
接收集合的泛型:可以是T,以及T的父类。
5、不允许使用泛型的地方
静态属性:private static T member;//错误的
创建T的实例:T t = new T();//错误
自定义异常,不能使用泛型
class MyException<T> extends Exception
3.7、Collections工具类
Collection和Collections的区别?
Collection:集合中最大的父接口,List和Set的父接口,规定了集合最基本的操作。
Collections:集合的工具类,包含了集合的常用方法。
Arrays:数组的工具类,包含了数组的常用方法。
1、返回线程安全的集合
static<T>List<T>synchronizedList(List<T>list)
static<T>Set<T>synchronizedSet(Set<T>s)
static<T>Collection<T>synchronizedCollection(Collection<T>c)
。。。
2、可以向Collection容器中,同时添加多个元素
Collections.addAll(容器,要添加的元素);
3、List排序
Collections.sort(list);
Collections.sort(list,Comparator)
网友评论