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)
	返回此列表中指定元素的第一次出现的索引,如果此列表不包含元素,则返回-1int 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:
	数据类型必须是一致的
    读取的结果,是按照两种的方法或默认进行排序的输出的
posted @   morrowday  阅读(79)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效
点击右上角即可分享
微信分享提示