黑马程序员-集合的概述-List

第一讲 集合的概述

1.      为什么会出现集合?

集合是一种存储对象的容器,在数组出现的情况下为什么还会有集合?因为集合不仅能够存储对象,而且它的长度可以变化,适合做变化的需求。

2.      集合与数组的区别

数组既可以存储基本数据类型也可以存储引用类型,而集合只能存储引用类型。但数组长度一旦声明不可变,集合长度却是可变的。

3.      集合的整体框架

 

 

 

第二讲 Collection

1. Collection概述

Collection是List和Set的根接口,List中的元素是可重复有序的,Set中的元素是不可重复无序的。

2. Collection集合的具体方法

2.1   添加功能

boolean add(Object obj):添加一个元素

boolean addAll(Collection c):添加一个集合元素

2.2   删除功能

boolean remove(Object obj):移除一个元素

boolean removeAll(Collection c):移除一个集合元素

void clear():移除所有元素

2.3   判断功能

boolean contains(Object obj):判断是否包含指定元素

boolean containsAll(Collection c):判断是否包含指定集合元素

boolean isEmpty():判断集合元素是否为空

2.4   交集功能

boolean retainAll(Collection c):注意若c1.retainAll(c2),则c1中保存的是交集的结果,返回值表示的是c1中的元素是否发生改变

2.5   长度功能

int size():获取集合元素个数

2.6   将集合转化为数组

Object[] toArray()

3. 迭代器

迭代器(Iterator)是专门用于对集合进行遍历的,Collection的每个子接口都有迭代器。

3.1   Iterator的使用方法

Iterator接口有两个方法,一般用这两个方法对于集合元素进行遍历

boolean hasNext():如果仍有元素可以迭代,则返回true

Object next():返回迭代的下一个元素。

注意:在集合遍历的时候,每一次迭代next()之前都需要判断集合中是否还有元素可以迭代hasNext().

具体的使用方法如下:

public class IteratorDemo {
	public static void main(String[] args) {
		// 创建集合对象
		Collection c = new ArrayList();

		c.add("hello");
		c.add("world");
		c.add("java");

		// Iterator iterator():迭代器,集合的专用遍历方式
		Iterator it = c.iterator(); // 实际返回的肯定是子类对象,这里是多态

		
		while (it.hasNext()) {
			// System.out.println(it.next());
			String s = (String) it.next();
			System.out.println(s);
		}
	}
}


3.2   迭代器的注意点

迭代器每使用一次next(),就会自动向下取一次元素,所以对于当前元素的操作要在下一次的next()之前操作完;

next()返回的是Object类型,需要进行类型转换

  

 

 

第三讲 List

1. List接口的概述

List接口的特点是可重复的元素,并且有序(有序是指进去的和出来的顺序是一样的,并不是比较大小)

2. List接口的特有方法

2.1  添加功能

void add(intindex,Object element):指定位置添加元素

2.2  获取功能

Object get(intindex):获取指定位置的元素

2.3  列表迭代器

ListIteratorlistIterator():

2.4  删除功能

Objectremove(int index):根据索引删除元素,返回被删除的元素

2.5  修改功能

Object set(intindex,Object element)根据索引修改元素,返回被修改的元素

3. ListIterator迭代器特有方法

void  add(Object obj):增加一个元素

void  set(Object obj):修改一个元素

boolean  hasPrevious():判断前面有没有元素

object previous():取前一个元素

4. List集合的遍历

结合size()和get()方法使用

public class ListDemo2 {
	public static void main(String[] args) {
		// 创建集合对象
		List list = new ArrayList();

		// 添加元素
		list.add("hello");
		list.add("world");
		list.add("java");

		// 最终的遍历方式就是:size()和get()
		for (int x = 0; x < list.size(); x++) {
			// System.out.println(list.get(x));

			String s = (String) list.get(x);
			System.out.println(s);
		}
	}
}

5. ListIteraator需要注意的问题

如题:有一个集合,里面有内容,向判断里面有没有“world”这个元素,如果有就添加一个“javaee”元素

刚开始我们一般这么做:

public class ListIteratorDemo2 {
	public static void main(String[] args) {
		// 创建List集合对象
		List list = new ArrayList();
		// 添加元素
		list.add("hello");
		list.add("world");
		list.add("java");

		// 迭代器遍历
		Iterator it = list.iterator();
		while (it.hasNext()) {
		String s = (String) it.next();
		if ("world".equals(s)) {
		list.add("javaee");
		}
	}
}

但是会报出这样一个异常:ConcurrentModificationException

这个异常是什么意思呢?并发修改异常,意思是当检测到对象的并发修改,但是不允许这种修改的时候报出的异常。

产生的原因:

迭代器是依赖于集合存在的,上面的程序中,在判断成功后,向集合中添加元素,但是迭代器此时在迭代,迭代器不知道集合的改变,所以报异常。

原则是:迭代器在迭代元素的时候,集合是不能修改元素的。

两种解决方法:

a:迭代器迭代元素并修改元素-----元素的添加是继续在刚才迭代过的元素之后

// 方式1:迭代器迭代元素,迭代器修改元素
		ListIterator lit = list.listIterator();
		while (lit.hasNext()) {
		String s = (String) lit.next();
		if ("world".equals(s)) {
		lit.add("javaee");
		}
	}


结果:

            hello

            world

            javaee

           java

b:集合遍历元素,集合修改元素-----元素在最后添加

// 方式2:集合遍历元素,集合修改元素(普通for)
		for (int x = 0; x < list.size(); x++) {
			String s = (String) list.get(x);
			if ("world".equals(s)) {
				list.add("javaee");
			}
		}


结果:

            hello

            world

            java

           javaee 

 

第四讲 List--ArrayList,Vector,LinkedList

1.      数据结构—栈,队列,链表的概述

1.1  栈

栈的概念就是:先进后出,举例:子弹夹





1.2  队列

队列的概念就是先进后出,举例:排队买票

 




1.3  链表



2.      LinkedList的特有方法

2.1  添加功能

Void addFirst(Object obj):在开头添加元素

Void addLast(Object obj):在末尾添加元素

2.2  获取功能

Object getFirst():获取第一个元素

Object getLast():获取最后一个元素

2.3  删除功能

Object removeFirst():删除第一个元素并且返回第一个元素

Object removeLast():删除最后一个元素并且返回最后一个元素

3.      例题:用LinkedList来实现栈结构


测试:

public class MyStackDemo {
	public static void main(String[] args) {
		// 创建集合对象
		MyStack ms = new MyStack();

		// 添加元素
		ms.add("hello");
		ms.add("world");
		ms.add("java");

		// System.out.println(ms.get());
		// System.out.println(ms.get());
		// System.out.println(ms.get());
		// NoSuchElementException
		// System.out.println(ms.get());
		
		while(!ms.isEmpty()){
			System.out.println(ms.get());
		}
	}
}

结果:


4.      Vector的特有方法

早期功能:

        void addElement(Objectobj):添加元素,相当于add()

       Object elementAt(int index):元素索引查找,相当于get(int index)

Vector特有的特有的迭代:

        Enumeration elements():相当于Iterator

        BooleanhasMoreElements():相当于hasNext()

        Object nextElement():相当于next() 

Enumeration en = v.elements(); // 返回的是实现类的对象
		while (en.hasMoreElements()) {
			String s = (String) en.nextElement();
			System.out.println(s);
		}


5. ArrayList,Vector,LinkedList的特点

5.1  ArrayList:

底层数据结构是数组,查询快,增删慢

线程不安全,效率高

5.2  Vector

底层数据结构是数组,查询快,增删慢

线程安全,效率低

5.3  LinkedList

底层数据结构是链表,查询慢,增删快

线程不安全,效率高

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值