List 和 Set 接口
List 和 Set 接口
一,前言
了解List和set接口下子类的同和异,掌握接口的常用方法
二,List集合
1.List集合的特点
- 鉴于Java数组中用来存储数据的局限性,我们通常用List代替数组。
- List集合中具有 元素有序,且可重复 的性质,集合中的每个元素都有其对应的顺序索引。
- List接口实现类常用的有:ArrayList,LinkedList和Vector。
2.List集合常用方法
void add(int index, E element)
将指定的元素插入此列表中的指定位置。
boolean addAll(int index, Collection<? extends E> c)
将指定集合中的所有元素插入到此列表中的指定位置。
E remove(int index)
删除该列表中指定位置的元素。
Object get(int index)
返回此列表中指定位置的元素。
E set(int index, E element)
用指定的元素替换此列表中指定位置的元素。
int indexOf(Object o)
返回此列表中指定元素的第一次出现的索引,如果此列表不包含元素,则返回-1。
int lastIndexOf(Object o)
返回此列表中指定元素的最后一次出现的索引,如果此列表不包含元素,则返回-1。
List<E> subList(int fromIndex, int toIndex)
返回此列表中指定的 fromIndex (含)和 toIndex之间的视图。
3.List集合遍历
- 迭代器遍历
public static void main(String[] args) {
List<String> list = new ArrayList();
list.add(new String("book001"));
list.add(new String("book002"));
list.add(new String("book003 "));
String value = null;
Iterator iter = list.iterator();
while (iter.hasNext()) {
value = (String)iter.next();
System.out.println(value);
}
}
- for循环遍历
public static void main(String[] args) {
List<String> list = new ArrayList();
list.add(new String("book001"));
list.add(new String("book002"));
list.add(new String("book003 "));
String value = null;
Iterator iter = list.iterator();
for(i = 0;i<list.size();i++){
value = (String)list[i];
System.out.println(value);
}
- 增强 for (foreach) 循环遍历
public static void main(String[] args) {
List<String> list = new ArrayList();
list.add(new String("book007"));
list.add(new String("book008"));
list.add(new String("book009"));
String value = null;
for (String books:list) {
value = books;
System.out.println(value);
}
}
4.list集合总结
- List 中元素是有序的,元素可以重复,因为该集合体有索引。
ArrayList:
作为List接口的主要实现类,线程不安全,效率高,底层使用Object[] elementData。
LinkedList:
对于频繁的插入,删除操作,使用比ArrayList效率搞,底层使用双向链表存储。
Vector:
作为List接口的古老实现类,线程安全,效率低,底层使用Object[] elementData。
三,Set集合
1.Set集合的特点
- Set 集合不允许包含相同的元素,如果试把两个相同的元素加入同一个 Set 集合中,则添加操作失败
- Set 判断两个对象是否相同不是使用 == 运算符,而是根据 equals 方法。
2.HashSet集合
HashSet特点:
- HashSet 是 Set 接口的典型实现,大多数时候使用 Set 集合时都使用这个实现类。
- HashSet 按 Hash 算法来存储集合中的元素,因此具有很好的存取和查找性能。
- HashSet 具有以下特点:
-
-
- 不能保证元素的排列顺序
- HashSet 不是线程安全的(异步)
- 集合元素可以是null
-
HashSet存储原理:
- HashCode() 获取哈希码,也称散列码;实际是返回一个int整数。作用是确定该对象在哈希表中的索引位置,Java的任何类都包含有hashCode() 函数。
- 当向 HashSet 集合中存入一个元素时,HashSet 会调用该对象的 hashCode() 方法,获取哈希值,然后根据 值决定该对象在 HashSet 中存储位置。
- 如果两个元素的 equals() 方法返回 true,但它们的 hashCode() 返回值不相等,hashSet 将会把它们存储原有元素指向下面的位置,但依然可以添加成功。
注:测试重写 equals和hashCode方法,存储对象。
3.TreeSet集合
HashSet特点:
-
TreeSet基于TreeMpa实现,TreeMap本质就是红黑树。所以TreeSet其实于是基于红黑树的。
-
TreeSet有个特点,插入无序内部有序。
-
插入数据实现Comparable接口,通过compareTo方法去比较大小,或者在实力化TreeSet的时候自定义排序Comparator方法。内部的int compare(T o1, T o2)比较对象大小。
TreeSet集合排序:
插入实现Comparable接口重写类方法:
(Comparable接口,compareTo方法)
public class Person implements Comparable<Person>{
@Override
public int compareTo(Person o) {
// TODO Auto-generated method stub
return this.age - o.age;
}
}
实力化TreeSet自定义排序Comparator方法:(如按类的年龄排序)
(Comparator方法,compare(T o1, T o2))
public void test(){
Comparator com = new Comparator(){
@Override
public int compareTo(Person o1,Person o2) {
if(o1 instanceof User && o1 instanceof User){
User u1 = (User)o1;
User u2 = (User)o2;
return Integer.compare(u1.getAge(),u2.getAge())
}else{
throw new RuntimeException("输入的数据类型不匹配")
}
TreeSet ts = new TreeSet(com);
}
}
}
4.Set集合遍历
迭代器遍历,foreach遍历;
5 .Set集合总结
- 不允许存储重复的元素
- 没有索引
HashSet:
不允许存储重复的元素
没有索引,没有带索引的方法,也不能使用普通的for循环遍历
是一个无序的集合,存储元素和取出元素的顺序有可能不一致
底层是一个哈希表结构(查询的速度非常的快)
treeSet:
数据类型必须是一致的
读取的结果,是按照两种的方法或默认进行排序的输出的
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效