集合中list、ArrayList、LinkedList、Vector的区别、Collection接口的共性方法以及数据结构的总结

List (链表|线性表)

特点: 接口,可存放重复元素,元素存取是有序的,允许在指定位置插入元素,并通过索引来访问元素

1、创建一个用指定可视行数初始化的新滚动列表。默认情况下,不允许进行多项选择。

注意,这是 List(rows, false) 的一种便捷方法。还要注意,列表中的可视行数一旦创建就不能更改。

  public List(int rows)------------------row-----要显示的项数

2、创建一个初始化为显示指定行数的新滚动列表。

注意,如果指定了零行,则会按默认的四行创建列表。还要注意,列表中的可视行数一旦创建就不能更改。

如果 multipleMode 的值为 true,则用户可从列表中选择多项。如果为 false,则一次只能选择一项。

   public List(int rows,boolean multipleMode)-------rows - 要显示的项数。                                             -------multipleMode - 如果为 true,则允许进行多项选择;否则,一次只能选择一项。

综上所述:如果抛出为throws-----GraphicsEnvironment.isHeadless(),则返回 true。

Set(集)

特点: 不可以存放重复元素,元素存取是无序的

Collection(接口)

1、特点:描述的是集合共有的功能(描述所有接口的共性)

2、Collection接口有两个子接口:

List(链表|线性表)

Set(集)

集合整理


Collection


我们需要保存若干个对象的时候使用集合。


List


如果我们需要保留存储顺序, 并且保留重复元素, 使用List.

如果查询较多, 那么使用ArrayList

如果存取较多, 那么使用LinkedList

如果需要线程安全, 那么使用Vector


Set


如果我们不需要保留存储顺序, 并且需要去掉重复元素, 使用Set.

如果我们需要将元素排序, 那么使用TreeSet

如果我们不需要排序, 使用HashSet, HashSet比

TreeSet效率高.

如果我们需要保留存储顺序, 又要过滤重复元素, 那么使用LinkedHashSet

Collection接口的共性方法


增加:

1:add()   将指定对象存储到容器中

add 方法的参数类型是Object 便于接收任意对象

2:addAll() 将指定集合中的元素添加到调用该方法和集合中

删除:

3:remove() 将指定的对象从集合中删除

4:removeAll() 将指定集合中的元素删除

修改

5:clear() 清空集合中的所有元素

判断

6:isEmpty() 判断集合是否为空

7:contains() 判断集合何中是否包含指定对象

8:containsAll() 判断集合中是否包含指定集合

使用equals()判断两个对象是否相等

获取:   9:int size()    返回集合容器的大小

转成数组10: toArray()   集合转换数组

实例练习:

 1 //创建Person类
 2 class Person {
 3     private String name;
 4     private int age;
 5
 6     public Person() {
 7
 8     }
 9
10     public Person(String name, int age) {
11
12         this.name = name;
13         this.age = age;
14     }
15
16     @Override
17     public int hashCode() {
18         return this.name.hashCode() + age;
19     }
20
21     @Override
22     public boolean equals(Object obj) {
23         if (!(obj instanceof Person)) {
24             return false;
25         }
26         Person p = (Person) obj;
27         return this.name.equals(p.name) && this.age == p.age;
28     }
29
30     @Override
31     public String toString() {
32         return "Person :name=" + name + ", age=" + age;
33     }
34
35 }
36
37 public static void main(String[] args) {
38         Person p1 = new Person("李华", 19);
39         Person p2 = new Person("尹乐乐", 20);
40         Person p3 = new Person("洛洛", 18);
41         Collection list = new ArrayList();
42         list.add(p1);
43         list.add(p2);
44         list.add(p3);
45         // isEmpty() 判断集合是否为空
46         boolean empty = list.isEmpty();
47         System.out.println(empty);
48         // 返回集合容器的大小
49         int size = list.size();
50         System.out.println(size);
51          // contains()判断集合何中是否包含指定对象
52         boolean contains = list.contains(p1);
53         System.out.println(contains);
54
55         // remove(); 将指定的对象从集合中删除
56         list.remove(p1);
57
58         // clear() 清空集合中的所有元素
59         list.clear();
60         System.out.println(list);
61
62     }

分析总结:

1:Person类

1:姓名和年龄

2:重写hashCode和equals方法

1、如果不重写,调用Object类的equals方法,判断内存地址,为false

2、如果是Person类对象,并且姓名和年龄相同就返回true

3、如果不重写,调用父类hashCode方法,如果equals方法相同,那么hashCode也要相同,需要重写hashCode方法

3:重写toString方法

注:不重写,直接调用Object类的toString方法,打印该对象的内存地址

注:list、ArrayList、LinkedList、Vector的区别

1、List:元素是有序的(怎么存的就怎么取出来,顺序不会乱),元素可以重复(角标1上有个3,角标2上也可以有个3)因为该集合体系有索引。

List:特有的方法,凡是可以操作角标的方法都是该体系特有的方法。

2、ArrayList:1、底层的数据结构使用的是数组结构(数组长度是可变的百分之五十延长)。

2、特点:是查询很快,但增删较慢,线程不同步(数组查询快的原因是:数组的内存空间地址是连续的)。

3、ArrayList底层维护了一个Object[] 用于存储对象,默认数组的长度是10,当默认的或者指定的容量不够存储对象的时候,容量自动增长为原来的容量的1.5倍。

4、单线程效率高。

实例:  去除ArrayList集合中重复元素

1:存入字符串元素

2:存入自定义对象元素(如Perosn对象)

原理:

循环遍历该集合,每取出一个放置在新的集合中,放置之前先判断新的集合是否以包含了新的元素。

 1 public class Demo2 {
 2     public static void main(String[] args) {
 3         ArrayList arr = new ArrayList();
 4         Person p1 = new Person("jack", 20);
 5         Person p2 = new Person("rose", 18);
 6         Person p3 = new Person("rose", 18);
 7         arr.add(p1);
 8         arr.add(p2);
 9         arr.add(p3);
10         System.out.println(arr);
11         ArrayList arr2 = new ArrayList();
12         for (int i = 0; i < arr.size(); i++) {
13             Object obj = arr.get(i);
14             Person p = (Person) obj;
15             if (!(arr2.contains(p))) {
16                 arr2.add(p);
17             }
18         }
19         System.out.println(arr2);
20     }
21 }
22
23 class Person {
24     private String name;
25     private int age;
26
27     public Person() {
28
29     }
30
31     public Person(String name, int age) {
32
33         this.name = name;
34         this.age = age;
35     }
36
37     public String getName() {
38         return name;
39     }
40
41     public void setName(String name) {
42         this.name = name;
43     }
44
45     public int getAge() {
46         return age;
47     }
48
49     public void setAge(int age) {
50         this.age = age;
51     }
52
53     @Override
54     public int hashCode() {
55         return this.name.hashCode() + age * 37;
56     }
57
58     @Override
59     public boolean equals(Object obj) {
60         if (!(obj instanceof Person)) {
61             return false;
62         }
63         Person p = (Person) obj;
64
65         return this.name.equals(p.name) && this.age == p.age;
66     }
67
68     @Override
69     public String toString() {
70         return "[email protected]:" + this.name + " age:" + this.age;
71     }
72
73 }

3、LinkedList:底层的数据结构是链表结构(特点是查询较慢,增删较快)。

特有方法:addFirst(E e)、getFirst(E e) 、removeFirst(E e)

如果集合中没有元素,获取或者删除元素抛:NoSuchElementException

4、Vector:1、底层是数组数据结构 线程同步(数组长度是可变的百分之百延长),(无论查询还是增删都很慢,被ArrayList替代了)

2、多线程安全的,所以效率低。

3、特有的方法:

void addElement(E obj)  在集合末尾添加元素

E elementAt( int index) 返回指定角标的元素

Enumeration elements()  返回集合中的所有元素,封装到Enumeration对象中测试此枚举是否包含更多的元素。

E nextElement()    如果此枚举对象至少还有一个可提供的元素,则返回此枚举的下一个元素。

Enumeration 接口: boolean hasMoreElements()

注:1、可以使用该集合去模拟出队列(先进先出) 或者堆栈(后进先出) 数据结构,堆栈(后进先出)。

2、有一批数据要存储,要求存储这批数据不能出现重复数据,ArrayList、LinkedList都没法满足需求。解决办法:使用 set集合。

数据结构

1:栈 (1.6)

先进后出

push()

pop()

2:队列(双端队列1.5)

先进先出

offer()

poll()

3:返回逆序的迭代器对象   descendingIterator()   返回逆序的迭代器对象

 1   //迭代
 2   import java.util.Iterator;
 3   import java.util.LinkedList;
 4
 5   public class Demo3 {
 6       public static void main(String[] args) {
 7           LinkedList list = new LinkedList();
 8           list.add("微信");
 9           list.add("微博");
10          list.add("淘宝");
11          list.add("京东");
12          list.add("阿里巴巴");
13          Iterator it = list.iterator();
14                 // Iterator it = list.descendingIterator();//逆序迭代
15          while (it.hasNext()) {
16              String next = (String) it.next();
17              System.out.println(next);
18          }
19      }
20  }
时间: 2024-12-12 09:32:45

集合中list、ArrayList、LinkedList、Vector的区别、Collection接口的共性方法以及数据结构的总结的相关文章

List ArrayList LinkedList vector简介与区别

ArrayList,LinkedList,Vestor这三个类都实现了java.util.List接口,但它们有各自不同的特性,主要如下: ArrayList:底层用数组实现的List 特点:查询效率高,增删效率低 轻量级 线程不安全 LinkedList:底层用双向循环链表 实现的List 特点:查询效率低,增删效率高 Vector: 底层用数组实现List接口的另一个类 特点:重量级,占据更多的系统开销 线程安全 一.同步性 ArrayList,LinkedList是不同步的,而Vestor

ArrayList和Vector的区别?HashMap和HashTable的区别?StringBuilder、StringBuffer和String的区别?

ArrayList和Vector的区别?从两个方面 1.同步性:ArrayList是线程不安全的,是非同步的:Vector是线程安全的,是同步的.(Java中线程的同步也就满足了安全性) 2.数值增长:ArrayList每次增长为原来的50%;Vector每次增长为原来的100%; (从内部实现机制来讲,ArrayList和Vector都是使用数组(Array)来控制集合中的对象,当向集合中添加对象时,如果内部数组长度不够用时,长度会自动增长.ArrayList会增长为原来的1.5倍,Vecto

ArrayList和Vector的区别

这两个类都实现了List接口(List接口继承了Collection接口),他们都是有序集合,即存储在这两个集合中的元素的位置都是有顺序的,相当于一种动态的数组,我们以后可以按位置索引号取出某个元素,,并且其中的数据是允许重复的,这是HashSet之类的集合的最大不同处,HashSet之类的集合不可以按索引号去检索其中的元素,也不允许有重复的元素(本来题目问的与hashset没有任何关系,但为了说清楚ArrayList与Vector的功能,我们使用对比方式,更有利于说明问题). 接着才说Arra

ArrayList 和 Vector 的区别

这两个类都实现了 List 接口( List 接口继承了 Collection 接口),他们都是有序集合,即存储在这两个集合中的元素的位置都是有顺序的,相当于一种动态的数组,我们以后可以按位置索引号取出某个元素,,并且其中的数据是允许重复的,这是 HashSet 之类的集合的最大不同处, HashSet 之类的集合不可以按索引号去检索其中的元素,也不允许有重复的元素(本来题目问的与 hashset 没有任何关系,但为了说清楚 ArrayList 与 Vector 的功能,我们使用对比方式,更有利

ArrayList和Vector的区别?

首先两个类都实现了List接口.他们都是有序不唯一的集合,说白了就是存储元素的位置是有序的(每一个元素都以一个对应的索引),相当于一个动态数组 ArrayList和Vector的区别,主要包括两个方面 同步性: Vector是线程安全的,也就是说它的方法直线是线程同步的,而ArrayList是线程不安全的,它的方法之间是线程不同步的 如果只有一个线程去访问集合那么使用ArrayList,他不考虑线程安全的问题,所以效率会高一些 如果是多个线程去访问集合,那么使用Vector 数据增长性: Arr

深入解析 Java集合类ArrayList与Vector的区别

集合类分为两个分支,Collection与Map,其中Collection接口继承了Iterator接口,继承Iterator接口的类可以使用迭代器遍历元素(即Collection接口的类都可以使用),今天我们从相同点.不同点.以及JDK源码等各个方面来深入解析下,底层使用数组实现的两个集合类:ArrayList与Vector的区别与联系 区别与联系: 1.ArrayList出现于jdk1.2,vector出现于1.0.两者底层的数据存储都使用的Object数组实现,因为是数组实现,所以具有查找

ArrayList,LinkedList,Vector,Set,Map,List,HashMap,HashTable

java集合类只要有两个接口派生而出.Collection和Map.  其中set和List分别代表无序集合与有序集合. 下图为Map体系集合数 HashSet具有一下特点: 不能保证排序顺列, HashSet不是同步的, 如果多个线程同时访问一个HashSet.假设有两个以上线程同时修改HashSet的值时,需要通过代码使其同步. 当向HashSet里面添加元素时,HashSet会调用该对象的HashCode()方法来获取HashCode值. 如果两个元素通过equals()方法比较返回tru

集合框架,ArrayList和Vector的区别,让arrayList线程安全的几种方案

boolean add(E e) 将指定的元素添加到此列表的尾部. void add(int index, E element) 将指定的元素插入此列表中的指定位置. boolean addAll(Collection<? extends E> c) 按照指定 collection 的迭代器所返回的元素顺序,将该 collection 中的所有元素添加到此列表的 尾部. boolean addAll(int index, Collection<? extends E> c) 从指定

集合ArrayList和Vector的区别?

这两个类都实现了list接口(list接口继承Collection接口),他们都是有序集合(及储存在两个集合中的元素的位置都是有顺序的) . 1.同步性: Vector是线程安全的,也就是说是它的方法之间是线程同步的,而ArrayList是线程序不安全的,它的方法之间是线程不同步的.如果只有一个线程会访问到集合,那最好是使用ArrayList,因为它不考虑线程安全,效率会高些:如果有多个线程会访问到集合,那最好是使用Vector,因为不需要我们自己再去考虑和编写线程安全的代码. 2.数据增长: