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() {
@Override
public 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() {
@Override
public 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() {
@Override
public 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() {
@Override
public 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 () { @Override
public 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
```java
public 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;
};
@Override
public 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 );
//不能使用static
default 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 | 得到类对象 |