泛型概述
泛型:是JDK5中引入的特性,它提供了编译时类型安全检测机制
泛型的好处: 把运行时期的问题提前到了编译期间 避免了强制类型转换
泛型可以使用的地方
类后面:泛型类
方法申明上:泛型方法
接口后面:泛型接口
泛型类的总结
如果一个类的后面有,表示这个类是一个泛型类。 创建泛型类的对象时,必须要给这个泛型确定具体的数据类型。
泛型的定义格式
<类型>:指定一种类型的格式。 尖括号里面可以任意书写,按照变量的定义规则即可。一般只写一个字母。 比如:<E>、<T>、<Q>、<M>
<类型1,类型2...>:指定多种类型的格式,多种类型之间用逗号隔开。 比如:<E,T>、<Q,M>、<K,V>
泛型类的定义格式:
泛型类
格式:修饰符 class 类名 { }
范例:public class Generic { },此处T可以随便写为任意标识,常见的如T、E、K、V等形式的参数常用于表示泛型
泛型方法
泛型方法的定义格式:
格式:修饰符 返回值类型 方法名(类型 变量名) { }
范例:public void show(T t) { }
泛型接口
泛型接口的使用方式:
实现类也不给泛型
实现类确定具体的数据类型
泛型接口的定义格式:
格式:修饰符 interface 接口名 { }
范例:public interface Generic { }
类型通配符
类型通配符:<?>
ArrayList<?>:表示元素类型未知的ArrayList,它的元素可以匹配任何的类型
但是并不能把元素添加到ArrayListList中了,获取出来的也是父类类型
类型通配符上限<? extends 类型>: 比如: ArrayListList<? extends Number>:它表示的类型是Number或者其子类型
类型通配符下限<? super 类型>: 比如: ArrayListList<? super Number>:它表示的类型是Number或者其父类型
Set
Set集合概述和特点
Set集合特点
可以去除重复
存取顺序不一致
没有带索引的方法,所以不能使用普通for循环遍历,也不能通过索引来获取,删除Set集合里面的元素
public static void main(String[] args) {
HashSet<String> hs = new HashSet<>();
hs.add("a");
hs.add("b");
hs.add("c");
hs.add("d");
for(String s: hs){
System.out.println(s);
}
}
TreeSet
TreeSet集合概述和特点
TreeSet集合特点
不包含重复元素的集合
没有带索引的方法
可以将元素按照规则进行排序
自然排序Comparable的使用
使用空参构造创建TreeSet集合
自定义的Student类实现Comparable接口
重写里面的compareTo方法
public static void main(String[] args) {
Student s1 = new Student("zhangsan",28);
Student s2 = new Student("lisi",27);
Student s3 = new Student("wangwu",29);
Student s4 = new Student("zhaoliu",28);
Student s5 = new Student("qianqi",30);
TreeSet<Student> ts = new TreeSet<>();
ts.add(s1);
ts.add(s2);
ts.add(s3);
ts.add(s4);
ts.add(s5);
for (Student s : ts){
System.out.println(s);
}
}
public class Student implements Comparable<Student>{
private String name;
private int age;
public Student() {
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
/**
如果返回值为负数,表示当前存入的元素是较小值,存左边
如果返回值为0,表示当前存入的元素跟集合中元素重复了,不存
如果返回值为正数,表示当前存入的元素是较大值,存右边
*/
@Override
public int compareTo(Student s) {
int result = this.age - s.age;
result = result == 0 ? this.name.compareTo(s.name) : result;
return result;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
比较器排序Comparator的使用
TreeSet的带参构造方法使用的是比较器排序对元素进行排序的
比较器排序,就是让集合构造方法接收Comparator的实现类对象,重写compare(T o1,T o2)方法
重写方法时,一定要注意排序规则必须按照要求的主要条件和次要条件来写
public static void main(String[] args) {
TreeSet<Teacher> ts = new TreeSet<>(new Comparator<Teacher>() {
@Override
public int compare(Teacher t1, Teacher t2) {
int result = t1.getAge() - t2 .getAge();
result = result == 0 ? t1.getName().compareTo(t2.getName()) : result;
return result;
}
});
Teacher t1 = new Teacher("zhangsan",23);
Teacher t2 = new Teacher("lisi",22);
Teacher t3 = new Teacher("wangwu",24);
Teacher t4 = new Teacher("zhaoliu",24);
//把老师添加到集合
ts.add(t1);
ts.add(t2);
ts.add(t3);
ts.add(t4);
//遍历集合
for (Teacher teacher : ts) {
System.out.println(teacher);
}
}
public class Teacher {
private String name;
private int age;
public Teacher(String name, int age) {
this.name = name;
this.age = age;
}
public Teacher() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Teacher{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
两种比较方式小结
自然排序:自定义类实现Comparable接口,重写compareTo方法,根据返回值进行排序。
比较器排序:创建TreeSet对象的时候传递Comparator的实现类对象,重写compare方法,根据返回值进行排序。
在使用的时候,默认使用自然排序,当自然排序不满足现在的需求时,使用比较器排序
两种方式中,关于返回值的规则:
如果返回值为负数,表示当前存入的元素是较小值,存左边
如果返回值为0,表示当前存入的元素跟集合中元素重复了,不存
如果返回值为正数,表示当前存入的元素是较大值,存右边
HashSet集合概述和特点
HashSet集合特点
底层数据结构是哈希表
对集合的迭代顺序不作任何保证,也就是说不保证存储和取出的元素顺序一致
没有带索引的方法,所以不能使用普通for循环遍历
由于是Set集合,所以元素唯一
public static void main(String[] args) {
HashSet<String> hs = new HashSet<>();
hs.add("a");
hs.add("b");
hs.add("c");
hs.add("d");
for(String s: hs){
System.out.println(s);
}
}
Map
Map集合概述
Interface Map<K,V> K:键的数据类型;V:值的数据类型
键不能重复,值可以重复
键和值是一一对应的,每一个键只能找到自己对应的值
(键 + 值) 这个整体 我们称之为“键值对”或者“键值对对象”,在Java中叫做“Entry对象”。
Map集合的基本功能
方法名 | 说明 |
V put(K key,V value) | 添加元素 |
V remove(Object key) | 根据键删除键值对元素 |
void clear() | 移除所有的键值对元素 |
boolean containsKey(Object key) | 判断集合是否包含指定的键 |
boolean containsValue(Object value) | 判断集合是否包含指定的值 |
boolean isEmpty() | 判断集合是否为空 |
int size() | 集合的长度,也就是集合中键值对的个数 |
Map集合的获取功能
方法名 | 说明 |
V get(Object key) | 根据键获取值 |
Set<K> keySet() | 获取所有键的集合 |
Map集合的获取功能
方法名 | 说明 |
Set<Map.Entry<K,V>> entrySet() | 获取所有键值对对象的集合 |
K getKey() | 获得键 |
V getValue() | 获得值 |