1. 泛型
宽泛的类型。能够让类和方法更灵活地处理参数。Java 泛型有三种使用方式:泛型类、泛型方法、泛型接口。
-
需求:定义一个 Person 类,属性有 name、age,name 为 String 型,age 可以为 int 型,或者 String 型
-
没有泛型:
-
class Person {
private String name;
private Object age;
// getters & setters
public static void main(String[] args) {
Person person1 = new Person();
person1.setName("张三");
person1.setAge(18);
String name1 = person1.getName();
int age1 = (int) person1.getAge();
Person person2 = new Person();
person2.setName("李四");
person2.setAge("保密");
String name2 = person2.getName();
int age2 = (int) person2.getAge(); // 报错
}
}
使用泛型:
class Person<T> {
private String name;
private T age;
// getters & setters
public static void main(String[] args) {
Person<Integer> person1 = new Person<Integer>();
person1.setName("张三");
person1.setAge(18);
String name1 = person1.getName();
int age1 = person1.getAge();
Person<String> person2 = new Person<String>();
person2.setName("李四");
person2.setAge("保密");
String name2 = person2.getName();
String age2 = person2.getAge();
}
}
-
好处:
-
提高了数据的安全性,将运行时的问题,提前暴露在编译时期
-
避免了强转的麻烦
-
-
注意事项:
-
前后一致:在创建对象时,赋值符号前面和后面的类型的泛型,必须一致
-
泛型推断:如果前面的引用所属的类型已经写好了泛型,后面创建对象的类型就可以只写一个尖括号,尖括号中可以不写任何内容。<>特别像菱形,称为“菱形泛型”,jdk1.7特性。
-
Person<String> person = new Person<>();
2. 集合
2.1 概述
Java 中,数组的长度是固定的,一旦创建,就无法修改。为了解决这一限制,Java 提供类一系列的类,它们被称为集合框架。
-
List
为了实现容器容量可变,提供 List 接口,其中定义了新增元素、删除元素等动态操作容器的方法。List 接口继承自 Collection 接口。
List 下的主要实现类有:ArrayList、LinkedList
-
Set
为了实现容器中元素不可重复,提供 Set 接口,其中同样提供基础的操作容器的方法。Set 接口继承自Collection 接口。
Set 下的主要实现类有:HashSet、TreeSet
-
Map
为了实现关联性数据的存储,提供 Map 接口,也叫双列集合、K-V 集合、键值对集合,其中 Key 不可重复,Map 是 Set 的实现原理,Set 就是单独使用 Map 的 Key 来实现的。
Map 下的主要实现类有:HashMap、TreeMap
2.2 ArrayList
ArrayList 的底层实现方式为数组。
-
常用方法:
-
Collection 接口中:
-
add(Object obj):将 obj 元素添加到集合中
-
remove(Object obj):将 obj 元素从集合中删除
-
clear():将集合中的元素清空
-
isEmpty():判断集合中元素是否为空
-
contains(Object obj):判断集合中是否包含 obj 元素
-
size():返回集合中的元素个数
-
-
List 接口中:
-
add(int index, Object obj):在指定索引上,添加指定的元素。
-
remove(int index):删除指定索引上的值,也可以直接删除值。
-
set(int index, Object obj):将指定索引上的值,修改为指定的值。
-
get(int index):根据给定的索引,获取对应位置的值。
-
-
-
特别注意:
-
遍历集合过程中删除元素会引发错误
-
for (Student student : list) {
if (student.getName().length() <= 2){
list.remove(student); // 报错
}
}
使用迭代器遍历集合,可以删除元素
// 迭代器
Iterator<Student> iterator = list.iterator();
while (iterator.hasNext()) {
Student student = iterator.next();
if (student.getName().length() <= 2) {
// list.remove(student); // 报错
iterator.remove(); // 使用迭代器的删除方法
}
}
2.3 LinkedList
LinkedList 的底层实现方式为双向链表。
2.4 HashSet
HashSet 的底层实现方式为哈希表。
-
使用 HashSet,需要元素类型重写 hashcode 和 equals 方法。
-
HashSet 是无序的(存与取的顺序不同),List 的实现类都是有序的。
-
LinkedHashSet 在每个节点间维护了双向链表,实现了有序。
2.5 TreeSet
TreeSet 的底层实现方式为红黑树。
-
使用 TreeSet,需要元素类型实现 Comparable 接口并重写 compareTo 方法,或者提供 Comparator。
-
TreeSet 会自动排序(自然顺序),但也是无序的(存与取的顺序不同)。
2.6 HashMap
HashMap 的底层实现方式为哈希表,是 HashSet 的实现原理。
-
常用方法:
-
put(Object key, Object value):添加一个键值对到 Map 中
-
get(Object key):通过 key 获取 value
-
size():返回集合中的键值对个数
-
isEmpty():判断集合中元素是否为空
-
containsKey(Object key):判断集合中是否包含键为 key 的元素
-
containsValue(Object value):判断集合中是否包含值为 value 的元素
-
remove(Object key):将键为 key 的元素从集合中删除
-
keySet():返回所有的键,做为一个 Set 集合
-
values():返回所有的值,做为一个 Collection 集合
-
entrySet():返回所有的键值对,做为一个元素类型为 Map.Entry 的 Set 集合
-
-
Map 中的键不可重复,但值可以重复。
-
HashMap 中元素的键可以为 null。
-
TreeMap 的键可以自动排序(自然顺序)。
-
HashMap 和 TreeMap 都是无序的,LinkedHashMap 是有序的。
2.7 Collections 工具类
-
max
-
min
-
sort
-
binarySearch
-
reverse
-
shuffle