集合
一,集合Collection< E >
1,定义
数据存储的容器,大小不固定。
Collection集合层次的顶级接口。
< E >表示泛型—用于限定元素的数据类型的—而且由于泛型的限定,集合只能存储引用类型的数据。
2、集合中的成员
1)List< E >—有序列表
有序集合—指的是保证元素的存入顺序,可以添加重复元素。
1.1)常用直接子类
1-顺序表 ArrayList< E >
特点:基于数组。默认初始容量为10,每次扩容是在原数组的基础上增加一半。
基于右移运算 10 -> 15 -> 22.内存空间连续。插入或者删除一个元素相对效率较低,
查询元素相对效率比较高。是一个线程不安全的集合.
常用方法:
add() //向列表中添加一个元素
size() //获取列表元素个数
get() //从列表中获取指定下标的元素
toArray() //将列表转化为数组
remove() //从列表中删除元素
set() //修改指定位置的元素
2-链表 LinkedList
特点:
基于链表。用节点(Node)来存储元素。内存空间不连续。插入或者删除元素的
效率相对较快,
查询元素效率相对较低。是一个线程不安全的集合
(双端队列) Deque< E > extends Queue< E > (队列)
区别:
不同点:
-底层的数据结构不同,ArrayList(基于数组),LinkedList(基于链表)
-读数据:某些场景下ArrayList效率高于LinkedList
-写(添加/删除)数据: LinkedList效率高于ArrayList
相同点:
-都实现List接口
-线程不安全的集合
3-Vector向量
特点:是Java中最早的集合。底层是基于数组的。默认初始容量是10,每次扩容一倍。
基于三元运算。是一个线程安全的集合
4-Stack 栈
特点:遵循先进后出的原则。向栈中添加元素—入栈/压栈,
将元素从栈中取出—出栈/弹栈,
最先放入栈中的元素—栈底元素,最后放入栈中的元素—栈顶元素—底层
是用的Vector实现的
2)Set 无序集合
不包含重复元素的集合。
2.1)常用直接子类
HashSet
特点:不保证元素的存入顺序
默认初始容量是16,加载因子是0.75f,默认扩容一倍。是一个线程不安全的集合
底层基于HashMap(映射)。
3、迭代器
Iterator
迭代器,用于迭代遍历集合—在迭代过程中“不允许增删原集合”
Iterable提供了一个iterator方法来产生一个Iterator对象。
增强for循环本质上在迭代遍历。—如果一个对象允许使用增强for循环遍历,
则这个对象对应的类必须实现Iterable接口。—JDK1.5的特性之一
案例:利用迭代器遍历set
HashSet< String > names = new HashSet<>();
names.add(“张三”);
names.add(“李四”);
names.add(“王五”);
//迭代器
//1-先将集合转化为迭代器对象
Iterator< String > iterator = names.iterator();
//2-利用迭代器的方法实现遍历
while (iterator.hasNext()){
String next = iterator.next();
System.out.println(next);
}
4、Collections集合工具类
sort() //默认将原集合按照从小到大排序
reverse() //集合翻转
shuffle() //打乱原集合的存入顺序(洗牌)
5、Comparator 比较器
比较器。重写compare方法,将比较规则写到compare方法中。
如果返回一个正数,则意味着第一个参数要排在第二个参数后边;如果返回一个负数,
则意味着第一个参数要排在第二个参数前边。
如果在排序的时候没有指定比较规则,那么这个时候要求排序的元素所对应的类必须实现
Comparable接口,重写接口中compareTo方法
1)
Comparator< T >是一个接口,上面有一个注解@FunctionalInterface,表示当前接口是一个
函数式接口。
– lambda表达式
比较器接口对比:
Comparator: 既可以独立开发比较器,也可以与参与比较的类结合使用(弱耦合) ---- 策略模式
需要实现:int compare(Object o1, Object o2)
Comparable: 只能在参与比较的类中使用(强耦合)
需要实现:int compareTo(Object o)
练习:通过比较器Comparator实现将商品按照点击量从大到小排序
商品类 Product
属性: name 商品名
num 商品数量
hot 商品热度(点击量)
商品列表:
笔记本电脑 200 3600
电视机 120 700
手机 1600 4500
static class Product {
String name;
int num;
int hot;
public Product(String name,int num,int hot){
this.name=name;
this.num=num;
this.hot=hot;
}
@Override
public String toString() {
return "Product{" +
"name='" + name + '\'' +
", num=" + num +
", hot=" + hot +
'}';
}
}
public static class ProductSorting{
public static void main(String[] args) {
List<Product> products = new ArrayList<>();
products.add(new Product("笔记本电脑", 100, 2000));
products.add(new Product("电视机", 200, 1500));
products.add(new Product("手机", 300, 2500));
products.sort(new Comparator<Product>() {
@Override
public int compare(Product o1, Product o2) {
return o1.hot - o2.hot;
}
});
for (Product product : products){
System.out.println(product);
}
}
}
二、泛型
对数据类型的泛型化;(数据类型不确定)
泛型的定义方式: <大写字母> — < T > < E >; 单个字母大写是规范,字母可以自定义
位置:
泛型定义出现在类上----泛型类 ArrayList< E >
泛型定义出现在方法上----泛型方法
泛型定义出现在接口上----泛型接口 List< E >
类/接口: 泛型定义应写到名称后
方法: 泛型定义应写到 返回值类型前。
泛型被具体类型的替换的过程—泛型的擦除—发生在编译期
? extends 类/接口 — 表示这个类/接口及其子类/子接口(上限)
? super 类/接口 — 表示这个类/接口及其父类/父接口(下限)
? 表示通配符 — List<?>
三、映射—Map<K,V>
1、HashMap
在jdk1.8中底层是通过数组+链表+红黑树实现;
当链表个数达到8个时,链表转为红黑树: TREEIFY_THRESHOLD = 8;
红黑树节点个数小于等于6时,红黑树转为链表: UNTREEIFY_THRESHOLD = 6;
在HashMap中由键的哈希值确定放入哪个桶中—允许键或者值为null,默认初始容量是16,
加载因子是0.75f,每次扩容一倍。是一个异步式线程不安全的映射。
常用方法:
put() //將鍵值對添加到映射中
get() //根据key获取对应的value
keySet() //将映射中的所有key以set集合进行返回
entrySet() //将键值对包装到Entry中
2、HashTable
不允许键或者值为null,默认初始容量是11,加载因子是0.75f。
是一个同步式线程安全的映射
3、ConcurrentHashMap
异步式线程安全的映射
JDK1.5:
JUC-> Java Util Concurrent
点个赞鼓励一下谢谢