Java进阶学习第六天之集合

集合(Collection)

先上今天的思维导图

Java进阶学习第六天之集合_第1张图片

今天的主要学习内容是Collection接口、List接口的实现类ArrayList和LinkedList以及Set接口的实现类HashSet。

Collection是集合的接口,它只提供基本的抽象方法,定义集合的规则,主要如下:

        boolean add(E e)  :给集合添加元素

        boolean remove(Object o):在集合中删除元素

        boolean contains(Object o):判断集合是否包含o对象

contains方法底层所调用的其实是equals()方法判断集合中是否存在与o相同的元素,所以需要类对equals()方法进行重写,因为Object类中的equals()方法是对对象的地址值进行判断。

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

int size() :返回集合元素个数

        Object[] toArray() :将集合转换成数组(主要用于遍历集合)

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

       List接口和Set接口继承于Collection,其中List的特点是有序和有索引,因为List的元素都可以通过索引进行操作,所以更倾向于查询功能,而Set接口则相反,它的存入顺序与输出顺序可能会不一样,例如依次存入"a","b',"c",打印出来的集合可能是“a","c","b",而且Set接口没有提供索引的功能并且不允许有重复的元素存在,所以它更倾向于增删功能。

       ArratList是List接口的实现类(底层结构是数组,特点是查询易,增删难),除了重写了Collection的方法外,它还有属于自己的特性:

 void add(int index, E element) :将指定的元素插入此列表中的指定位置。 

 E set(int index, E element) :用指定的元素替代此列表中指定位置上的元素。

 E get(int index)  :返回指定索引位置的元素

int indexOf(Object o) :返回首次出现指定元素o的索引

 E remove(int index) :移除此列表中指定位置上的元素

可以看到ArrayList新增的特性都是与索引相关,所以说ArrayList提供的方法更有利于查询集合中的元素。

LinkedList也是List的实现类(底层结构是链表,特点是查询难,增删易),它的特性:

void addFirst(E e)   添加元素到第一个位置
void addLast(E e):添加元素到最后一个位置
E getFirst() :获取第一个元素
E getLast() :获取最后一个元素
E removeFirst():删除第一个元素

E removeLast():删除最后一个元素

LinkedList添加的方法主要是对集合的开头和结尾提供了get、add、remove方法。


集合的一大重要特性就是遍历,对继承List接口的实现类有4中遍历方法:

(1)用List的toArray()方法将集合转换成数组,对数组进行遍历

Collection c = new ArrayList<>();//多态的写法,父类的引用指向子类的对象  
		Object[] objects = c.toArray();//将集合对象转成数组
		for (int i = 0; i < objects.length; i++) {
			System.out.println(objects[i]);
		}
(2)用iterator()方法生成迭代器

迭代器Iterator是一个接口,如果要生成Iterator的引用,需要调用iterator()方法生成子类对象,在调用方法:

boolean hasNext() 
          如果仍有元素可以迭代,则返回 true。 
 E next() 
          返回迭代的下一个元素 

其中通过hasNext()方法判断集合中是否还有元素,如果有则继续向下判断,next()方法则是返回下一个元素。

while(iterator.hasNext()){
   E e =  iterator.next();
}

       说到迭代生成器这里还要强调一个异常叫并发修改异常(ConcurrentModificationException),原因是在迭代器对集合进行操作的过程中,集合对象同时对集合进行了修改操作,这个时候就会出现异常。

Collection c = new ArrayList<>();//多态的写法,父类的引用指向子类的对象  
		c.add("who");
		c.add("are");
		c.add("you");
		
		Iterator it = c.iterator();  //通过集合对象获取迭代器对象
		while(it.hasNext()) {//迭代器的hasNext方法  判断是否有下一个元素
			String next = (String) it.next();//迭代器对象的next方法,取出下一个元素
			if(next.equals("you")) {
				//ConcurrentModificationException 并发修改异常
				//如果在用迭代器遍历集合的过程中,使用了集合对象添加数据,就会导致并发修改异常错误
				c.add("she");  
			}
		}

那么怎么规避这种异常呢?

//Collection c = new ArrayList<>();//多态的写法,父类的引用指向子类的对象  
		List c = new ArrayList<>(); //listIterator() 方法 只有在List类中才会有,因此需要修改类型
		c.add("who");
		c.add("are");
		c.add("you");
		
		//Iterator it = c.iterator();  //通过集合对象获取迭代器对象
		
		ListIterator it = c.listIterator();//获得加强版迭代器对象(有了add() 添加元素的方法  )
		
		while(it.hasNext()) {//迭代器的hasNext方法  判断是否有下一个元素
			String next = (String) it.next();//迭代器对象的next方法,取出下一个元素
			if(next.equals("you")) {
				//ConcurrentModificationException 并发修改异常
				//如果在用迭代器遍历集合的过程中,使用了集合对象添加数据,就会导致并发修改异常错误
				//c.add("she");  c现在是集合对象, 不能使用集合对象!!
				
				//用加强版迭代器对象,添加元素
				it.add("she");
			}
		}

ListIterator接口提供了对集合进行增加、删除、更改的方法

 void remove() 
          从列表中移除由 next 或 previous 返回的最后一个元素(可选操作)。 
 void set(E e) 
          用指定元素替换 next 或 previous 返回的最后一个元素(可选操作)。 
 void add(E e) 
          将指定的元素插入列表(可选操作)。

(3)使用for直接对集合进行遍历(特点是 通过get(int Index)索引获取元素,只用于List的实现类)

List c = new ArrayList();
			c.add("how");
			c.add("old");
			c.add("are");
			c.add("you");
			for(int i=0;i

(4)增强for循环(底层是迭代器,所以也不能在遍历的时候用集合对象对集合数据进行修改)

格式:for(数据类型 数据变量 :集合对象){

}

List c = new ArrayList();
			c.add("how");
			c.add("old");
			c.add("are");
			c.add("you");
			for(String s  : c) {
				System.out.println(s);
			}

你可能感兴趣的:(小白)