集合、List、链表、比较器

1. 集合

1.1 概述

java集合是使程序能够存储和操纵元素不固定的一组数据。所有java集合类都位于java.until包中

【问】:之前需要把多个元素放到一起的时候,使用的是数组。那么为何还要提供java集合工具类呢?

我们来通过对比数组和java集合工具类来解释java集合工具类的必要性

数组:长度固定       存放任意类型

集合:长度不固定   不能存放基本数据类型,只能存放对象的引用

注意:如果集合中存放基本类型,一定要将其“装箱”成对应的“基本类型包装类”。

1.2 继承体系

 

 由以上两图我们可以看出java集合类有清晰的继承关系,有很多子接口和实现类。但是并不是所有子接口或实现类都是最常用的。

最常用的子接口和实现类:

  Collection-->List-->ArrayList类

  Collection-->List-->LinkedList类

  Collection-->Set-->HashSet类

  Collection-->Set-->SortedSet接口-->TreeSet类

  Map-->HashMap类

  Map-->SortedMap-->TreeMap类

2. Collection

2.1 方法

 

 2.2 使用

//创建集合
Collection c = new ArrayList();
System.out.println(c.isEmpty());
//基本类型先进行自动装箱,然后再向上转型
c.add(1);
System.out.println(c.isEmpty());
System.out.println(c.size());
c.add("xxx"):
System.out.println(c.size());

//转换为数组进行遍历
Object[] objects = c.toArray();
for(Object object:objects){
System.out.peintln(object);
}

//删除
c.remove("xxx");


//清空集合
c.clear();
System.out.println(c.isEmpty());
 

2.3 注意

boolean contains(Object o):判断是否包含某个元素

boolean remove(Object o):删除指定元素

这两个方法低层都会调用equals方法进行比较

比如:c.contains("abc");会用abc调用equals方法和集合中所有元素进行比较

所以,如果我们要存储的是自定义的类型,想要使用contain和remove就需要覆写equals方法

3. Iterator 

3.1 概述

1.COllection接口的iterator()和toArray()方法都用于获得集合中的所有元素,前者返回一个Iterator对象,后者返回一个包含集合中所有元素的数组

2.Iterator接口隐藏低层集合中的数据结构,提供遍历各种类型集合的统一接口

3.2 方法

 3.3 使用

//生成迭代器
Iterator it = c.iterator();
//迭代器一旦创建,集合中元素不能删除和添加,否则就需要重新生成迭代器
while(it.hasNext()){
Object object = it.next();
System.out.println(object);
//如果在使用迭代器的过程中,需要进行删除,必须使用迭代器的remove方法
//it.remove();
}
//迭代器遍历完成之后,想要再次遍历,只能重新生成
it = c.iterator():
while(it.hasNext()){
Object object = it.next();
System.out.println(object);
}

4. List

4.1 概述

List:有序可重复

    存入顺序和取出顺序是一致的

ArrayList :底层是数组,查询和更改效率极高,添加和删除效率低

LinkedList:底层是双向链表,查询效率低,添加删除效率较高

Vector:已经过时,底层也是数组,ArrayList是Vector的升级版

    Vector默认容量是10,扩大容量是2倍,线程安全,效率较低

    ArrayList默认容量是10,扩大容量是1.5倍,非线程安全,效率较高

4.2 ArrayList

底层是Object[] 数组,所以只能保存引用类型

但是由于基本类型会自动装箱为包装类类型,所以导致Object[] 数组什么也能放

ArrayList list = new ArrayList();

1. list.add(E e):将元素添加到列表的尾部

    list.add(11);

2. add(int index,E e):将元素添加到列表指定位置

    list.add(0,22);

3. ArrayList覆写了toString方法,所以打印结果不是内存地址,而是里面的数据[22,11]

    System.out.println(lista);

4. set(int index,E element):替换指定位置上的元素

    list.set(1,33);

5. get(int index):根据索引获取对应的元素

    list.get(1);

6. remove(int index):根据索引删除元素

    list.remove(1);

7.remove(Object object):删除指定元素,如果想根据元素值删除22,不能直接写22,这样直接       写写的是下标,应当手动把22封装到Interger类型中

list.remove(new Integer(22));

  

 4.3 LinkedList

 4.3.1 概述

LinkedList:底层是双向链表

    链表的节点有三个部分构成:1.添加的元素 2.下一个节点的引用 3.上一个节点的引用

    链表数据结构,在内存中存储也不是连续的,所以没有固定的下标,因此查询效率低

    因为内存空间不是连续的,只能找到下一个节点,因此添加和删除就变的容易了

4.3.2 基本使用

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值