Java基础之 集合体系结构(Collection、List、ArrayList、LinkedList、Vector)

时间:2023-03-08 20:05:26

  Java基础之 集合体系结构详细笔记(Collection、List、ArrayList、LinkedList、Vector)

  集合是JavaSE的重要组成部分,其与数据结构的知识密切相联,集合体系就是对数据结构的封装

  数组与集合的比较

  数组:长度固定,可以存储基本数据类型,也能存储对象

  集合:长度可变,只能存储对象类型(由于有包装类的存在,集合可以存储任何类型)

  集合的体系结构

  集合也叫容器,用于存储对象

  我们根据不同的需求和不同的数据结构来对集合做了不同的抽象

  Collection接口-公共方法

  collection集合是所有集合类的老祖宗,我们将要学习它的公共属性,这些公共属性将被所有集合子类所继承,由于具体的实现需要用子类去继承collection接口,故我们使用arrayList类来实现

  创建集合对象并加入元素

  /*创建一个collection集合对象*/

  Collection coll = new ArrayList() ;

  ((ArrayList) coll).add("劳斯莱斯");

  ((ArrayList) coll).add("迈巴赫");

  /*创建一个collection集合对象*/

  Collection coll2 = new ArrayList() ;

  ((ArrayList) coll2).add("宝马");

  ((ArrayList) coll2).add("奔驰");

  理论上集合中的数据类型可以任意且不同的,但在工程中我们常通过泛型对集合中的泛型进行约束

  addAll

  集合中加入集合,以元素的形式并入被加集合

  ((ArrayList) coll2).addAll(coll) ;

  System.out.println(coll2);

  结果:[宝马, 奔驰, 劳斯莱斯, 迈巴赫]

  remove

  删除指定元素

  coll.remove("劳斯莱斯") ;

  System.out.println(coll);

  结果:[迈巴赫]

  removeAll

  删除集合中的集合

  coll2.removeAll(coll) ;

  System.out.println(coll2);

  结果:[宝马, 奔驰, 劳斯莱斯]

  contains

  是否包含某元素,返回boolean类型数据

  boolean iscontain = coll2.contains("宝马");

  System.out.println(iscontain);

  结果:true

  containsAll

  是否包含某集合,返回boolean类型数据

  iscontain = coll2.containsAll(coll) ;

  System.out.println(iscontain);

  结果:false

  isEmpty

  集合是否为空,返回boolean类型数据

  boolean isEmpty = coll.isEmpty() ;

  System.out.println(isEmpty);

  结果:false

  toArray

  集合转化为数组

  Object[] obj = coll2.toArray();

  System.out.println(obj);

  for(int i=0 ; i

  System.out.println(obj[i]);

  }

  结果:[Ljava.lang.Object;@a77106

  宝马

  奔驰

  劳斯莱斯

  集合的遍历

  强调:迭代器对象遍历是一次性的,如需多次遍历需创建多个迭代器对象

  /*获得迭代器对象,迭代器本质是个指针,一次性使用(一去不复返),迭代过程不允许增删改查(不支持并发)*/

  Iterator iterator = coll2.iterator();

  while (iterator.hasNext()){

  Object obj1 = iterator.next();

  System.out.println(obj1);

  }

  结果:

  宝马

  奔驰

  劳斯莱斯

  集合中加入对象

  以student对象为例子

  import java.util.ArrayList;

  import java.util.Collection;

  public class Student extends Person {

  private int sno;

  private String sname;

  public Student(int sno, String sname) {

  this.sno = sno;

  this.sname = sname;

  }

  private Collection books = new ArrayList() ;

  public Collection getBooks() {

  return books;

  }

  public void setBooks(Collection books) {

  this.books = books;

  }

  @Override

  public String toString() {

  return "Student{" +

  "sno=" + sno +

  ", name='" + sname + '\'' +

  ", books=" + books +

  '}';

  }

  }

  /*创建集合*/

  Collection coll3 = new ArrayList() ;

  /*创建学生对象*/

  Student student = new Student(101,"junsir") ;

  /*学生对象加入集合*/

  ((ArrayList) coll3).add(student);

  System.out.println(coll3);

  结果:[Student{sno=101, name='junsir', books=[]}]

  拓展(可直接跳过):

  /*创建学生对象*/

  Student student1 = new Student(102,"zhangsan") ;

  /*学生对象加入集合*/

  ((ArrayList) coll3).add(student1);

  /*获取该学生的books属性*/

  Collection books = student1.getBooks();

  /*对books集合进行加入操作*/

  books.add(new Books("长安十二时辰",101)) ;

  books.add(new Books("诡秘之主",102)) ;

  System.out.println(coll3);

  结果

  [Student{sno=101, name='junsir', books=[]}, Student{sno=102, name='zhangsan', books=[Books{name='长安十二时辰', bno=101}, Books{name='诡秘之主', bno=102}]}]

  可见,集合coll3中的第二个学生的books属性得到了更新,即我们通过get获取到的属性集合,在内存中与学生对象中的属性集合是一致的

  此拓展还包含了数据库中的一对多模型

  List(接口)

  List集合类是继承Collection,但其还是一个接口,需要一个子类来对其继承,我们还是选用ArrayList

  List集合底层是数组,有序,长度可变

  创建集合并添加元素

  /*创建集合并添加元素*/

  List list = new ArrayList() ;

  //集合末尾添加元素

  list.add("吴用");

  list.add("刘唐");

  list.add("宋江") ;

  /*创建集合并添加元素*/

  List list1 = new ArrayList() ;

  //集合末尾添加元素

  list1.add("阮小五");

  list1.add("阮小七");

  add(int index,Object element)

  在指定位置插入元素,元素下标机制与数组一致

  list.add(0,"晁盖");

  System.out.println(list);

  结果:[晁盖, 吴用, 刘唐, 宋江]

  addAll

  在指定集合中插入集合的元素,

  /*在list中添加list1*/

  list.addAll(list1) ;

  System.out.println(list);

  结果:[晁盖, 吴用, 刘唐, 宋江, 阮小五, 阮小七]

  get

  获得指定元素

  注意:不要越界

  Object obj = list.get(1) ;

  System.out.println(obj);

  结果:吴用

  size

  获得集合长度

  int i = list.size();

  System.out.println(i);

  结果:6

  listIterator正向遍历

  list集合的迭代器,一般用于遍历集合

  iterator遍历一般不支持并发操作,但其提供的add方法可以在遍历过程中进行其他操作

  ListIterator lIterator = list.listIterator() ;

  while (lIterator.hasNext()){

  Object obj1 = lIterator.next();

  if ("吴用".equals(obj1)){

  /*迭代器提供的add避免并发,但添加的元素不会被实时显示*/

  lIterator.add("白胜");

  }

  System.out.println(obj1);

  }

  System.out.println(list);

  结果:

  晁盖

  吴用

  刘唐

  宋江

  阮小五

  阮小七

  [晁盖, 吴用, 白胜, 刘唐, 宋江, 阮小五, 阮小七]

  listIterator反向遍历

  while (lIterator.hasPrevious()){

  Object obj1 = lIterator.previous();

  System.out.println(obj1);

  for循环遍历

  for(int k = 0 ; k

  Object obj1 = list.get(k);

  if ("吴用".equals(obj1)){

  lIterator.add("白胜1"); //被添加元素可以被实时显示

  }

  System.out.println(obj1);

  }

  indexof/lastIndexOf

  返回指定元素的正向遍历第一个位置/返回指定元素的反向遍历第一个位置

  System.out.println(list.indexOf("白胜1"));

  System.out.println(list.lastIndexOf("白胜1"));

  结果:7 7

  remove

  删除指定元素,返回元素位置

  或

  删除指定位置元素,返回Boolean

  System.out.println(list.remove(2)); //返回被删除元素,往后元素向前移动

  System.out.println(list.remove("晁盖")); //返回boolean,往后元素向前移动

  结果:白胜

  true郑州妇科在线医生 http://www.zzkdfk120.com/

  在list集合中,增删改操作性能较低,因为其底层是数组,牵一发而动全身,如果考虑性能能优先,list集合不是首先,后面会介绍更适合的集合

  removeAll

  删除集合中的指定集合元素

  list.removeAll(list1) ;

  System.out.println(list);

  结果

  [吴用, 刘唐, 宋江, 白胜1]

  clear

  清空集合元素

  list.clear();

  ArrayList

  实现了List的一个类,底层数组

  改进:

  数组长度动态可变

  允许存入null类型元素

  相比list,支持多并发(不是线程安全)

  多并发->高效率

  其方法与其接口list提供的方法基本一致

  List list = new ArrayList() ;

  list.add(null);

  list.add(null);

  list.add(null);

  list.set(2,"吴用") ; // 修改指定索引出的值

  System.out.println(list);

  LinkedList

  LinkedList底层是数据结构中的链表实现的

  特点:

  允许用作堆栈、队列(包括双端队列)

  允许包括null在内的所有元素

  支持并发(非线程安全)

  创建LinkedList集合并加入元素

  LinkedList list = new LinkedList();

  list.add("张三");

  list.add("王五");

  list.add("李四") ;

  System.out.println(list);

  掐头去尾

  list.removeFirst();

  list.removeLast();

  结果:

  [王五]

  压栈入栈

  System.out.println(list.pop());

  list.push("赵六");

  System.out.println(list);

  结果:

  王五

  [赵六]

  Vector

  Vector集合与AaaryList集合功能上是类似的,区别在于vector不支持并发(即线程安全),导致的结果就是效率较低

  持并发(非线程安全)

  创建LinkedList集合并加入元素

  LinkedList list = new LinkedList();

  list.add("张三");

  list.add("王五");

  list.add("李四") ;

  System.out.println(list);

  掐头去尾

  list.removeFirst();

  list.removeLast();

  结果:

  [王五]

  压栈入栈

  System.out.println(list.pop());

  list.push("赵六");

  System.out.println(list);

  结果:

  王五

  [赵六]

  Vector

  Vector集合与AaaryList集合功能上是类似的,区别在于vector不支持并发(即线程安全),导致的结果就是效率较低

相关文章