一、List系列集合
1.List集合特点、特有API
1):ArrayList、LinkedList:有序,可重复,有索引
2)List集合特有方法
List集合因为支持索引,所以多了很多索引操作的独特API,其他Collection的功能List也都继承了。
① void add (int indx,E element)
在此集合中的指定位置插入指定元素
② E remove (int index)
删除指定索引处的元素,返向被删除的元素
③E set (int index,E element)
修改指定索引处的元素,返回被修改的元素
④ E get (int index)
返回指定索引处的元素
package d5_collection_list;
import java.util.ArrayList;
import java.util.List;
public class ListDemo1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
//1、创建一个ArrayList集合对象
List<String> list=new ArrayList<>();
list.add("Java");
list.add("java");
list.add("MySQL");
list.add("MySQL");
//2、在某个索引位置插入元素
list.add(2, "HTML");
System.out.println(list);
//3、根据索引删除元素,返回被删除元素
System.out.println(list.remove(2));
System.out.println(list);
//4、根据索引获取元素:public E get(int index) 返回集合指定位置的元素
System.out.println(list.get(2));
//5、修改索引位置处的元素:public E set(int index,E element)
//返回修改前的数据
System.out.println(list.set(1, "高斯林"));
list.clear();
System.out.println(list);
}
}
2、List集合的遍历方式小结:
1)遍历方式
①迭代器
②增强for循环
③Lambda 表达式
④for循环(List的集合存在索引)
package d5_collection_list;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class ListDemo2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
List<String> list=new ArrayList<>();
list.add("Java");
list.add("java");
list.add("MySQL");
list.add("MySQL");
//for循环
for(int i=0;i<list.size();i++) {
System.out.println(list.get(i));
}
//迭代器
System.out.println("-----------------------");
Iterator<String> it=list.iterator();
while(it.hasNext()) {
System.out.println(it.next());
}
//foreach/增强for循环
System.out.println("--------------------");
for(String lists:list) {
System.out.println(lists);
//JDK1.8开始之后的Lambda表达式
System.out.println("-----------------------");
//list.forEach(e->System.out.println(e));
list.forEach(e->{
System.out.println(e);
});
}
}
}
3、ArrayList集合的底层原理
1)ArrayList底层是基于数组实现的:根据索引定位元素快,增删需要做元素的移位操作
2)第一次创建集合并添加第一个元素的时候,在底层创建一个默认长度为10的数组
4.LinkedList集合的就层原理
1)LinkedList的特点
底层数据结构是双链表,查询慢,首尾操作的速度是极快的,所以多了很多首尾操作的特有API
2)ListedList集合的特有功能
① public void addFirst(E e) 在该列表开头插入指定的元素
②public void addLast(E e)
将指定的元素追加到此列表的尾
③pubic E getFirst()
返回此列表中的第一个元素
④public E getLast() 返回此列表的最后一个元素
⑤ public E remove First()
删除并返回第一个元素
⑥ pubic E removeLast()
删除并返回最后一个元素
package d5_collection_list;
import java.util.LinkedList;
public class ListDemo3 {
public static void main(String[] args) {
// TODO Auto-generated method stub
//LinkedList可以完成队列结构,和栈结构(双链表)
//栈
LinkedList<String> stack=new LinkedList<>();
//压栈,入栈
stack.addFirst("第一颗子弹");
stack.addFirst("第二颗子弹");
stack.push("第三颗子弹");
System.out.println(stack);//[三 二 一]
//出栈 弹栈
System.out.println(stack.removeFirst());
System.out.println(stack.removeFirst());
System.out.println(stack);
//队列
LinkedList<String> queue=new LinkedList<>();
//入队
queue.addLast("1号");
queue.addLast("2号");
queue.offerLast("3号");
System.out.println(queue);
//出列
System.out.println(queue.removeFirst());
System.out.println(queue.removeFirst());
System.out.println(queue);
}
}
二、Set系列集合
1.Set系列集合概述
1)Set系列集合特点:
①无序:存取顺序不一致(只会无序一次,第二次执行与第一次一样)
②不重复
③无索引:没有带索引的方法
2)set集合实现类特点:
①Hashset:无序,不重复,无奈引
② LinkedHashset:有序,不重复,无奈引
③TreeSet:排序、不重复,无索引
Set集合的功能上基本上 Collection的API一致
2、HashSet元素无序的底层原理:哈希表
1)HashSet底层原理
①Hashsat集合底层采取哈希表存储的数据
②哈希表是一种对于增删改查数据性能都较好的结构
2)哈希表的组成
JDK8之后,底层来用(数组+链表+红黑树)相成3)哈东值哈希值跟数组的长度求余
3)哈希值(哈希值跟数组的长度求余)
是JDK根据对象的地址,按照某种规则(哈希值跟数组的长度求余)算出来的int类型的数值
4)Object类的API
public int hashCode()
返回对象的哈希值
5)对象的哈希值特点
①同一个对多次调用hashCde()方法返回的哈希值是相同的
②默认情况下,不同对象的哈希值是不同的.
3、HashSet元素去重复的底层原理
1)如果希望Set集合认为2个内容相同的对象是重夏的应该怎么办?
重写对的hashCode() 和equals()方法。
@Override
public int hashCode() {
return Objects.hash(age, name, sex);
}
/*
* 只要两个内容一样,结果一定是true
*/
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Student other = (Student) obj;
return age == other.age && Objects.equals(name, other.name) && sex == other.sex;
}
4、实现类:ListedHashSet
1)LinkedHashSet集合概述和特点
①有序,不重复,无索引
②这里有序指的是保证存储和取出的元素顺序一致
③原理:底层数据结构依哈希表,只是每元素又额外的多了一个双链表的机制记录存储的顺序。
5、实现类:TreeSet
1)TreeSet集合概述和特点
①不重复、无索引、可排序
②可排序:按照元素的大小默人升序(由小到大)排序
③TreeSet集合底层是基于红黑树数据结构实现排序的,增删改查性能都较好。
注:TreeSet 集合是一定要排序的,可以将元素按照指定的规则进行排序。
2)TreeSet集合默认的规则
①对于数值类型:Integer,Double
官方默认按照大小进行升序排序.
②对于字符串类型:默认按照首字母符的编号升序排序。
③对于自定义类型如Studert对象,Treset无法直接排序,需自己制定排序规则
3)自定义排序规则
Teset集合存储对象的时候有2种方式河以设计自定义比较规则
①方式一:
让自定义的类实现Comparable 接口重写里面的compareTo方法来定制比较规则
}
/*
* 方式一:自定义比较规则
* o1.compareTo(o2)
*/
@Override
public int compareTo(Apple o) {
// TODO Auto-generated method stub
// return this.weight-o.weight;//去除重量重复的元素
return this.weight-o.weight>=0? 1:-1;//保留重量重复的元素
}
@Override
public String toString() {
return "Apple [name=" + name + ", color=" + color + ", price=" + price + ", weight=" + weight + "]";
}
③方式二:
TeeSet集合有参数构造器,可以设置Comparator接口对应的比较器对象,来定制比较规则
// 方式二:集合自带比较器对象进行规则定制
//注意:如果TreeSet集合存储的对象有实现比较规则,集合也自带比较器,默认使用集合自带的比较器排序
// Set<Apple> a=new TreeSet<>(new Comparator<Apple>() {
//
// @Override
// public int compare(Apple o1, Apple o2) {
// // TODO Auto-generated method stub
return o1.getWeight()-o2.getWeight();//升序
return o2.getWeight()-o1.getWeight();//降序
return Double.compare(o1.getPrice(), o2.getPrice());//升序
// return Double.compare(o2.getPrice(), o1.getPrice());//降序
// }
// });
Set<Apple> a=new TreeSet<>((o1,o2)-> Double.compare(o2.getPrice(), o1.getPrice()));
a.add(new Apple("红富士","红色",18.9,500));
a.add(new Apple("青苹果","青色",9.9,300));
a.add(new Apple("绿苹果","绿色",20.9,200));
a.add(new Apple("黄苹果","黄色",9.8,500));
System.out.println(a);
注:如果TreeSet集合存储的对象有实现比较集合也自带比较器,默认使用集合自带的比较器排序.