set集合,list集合,总结笔记


List 和 set 集合 重写了toString() 的方法,直接打印便可以查看元素。


自己经常理解的混乱的概念:

存取有序:
1. 存储元素的数据跟返回元素的数据一致。跟list集合一样
2. 输出的元素是以某种规则进行排序,返回的。(比如:从小到大)


慢慢的补



集合线程的安全性

JAVA的各种集合的线程安全性



集合的常见面试题

常见容器面试题



list集合的常见子类



set集合的常见子类

特点:

set集合:
	1. 不允许存储重复的元素
	2. 没有索引。
  1. HashSet
  2. linkHashSet
  3. treeSet

HashSet

特点:

1. 有set集合本身的特点,(无法存储相同的元素,无法通过索引进行获取元素,只能通过 迭代器 和增强for循环  获取元素  )

(不bb)上代码:

		Set<String> link1 = new HashSet<>();
        link1.add("www");
        link1.add("abc");
        link1.add("itcast");

        System.out.println(link);

        System.out.println("========================");

结果:
在这里插入图片描述

		Set<Integer> set = new HashSet<>();
        set.add(2);
        set.add(1);
        set.add(5);
        set.add(4);
        set.add(8);

        System.out.println(set); 

在这里插入图片描述

可以发现:

前提:泛型指定了的。不是Object类型
	会根据存储的值,进行排序,输出的结果:就是排好顺序的结果

特点:

存储的顺序会和取出来的顺序可能不同。存的数据,本来就是按照从小到大的顺序,
那么,取出来的顺序就和存的顺序相同。

如果泛型是 自定义的对象呢?

public class Person {

    String name;
    int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    
    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
        Person person = new Person("a_zhangsan",21);
        Person person1 =new Person("b_lisi",31);
        Person person2 = new Person("c_wangwu",41);
        Person person3 = new Person("d_zhaoliu",51);

        Set<Person> personSet = new HashSet<>();
        personSet.add(person);
        personSet.add(person1);
        personSet.add(person2);
        personSet.add(person3);

        System.out.println(personSet);

在这里插入图片描述
存取的顺序,和取出来的顺序不同。

		Person person = new Person("a_zhangsan",21);
		
        Set<Object> personSet = new HashSet<>();
        personSet.add(person);
        personSet.add(123);
        personSet.add("123hahah");
        personSet.add(213.4);

        System.out.println(personSet);

在这里插入图片描述


至于:为什么 泛型为Integer ,String 的时候,输出的结果是:有序的。
我认为是二者实现了 Comparable接口。 但是,在自定义的person类中,实现了 Comparable接口 ,但是却无法,有顺序的输出结果。(待解决,知道的大佬指明一下,谢谢)


hashset的底层是:数组+链表(哈希表) 链表长度为8,就会变成红黑树

原理是如何进行存放的,根据hashCode() , equals()方法进行比较的.
hashCode()没有重写之前,它的值就是看到的地址值
equals()没有重写之前,比较的就是地址值。

这里有详细的讲解


hashset特点总结

HashSet特点:
​ 1.不允许存储重复的元素
​ 2.没有索引,没有带索引的方法,也不能使用普通的for循环遍历
​ 3.是一个无序的集合,存储元素和取出元素的顺序有可能不一致
​ 4.底层是一个哈希表结构(查询的速度非常的快)


linkHashset

存取有序

System.out.println("=====================");

        Set<String> link = new LinkedHashSet<>();

        link.add("www");
        link.add("abc");
        link.add("itcast");

        System.out.println(link);

        /*
        link 和 set 集合中,重写了toString ()方法的。
         */
        System.out.println("========================");

        Set<String> link1 = new HashSet<>();

        link1.add("www");
        link1.add("abc");
        link1.add("itcast");

        System.out.println(link1);

        System.out.println("========================");

在这里插入图片描述

底层原理:

哈希表+多个一个链表进行来记录拿取的顺序

linkHashSet特点

	存取有序


treeSet

集合的数据类型是必须是一致的。

不一致的情况:

		Person person = new Person("a_zhangsan",21);
        Set<Object> personSet = new TreeSet<>();
        personSet.add(person);
        personSet.add(123);
        personSet.add("123hahah");
        personSet.add(213.4);
        System.out.println(personSet);
        System.out.println("========================");

在这里插入图片描述

一致的情况:
string类型实现了Comparable接口

		Set<String> personSet = new TreeSet<>();
        personSet.add("ccc");
        personSet.add("aaa");
        personSet.add("123");
        personSet.add("213.4");

        System.out.println(personSet);

在这里插入图片描述

自定义的类型:

public class Person {

    String name;
    int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

		Set<Object> personSet = new TreeSet<>();
        Person p1 =new Person("a",30);
        Person p2 =new Person("a",40);
        Person p3 =new Person("a",50);

        personSet.add(p1);
        personSet.add(p2);
        personSet.add(p3);

        System.out.println(personSet);
        System.out.println("========================");

在这里插入图片描述

实现了Comparable接口的Person

public class Person implements Comparable<Person>{

    String name;
    int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    @Override
    public int compareTo(Person o) {
        return Integer.compare(this.age, o.age);//升序
    }
}
		Set<Object> personSet = new TreeSet<>();
        Person p1 =new Person("a",30);
        Person p2 =new Person("a",40);
        Person p3 =new Person("a",50);

        personSet.add(p1);
        personSet.add(p2);
        personSet.add(p3);

        System.out.println(personSet);

        System.out.println("========================");

在这里插入图片描述
说明了:
使用TreeSet集合:
必须是相同的数据类型,返回的结果是按照某种规则排序的。

另一个情况:

		Set<Object> personSet = new TreeSet<>();
        Person p1 =new Person("a",20);
        Person p2 =new Person("b",20);
        Person p3 =new Person("c",20);

        personSet.add(p1);
        personSet.add(p2);
        personSet.add(p3);

        System.out.println(personSet);

在这里插入图片描述
结果只有一个。

说明了是根据 Comparable 接口中的 compareTo方法 来进行判断是否元素相同。返回0,代表元素相同。不进行存储。符合了set的规则。

treeSet集合特点总结

1. 数据类型必须是一致的。
2. 读取的结果,是按照一定的规则进行排序的输出的。
3. 没有定义规则,会报错的。

其他的后面补

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值