java(16)List集合以及子类

一、List集合

List集合是Collection的子类

1、List集合的特点

  • 元素存入顺序和底层存储的顺序一致
  • 元素可重复
  • 有索引

2、List集合常用方法

      凡是可以操作角标的方法 都是该集合特有的方法

  • add(index,element)           在指定的位置添加元素,角标从0开始
  • addAll(index,Collection)     
  • remove(index)            删除的底层也是equals()方法
  • set(int index, E element)   修改指定位置的元素,角标从0开始
  • get(int index)            获取指定位置的元素
  • subList(int fromIndex, int toIndex)     从老的集合中获取从fromIndex(包括)到toIndex(不包括)的元素,存入一个新的集合

扩展:创建List集合,存储Student对象,并对其进行排重处理


import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class StudentDemo {

	public static void main(String[] args) {
		//名字和年龄相同,则为同一个人
		List list=new ArrayList();
		list.add(new Student("唐僧",23));
		list.add(new Student("猪八戒",26));
		list.add(new Student("唐僧",23));
		Iterator it=list.iterator();
		
		List s=new ArrayList();
	    while(it.hasNext()){
	    	Object str=it.next();//将Object强制转成String
	    	if(!s.contains(str)){ 
	    		/*contains底层依托 的是equals()方法,
	    		Object的equals(),比较的是地址值,故需要重写equals()方法*/
	    		s.add(str);
	    	}
	    	
	    	}
	    System.out.println(s);
	}

}
class Student{
	private String name;
	private int age;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public Student() {
		super();
		// TODO Auto-generated constructor stub
	}
	public Student(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	@Override
	public String toString() {
		return "Student [name=" + name + ", age=" + age + "]";
	}
	public boolean equals(Object obj){
		if(obj instanceof Student){
	      Student s=(Student)obj;
	      return this.name .equals(s.name)&&this.age==s.age;
		}
			return false;
	}
}

二、ArrayList集合(1.2版本)

1、ArrayList集合 底层是数组,长度可变的数组,

默认长度是10,超过后,就会创建一个新的数组,50%延长

将原来的数据拷贝过来,再加入新的元素

特点:查找和修改快,增删比较慢

注意事项:

       Collection集合的

  •              remove方法 判断是否删除 底层依赖于equals方法
  •              contain方法 判断是否包含 底层依赖于equals方法

三、LinkedList集合

1、LinkedList集合,底层是双向链表

特点: 查找和修改慢,增删比较快

特有功能:(和头尾相关的方法)

  •                addFirst(Element) 将指定元素插入到此列表的开头
  •                 addLast(Element) 将指定元素插入到此列表的结尾
  •                 getFirst() 返回此列表的第一个元素
  •                 getLast() 返回此列表的最后一个元素
  •                 removeFirst() 删除并返回此列表的第一个元素 
  •                 removeLast() 删除并返回此列表的最后一个元素

版本升级1.6开始的

  •             getFirst() 变成了 peakFirst()
  •             removeFirst() 变成了 pollFirst()

******************************************************************************************************************************************

ArrayList和LinkedList的使用场景?

1、添加数据方面 LinkedList比ArrayList快

2、ArrayList是一个长度可变的数组,插入数据时,需要先将原始数据复制到新的数组中,然后再去插入新的数据

3、LinkedList  是双向链表,当数据插入到链表中的某个位置时,将链表中要插入位置前后的链表指向进行改变

**********************************************************************************************************************************************

四、Vector集合(1.0版本)

Vector集合底层数组

Vector 和ArrayList的使用方式一样

但是Vector的遍历方式和ArrayList不同

遍历方式

    Enumeration<E> elements() 枚举遍历,只能是Vector 使用,高版本的ArrayList不能使用

import java.util.Enumeration;
import java.util.Vector;

public class Demo {

	public static void main(String[] args) {
Vector v=new Vector();
       v.addElement("K");
       v.addElement("N");
       v.addElement("C");
       Enumeration vv=v.elements();
       while(vv.hasMoreElements()){
    	   System.out.println(vv.nextElement());
    	   
       }
}
}

多线程并发访问的前提下
                Vector 线程安全 效率低
                ArrayList 线程不安全 效率高

五、List集合特有的迭代器:ListIterator迭代器

import java.util.*;
public class ListDemo {
	public static void main(String[] args) {
	List list=new ArrayList();
	list.add("a");
	list.add("d");
	list.add("g");
	list.add("c");
	list.add("a");
    ListIterator li=list.listIterator();
    while(li.hasNext()){
    	System.out.print(li.next()+" "); // 从前往后遍历
    }
    System.out.println();
    while(li.hasPrevious()){    //从后向前遍历,但必须先从前往后,否则指针获取不到数据
    	System.out.print(li.previous()+" ");
    }
	}

}

注意:指针 先向后移动 再移动回来 单独写previous 获取不到数据 必须 先将指针向后移动 才能向前移动

猜你喜欢

转载自blog.csdn.net/weixin_42496678/article/details/81542673