1.Map接口特点
- Map与Collection并列存在。用于保存具有映射关系的数据: Key-Value(双列集合)
- Map中的key和value可以是任何引用类型的数据
- Map中的key不允许重复,原因和HashSet一样,当key一样,新的值会替换原先的
- Map中的value可以重复
- Map的key可以为null(只能一个),value也可以为null(可以多个)
- key和value之间是单向一对一关系,通过指定的key总能找到对应的value
- put: 添加
- remove: 根据健删除映射关系
- get: 根据键获取值
- size: 获取元素个数
- isEmpty: 判断个数是否为0
- clear: 清除
containsKey: 查找键是否存在
import java.util.*;public class Hello {public static void main(String[] args) throws Exception {HashMap hashMap = new HashMap();hashMap.put("user","123");hashMap.put("password","123");hashMap.put("password","123");System.out.println(hashMap);//{password=123, user=123}}}
2.HashMap的遍历
import java.util.*;import java.util.function.Consumer;public class Hello {public static void main(String[] args) throws Exception {HashMap hashMap = new HashMap();hashMap.put("user","123");hashMap.put("password","123");hashMap.put("password","1234");Set set = hashMap.keySet();System.out.println("========one=========");for (Object o : set) {System.out.println(o+"-"+hashMap.get(o));}System.out.println("========second=========");Iterator iterator = set.iterator();while (iterator.hasNext()) {Object next = iterator.next();System.out.println(next+"-"+hashMap.get(next));}System.out.println("========third=========");Set set1 = hashMap.keySet();set1.forEach(new Consumer() {@Overridepublic void accept(Object o) {System.out.println( o+"-"+hashMap.get(o));}});System.out.println("========four=========");Set set2 = hashMap.entrySet();for (Object o : set2) {Map.Entry o1 = (Map.Entry) o;//向上转型System.out.println( o1.getKey()+"-"+o1.getValue());}System.out.println("======遍历所有val-one===========");Collection values = hashMap.values();for (Object o1 : values) {System.out.println(o1);} System.out.println("======遍历所有val-second===========");Iterator iterator1 = values.iterator();while (iterator1.hasNext()) {Object next = iterator1.next();System.out.println(next);} System.out.println("======遍历所有val-third===========");values.forEach(new Consumer() {@Overridepublic void accept(Object o) {System.out.println(o);}});}}
3.Hashtable
存放的元素是键值对: K-V
- Hashtable的键和值都不能为null,否则会抛出NullPointerException
- Hashtable使用方法基本上和HashMap一样
Hashtable线程安全,HashMap线程不安全
import java.util.*;public class Hello {public static void main(String[] args) throws Exception {Hashtable hashtable = new Hashtable();hashtable.put("1","1");hashtable.put("2","2");System.out.println(hashtable);//{2=2, 1=1}}}
4.Properties
Properties类继承自Hashtable类
- 使用一种键值对的形式来保存数据,使用特点和Hashtable类似
- Properties还可用于从xxx.properties文件中,加载数据到Properties类对象,并进行读取和修改。xxx.properties通常作为配置文件
Properties的增删改查
import java.util.*;public class Hello {public static void main(String[] args) throws Exception {Properties Properties = new Properties();Properties.put("1","1");Properties.put("2","2");System.out.println(Properties);}}
5.TreeSet
TreeSet的基本使用,TreeSet底层走的是TreeMap
- 在构造器中,可以传入一个比较器,指定排序规则
如果比较器返回的结果为0,则数据不会加入到TreeSet
import java.util.*;public class Hello {public static void main(String[] args) throws Exception {TreeSet TreeSet = new TreeSet(new Comparator() {@Overridepublic int compare(Object o1, Object o2) {return ((String)o1).length()-((String)o2).length();}});TreeSet.add("a");TreeSet.add("aa");TreeSet.add("aaa");TreeSet.add("aaaa");TreeSet.add("aaaaa");System.out.println(TreeSet);//[a, aa, aaa, aaaa, aaaaa]//不能添加null}}
6.TreeMap
TreeMap的基本使用
- 在构造器中,可以传入一个比较器,指定排序规则
如果比较器返回的结果为0,则key不会加入到TreeMap,值会替换
import java.util.*;public class Hello {public static void main(String[] args) throws Exception {TreeMap TreeMap = new TreeMap(new Comparator() {@Overridepublic int compare(Object o1, Object o2) {return 0;}//((String)o1).length()-((String)o2).length()});//TreeMap.put("a1","1a");TreeMap.put("aa","aa");TreeMap.put("aaa","aaa");TreeMap.put("aaaa","aaaa");TreeMap.put("aaaaa","aaaaa");System.out.println(TreeMap);//{a1=aaaaa}}}
7.Collections工具类
Collections工具类的作用
是一个操作Set、List和Map等集合的工具类
提供了一系列静态的方法对集合元素进行排序、查询和修改等操作- 排序相关操作
a) reverse(List): 反转List中元素的顺序
b) shuffle(List): 对List集合元素进行随机打乱
c) sort(List): 根据元素的自然顺序对指定List集合元素按升序排序
d) sort(List, Comparator): 根据指定规则对List集合元素进行排序
e) swap(List,int,int): 将指定List集合中的i处元素和j处元素进行交换 查找和替换
a) Object max(Collection): 根据元素的自然顺序,返回集合中的最大元素
b) Object max(Collection, Comparator): 根据指定规则, 返回集合中的最大元素
c) Object min(Collection)
d) Object min(Collection, Comparator)
e) int frequency(Collection, Object): 返回指定集合中指定元素的出现次数
f) void copy(List dest,List src): 将src中的内容复制到dest中
g) boolean replaceAll(List list, Object oldVal, Object newVal): 使用新值替换所有旧值8.集合使用的选择
判断需要存储数据的类型(一组对象或一组键值对)
- 一组对象(单列): Collection接口
允许重复: List
增删多: LinkedList(底层是双向链表)
改查多: ArrayList(底层是Object类型的可变数组)
不允许重复: Set
无序: HashSet(底层是HashMap,数组+链表+红黑树)
排序: TreeSet
插入和取出顺序一致: LinkedHashSet(底层是数组+双向链表) 一组键值对(双列): Map接口
键无序: HashMap(底层jdk7: 数组+链表,jdk8: 数组+链表+红黑树)
键排序: TreeMap
键插入和取出顺序一致: LinkedHashMap
读取文件: Properties9.泛型
为什么需要泛型
a) 编译时,检查添加元素的类型,提高了安全性
b) 减少了类型转换的次数,提高效率- 泛型的基本使用
ArrayList arrayList = new ArrayList(); - 泛型是一种可以接受数据类型的类型,相当于通用型
泛型的作用
a) 泛型可以保证如果程序在编译时没有发出警告,运行时就不会产生类型转换异常。同时,代码更加简洁、健壮
b) 可以在类声明时通过一个标识表示类中某个属性的类型,或者是某个方法的返回值的类型、参数类型泛型的基本概念
a) public class ArrayList
int a = 1; a = 2; a = 3;
E = String; E = Dog; E = Integer;
这里的E就是泛型,字母可以随意表示。泛型用来表示数据类型的类型
b) 泛型又称参数化类型,是jdk5出现的特性, 解决数据类型的安全性问题
c) 在类实例化时只要指定好需要的具体的类型即可- 泛型的声明
interface List{}
class HashMap{}
T、K、V不代表值,而是表示类型,任意字母都可以。常用T表示,是Type的缩写 - 泛型实例化
HashMaphashMap = new HashMap<>();
Iterator> iterator = entries.iterator(); 泛型细节
a) T、K、V,只能放引用类型
b) 在给泛型指定具体类型后,可以传入该类型或者其子类类型
c) HashMap hashMap = new HashMap(); 等价于 HashMap ```java import java.util.*; public class Hello { public static void main(String[] args) throws Exception { ArrayListobjects = new ArrayList<>(); objects.add(200); objects.add(100); Collections.sort(objects, new Comparator () { @Overridepublic int compare(Integer o1, Integer o2) {return o2-o1;}
}); System.out.println(objects);
a
objecta = new a<>();//自定义数据类型 objecta.test(“123”); System.out.println(“================================”); HashMap
HashMap = new HashMap<>(); HashMap.put(“1叶秋”,”123”); HashMap.put(“2叶秋”,”123”); HashMap.put(“3叶秋”,”123”); HashMap.put(“4叶秋”,”123”); Set > entries = HashMap.entrySet(); Iterator > iterator = entries.iterator(); while (iterator.hasNext()) { Map.Entry<String, String> next = iterator.next();System.out.println(next.getKey()+"-"+next.getValue());
} }}
class a
<a name="kbLp9"></a>#### 10.自定义泛型类1. 泛型标识符,一般是单个大写字母1. 泛型标识符可以有多个1. 实例属性、实例方法参数、实例方法返回值都可以使用泛型1. 静态属性、静态方法、静态代码块都不能使用泛型1. 使用了泛型的数组不能初始化1. 泛型类的类型是在创建对象时确定的1. 创建对象时,没有指定类型,默认为Object```javapublic class Hello {public static void main(String[] args) throws Exception {a<String,Integer,Boolean> a = new a<>();//自定义数据类型 String,Integer,Boolean 全是包装类a.test(1);a.aaaa=new String[]{"123"};//数组外部初始化}}class a<x,y,z>{public x aaaa[];//自定义泛型类中,不能使用静态方法;不能初始化数组public x name;public y test(y a){System.out.println(a);return a;};public z test1(z a){System.out.println(a);return a;};}
11.自定义泛型接口
- 接口中的静态成员不能使用泛型
- 泛型接口的类型,在继承接口或者实现接口时确定
- 没有指定类型,默认为Object
public class Hello {public static void main(String[] args) throws Exception {a<String,Integer,Boolean> a = new a<>();//自定义数据类型a.test(1);a.aaaa=new String[]{"123"};//数组外部初始化a.test2("接口");a.A("接口");}}class a<x,y,z> implements USB1<String,String,String>{public x aaaa[];//自定义泛型类中,不能使用静态方法;不能初始化数组public x name;public y test(y a){System.out.println(a);return a;};public z test1(z a){System.out.println(a);return a;};@Overridepublic String A(String a) {System.out.println("null");return "null";}public String test(String a) {return USB1.super.test2(a);}}interface USB1<W,X,Z>{X A( W a );//不能使用staticdefault Z test2(Z a){//接口的默认方法System.out.println(a);return a;}}
12.Class类的方法
| getName | 获取全类名 |
|---|---|
| getSimpleName | 获取简单类名 |
| getSuperClass | 以Class形式返回父类信息 |
| getInterfaces | 以Class[]形式返回接口信息 |
| getField/getFields | 获取public修饰的字段,包含本类和父类 |
| getDeclaredField/getDeclaredFields | 获取本类所有字段 |
| getMethod/getMethods | 获取public修饰的方法,包含本类和父类 |
| getDeclaredMethod/getDeclaredMethods | 获取本类所有方法 |
| getConstructors | 获取本类public修饰的构造器 |
| getDeclaredConstructors | 获取本类所有构造器 |
| getPackage | 以Package形式返回包信息 |
| getAnnotations | 以Annotation形式返回注解信息 |
| getClass | 得到运行类型 |
| newlnstance | 创建对象 |
| getClassLoader | 得到类加载器 |
| forName | 得到类对象 |
