集合
为了存储不同类型的多个对象,java提供了一系列特殊的类,这些类可以存储任意类型的对象,并且存储的长度可变,被统称为集合。
集合可以理解为一个长度可变,可以存储不同数据类型的动态数组,位于java.utilb
Collection接口
/*
* Collection 单列集合的操作
* add(Object o)
* addAll(Collection c)
* remove(Object o)
* removeAll(Collection c)
* isEmpty() 判断是否为空
* contains(Object o)
* containsAll(Collection c)
* size()
* */
List接口
/*
* List 接口 extends Collection接口
*
* 特有的方法
* add(int index, Object o);插入元素
* get(int index); 查询元素
* set(int index, Object o); 修改元素
*
* */
ArrayList接口(查询快,增删改查慢)
ArrayList是List接口的实现类,他是程序中最常见的一种集合。ArrayList集合内部封装了一个长度可变的数组对象,当存入的元素超过素组长度时,ArrayList会在内存中分配一个更大的数组来存储这些元素,因此可以将ArrayList集合看作一个长度可变的数组。
LinkList接口(查询慢,增删改查快)
LinkList是List接口的实现类,LinkList集合内部维护一个双向循环列表,链表中的每一个元素都使用引用的方式记录它的前一个元素和后一个元素,从而可以将所有元素彼此链接起来。当插入一个新元素时,只需要修改元素之间的引用关系即可,删除一个结点也是如此。所以LinkedList集合增删效率非常高。
遍历集合
Iterator接口
Iterator接口是Java集合中的一员,但他语言Collection、Map接口有所不同,Collection接口与Map接口主要用于存储元素,而Iterator几口主要用于迭代访问(遍历)Collection中的元素,通常情况下Iterator对象也被称为迭代器。
迭代器遍历与remove连用会产生并发异常,通常有两种方式解决。
1、在remove执行完后,加上break终止循环。
2、用迭代器的remove进行移除。
foreach循环
for(容器中的元素类型 临时变量: 容器变量){//增强for只用于查看,普通for可用于修改
执行语句
}
set集合(单列集合子接口)
Set接口也继承自Collection接口,它与Collection接口中的方法基本一致,并没有对Collection接口进行功能上的扩充。与List接口不同的是,Set接口中元素是无序的,并且都会以某种规则保证存入的元素不出现重复.
Set接口常见的实现类有3个,分别是HashSet、LinkedHashSet、TreeSet。其中,HashSet根据对象的哈希值来确定元素在集合中的存储位置,具有良好的存取和查找性能; LinkedHashSet是链表和哈希表组合的一个数据存储结构;TreeSet则是以二叉树的方式存储元素,它可以对集合中的元素进行排序。
HashSet(无序)
HashSet是Set接口的一个实现类,它所存储的元素是不可重复的。当向HashSet集合中添加一个元素时,首先会调用该元素的hashCode()方法来确定元素的存储位置,然后再调用元素对象的equals()方法来确保该位置没有重复元素。Set集合与List集合存取元素的方式都一样,但是Set集合中的元素是无序的。
LinkedHashSet(为存储顺序)
HashSet集合存储的元素是无序的,如果想让元素的存取顺序一致,可以使用Java提供的LinkedHashSet类,LinkedHashSet类是HashSet的子类,与LinkedList一样,它也使用双向链表来维护内部元素的关系。
集合存储的元素是无序的,如果想让元素的存取顺序一致,可以使用提供的类,LinkedHashSet类是HashSet的子类,与LinkedList一样,它也使用双向链表来维护内部元素的关系。
TreeSet(用于排序)
/*
* TreeSet排序:
* 自然排序:
* 自定义类 实现Comparable接口
* 重写compareTo方法并指定排序规则
*
* 定制排序(******):
* 通过TreeSet的有参构造,传递Comparator对象
* 并指定排序规则
* 定制排序的优先级 大于 自然排序
*
* */
//指定排序规则:自然排序
public class Student implements Comparable{}
@Override
public int compareTo(Object o) {
Student stu = (Student) o;
return this.age-stu.getAge();
/*
* 根据返回值,决定顺序
* 大于0 放在右边
* 小于0 放在左边
* 等于0 不存
* */
}
//定制排序
TreeSet set = new TreeSet(new Comparator() {
@Override
public int compare(Object o1, Object o2) {
Teacher tea1 = (Teacher) o1;
Teacher tea2 = (Teacher) o2;
return tea1.getAge()- tea2.getAge();
}
});
Map接口简介
Map接口是一种双列集合,它的每个元素都包含一个键对象Key和值对象Value,键和值对象之间存在一种对应关系,称为映射。Map中键对象Key不允许重复,访问Map集合中的元素时,只要指定了Key,就能找到对应的Value。
HashMap
/*
* 1.put(k,v); 添加键值对
* put(相同key,新value),则覆盖。
* 2.get(k); 通过key得到对应的value
* 3.containsKey(k)是否包含指定key
* 4.containsValue(k)是否包含value
* 5.remove(k);移除键值对
* 6.遍历:
* map集合是不能直接使用增强for,迭代器
*
* 两种方式:
* 1.获取所有key的集合 keySet()方法
* 2.获取键值对集合 entrySet()方法
* */
LinkedHashMap
HashMap集合迭代出来元素的顺序和存入的顺序是不一致的。如果想让这Map集合中的元素迭代顺序与存入顺序一致,可以使用LinkedHashMap集合,
LinkedHashMap是HashMap的子类,与LinkedList一样,LinkedHashMap集合也使用双向链表维护内部元素的关系,使Map集合元素迭代顺序与存入顺序一致。
TreeMap
对键进行排序
Properties
特有方法: setProperty(String key, String value);//存储key和value
getProperty(String key); //通过key获取value
Collections
掌握Collections工具类,使用Collections工具类对List集合进行添加和排序操作,对Set、List和 Map进行查找、替换操作
/*
* Collections: 操作集合的工具类
* addAll();//将多个元素添加到集合中
* reverse();//反转
* shuffle();//随机打乱顺序
* sort();//排序 默认升序
* sort(new Comparator{
* 指定排序规则
* })
* swap(list, 0, list.size())// 指定元素交换
* max()最大值
* min()最小值
* replaceAll()替换
* binarySearch()二分查找
* */
Arrays工具类
######(ps:*Comparator参数仅支持引用类型,而int并非引用类型。*)
对数组进行排序、查找元素、复制元素、替换元素
/*
*
* Arrays 操作数组工具类
* sort(数组)排序, 默认升序,可以通过new Comparator进行定制化排序
* toString(数组)打印
* binarySearch(数组, 值)二分查找该值在数组中的位置
* copyOfRange(arr, 起始位置, 结束位置索引)
* fill(数组, 值) 将数组中的元素替换成指定的值
*
* */
Lambda表达式
Lambda表达式是JDK 8之后新增的一个新特性,Lambda可以取代大部分的匿名内部类,写出更优雅的Java代码,尤其在集合的遍历和其他集合操作中,可以极大地优化代码结构。JDK也提供了大量的内置函数式接口供我们使用,使得 Lambda表达式的运用更加方便、高效。Lambda表达式由参数列表、箭头符号->和方法体组成。方法体既可以是一个表达式,也可以是一个语句块。
//例建立一个线程对象
new MyThread(()->{
//重写的run对象
})