浅谈java中的容器1

339 阅读4分钟

今天说一下java中的容器,说的不好还请指正,感谢.


我们学过数组都知道数组是相同数据类型的有序集合,可以在其中放置对象或基本类 型数据,说白了就是容器.但是数组的长度一旦确定就不可以再进行改变,因此有时候不够灵活,不能随着需求的变化而扩容.

因此在不能事先确定所要存储的数据有多少时,就不能使用数组.我们需要一种灵活地、容量可以随时扩容的容器来装在我们的数据.这就是今天要说的容器类,又名集合框架.

集合框架的简单的体系结构如下:

  • Collection 接口是一组允许重复的对象

    • Set 接口继承 Collection,无序不允许重复,使用自己内部的一个排列机制
    • List 接口继承 Collection,有序允许重复,以元素安插的次序来放置元素, 不会重新排列
  • Map 接口是一组成对的键值对象,即所持有的是 key-value pairs.Map 中不能有重复的 key.拥有自己的内部排列机制

  • 容器中可存放不同类型的数据,但元素类型都为引用类型,不能放置原生数据类型(使用装箱即可),使用泛型保留类型

1.Collection接口

Collection表示一组对象,这些对象也称为collection的元素,它是集中,收集的意思,就是把一些数据收集起来.

Collection接口的两个子接口:

  • Set中的数据没有顺序,不可重复
  • List中的数据有顺序,可重复

Collection中的一些方法如下图:

2.List接口

List接口位置有序允许元素重复

List中的方法多了一些关于位置(顺序)的方法,如下图所示:

3.ArrayList

ArrayList是List的子类,它与HashSet相反,允许存放重复元素,因此有序.

  • ArrayList的底层实现是由可变数组(通过一些方法)实现的,通过数组拷贝实现容器可以根据内容进行动态扩容;
  • ArrayList的优点是遍历和获取的效率高,因为我们可以根据索引直接定位到我们需要的元素;
  • ArrayList的缺点是增删的效率低;
  • 当ArrayList的容量不足以继续存放对象时,会自动的扩容,每次扩容原先容器大小的1.5倍;
  • ArrayList可以使用多态
  • 在单线程环境下,在大量做查询的业务下,适合使用ArrayList

4.为什么在定义一个容器时使用泛型

在JDK1.4之前类型不明确: 装入集合的类型都被当做Object对待,从而失去自己的实际类型.从集合中取出时往往需要转型,效率低,容易产生错误.

使用泛型之后可以增强程序的可读性和稳定性.

使用泛型,保留了容器中元素的类型,安全省心的使用容器.

5.迭代器与List集合遍历

1.迭代器

通常情况下,你会希望遍历一个集合中的元素.例如,显示集合中的每个元素.

一般遍历数组都是采用for循环或者增强for,这两个方法也可以用在集合框架,但是还有一种方法是采用迭代器遍历集合框架,它是一个对象,实现了Iterator 接口或ListIterator接口.

迭代器,使你能够通过循环来得到或删除集合的元素.ListIterator继承了Iterator,以允许双向遍历列表和修改元素.

使用迭代器时,要分三步走:

  1. 获取对象
  2. 判断是否存在下一个
  3. 获取元素

下面举例使用迭代器:

import java.util.*;

public class Test{
    public static void main(String[] args) {
        List<String> list=new ArrayList<String>();
        list.add("Hello");
        list.add("World");
        list.add("skr");
        //1.获取迭代去对象
        Iterator<String> ite=list.iterator();
        while(ite.hasNext())//2.判断下一个元素之后有值 {
            //3.内部移动位置,获取对应的元素
            String str=ite.next();
            System.out.println(str);
        }
    }
}

2. 列表迭代器

允许程序员按任一方向遍历列表、迭代期间修改列表,并获得迭代器在列表中的当前位置

ListIterator 没有当前元素;它的光标位置 始终位于调用previous()所返回的元素和调用 next() 所返回的元素之间

示例:

    public class ListDemo02 {
        public static void main(String[] args) {
	        List<String> list=new ArrayList();
	        list.add("钢铁侠");
	        list.add("美国队长");
        	list.add("黑寡妇");
        	list.add("灭霸");
        	list.add("蜘蛛侠");
        	list.add("雷神");
        	System.out.println(list);
        	ListIterator it=list.listIterator();
	        while(it.hasNext()){
	        	if("灭霸".equals(it.next())){
	    	    	it.add("惊奇队长");
	        	}
        	}
        	System.out.println(list);
    	}
    }

结果:

[钢铁侠, 美国队长, 黑寡妇, 灭霸, 蜘蛛侠, 雷神]
[钢铁侠, 美国队长, 黑寡妇, 灭霸, 惊奇队长, 蜘蛛侠, 雷神]

注意惊奇队长是在灭霸之后添加的.

3.List集合遍历

List集合遍历有四种方法:

  1. 普通for循环
  2. 增强for循环
  3. 迭代器
  4. 列表迭代器

6.LinkedList

LinkedList 是一种可以在任何位置进行高效地插入和删除操作的有序序列

  • LinkedList底层是由双向链表结构实现
  • LinkedList的优点做增删效率高
  • LinkedList的缺点做查询效率低
  • 同时新增了一些有关于链表头和链表尾部的方法,这就意味着不能在定义一个LinkedList的时候使用多态.