欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

关于集合List和Set

程序员文章站 2022-03-03 08:52:29
...

List:可存入重复的值

ArrayList<E>:存储结构数组结构

按下标遍历元素效率较高,按下标查找元素效率较高,可以自动扩容

插入删除效率低,按元素内容查找效率低,线程不安全

创建时初始值默认大小为0,后续当调用增加方法时,默认大小扩到10,

之后再需要扩容时一般是之前的1.5倍(通过移位运算符>>计算得出的1.5倍),

但会去先确认这个扩完1.5倍大小时是否够用(比如说,之前的Arraylist大小是1,扩到1.5倍后还是1容量(1.5会取整成1),这时便会扩容成之前Arraylist容量+1的容量

但扩容时不会超过可扩容的最大容量(Integer.MAX_VALUE-8),

如果超过了这个数,则先去确认之前的Arraylist容量+1(即最小需要的容量)是否超过了

Int所能存储的最大大小,超过了的话会抛出OutOfMemoryError的异常,

否则在确认是否超过了(Integer.MAX_VALUE-8),超过了则返回int所能存储的最大数(2的32次方-1),否则返回(Integer.MAX_VALUE-8)。

Vector:存储结构为数组结构

按下标遍历元素效率较高,按下标查找元素效率较高,可以自动扩容

插入删除效率低,按元素内容查找效率低,线程安全

构造器可以传入初始容量大小(不传默认为0),容量增量(不传默认为0,即翻一番),和arraylist差不多,区别仅仅是增量,以及当为初始容量0时,扩增时是0+1而不是10.

LinkedList:存储结构为双向链表结构

增加删除快,查找慢,可以通过方法addFirst()和addLast()从两端往里存,跟栈的数据结构一样,先进后出

Set:不可存入重复的值

HashSet:散列存储(其实是基于hash表的方式进行存储)

通过add()方法存放,可以用迭代器iterator去取出。

Hashset<Integer> set=new HashSet<>();

Interator<Integer> in=set.interator();

System.out.println(In.next());

TreeSet:会根据存放的值进行排序存储.

如下是使用方法,通过这段代码便可得知TreeSet会根据存放的值进行排序存储的特性:

TreeSet<Integer>t=new TreeSet<>();

t.add(2);

t.add(3);

t.add(1);

for(Integer a:t){

    System.out.println(a)

}

结果为:

1

2

3

但如果是想用TreeSet存放自己定义的类,那么此类需要实现Comparable<E>接口并实现Camparable的compareTo方法

原因也是因为TreeSet会根据存放的值进行排序存储,compareTo方法就是去定义要定义的类的排序的方法,如:

TreeSet<Person>p=new TreeSet;//用TreeSet存储Person类

Public class Person implement Camparable{

    private int age;

    //this与o进行比较,返回的数据:负数 表示this小;
    //零表示相同,但由于Set的不可储存重复值的特性所以不会再进行存放
    //正数则表示this大
    public int compareTo(Person o){

        if(this.age>o.age){//用age元素进行比较,年龄小的将在treeSet存储位置靠前

            return 1;

        }else if(this.age==0.age){

            return 0;

        }

    return -1;

    }

}

相关标签: 笔记 java