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不支持并发(即线程安全),导致的结果就是效率较低

Java基础之 集合体系结构(Collection、List、ArrayList、LinkedList、Vector)的更多相关文章

  1. java基础-对集合(Collection)的总结

    集合(Collection)类型也是Java标准库中被使用最多的类型. List ArrayList LinkedList 对于自定义的对象,需要正确覆写 equals方法 参看7.3 例子 Map ...

  2. JAVA基础整理-集合篇(一)

    集合作为JAVA的基础知识,本来感觉自己理解的很清楚了,但是在最近的一次面试中还是答得不尽如人意!再次做一下整理,以便加深理解以及随时查阅. 首先,java.util包中三个重要的接口及特点:List ...

  3. 第6节:Java基础 - 三大集合(上)

    第6节:Java基础 - 三大集合(上) 本小节是Java基础篇章的第四小节,主要介绍Java中的常用集合知识点,涉及到的内容包括Java中的三大集合的引出,以及HashMap,Hashtable和C ...

  4. java基础技术集合面试【笔记】

    java基础技术集合面试[笔记] Hashmap: 基于哈希表的 Map 接口的实现,此实现提供所有可选的映射操作,并允许使用 null 值和 null 键(除了不同步和允许使用 null 之外,Ha ...

  5. java基础-Map集合

    java基础-Map集合 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Map集合概述 我们通过查看Map接口描述,发现Map接口下的集合与Collection接口下的集合,它 ...

  6. Java中的集合框架-Collection(二)

    上一篇<Java中的集合框架-Collection(一)>把Java集合框架中的Collection与List及其常用实现类的功能大致记录了一下,本篇接着记录Collection的另一个子 ...

  7. 备战金三银四!一线互联网公司java岗面试题整理:Java基础+多线程+集合+JVM合集!

    前言 回首来看2020年,真的是印象中过的最快的一年了,真的是时间过的飞快,还没反应过来年就夸完了,相信大家也已经开始上班了!俗话说新年新气象,马上就要到了一年之中最重要的金三银四,之前一直有粉丝要求 ...

  8. ArrayList LinkedList Vector

    ArrayList是基于数组实现的,没有容量的限制. 在删除元素的时候,并不会减少数组的容量大小,可以调用ArrayList的trimeToSize()来缩小数组的容量. ArrayList, Lin ...

  9. ArrayList, LinkedList, Vector - dudu:史上最详解

    ArrayList, LinkedList, Vector - dudu:史上最详解 我们来比较一下ArrayList, LinkedLIst和Vector它们之间的区别.BZ的JDK版本是1.7.0 ...

随机推荐

  1. Troubleshooting ORA-01555/ORA-01628/ORA-30036 During Export and Import (Doc ID 1579437.1)

    Troubleshooting ORA-01555/ORA-01628/ORA-30036 During Export and Import (Doc ID 1579437.1) APPLIES TO ...

  2. 微软发布Visual Studio Online公共预览版和ML.NET 1.4

    在今天的Ignite 2019上,Microsoft启动了 Visual Studio Online 公共预览版.Visual Studio Online将Visual Studio,云托管的开发人员 ...

  3. RAID10(5块硬盘)的简介和创建

    一.        RAID10简介 (1)兼具速度和安全性,但成本很高. (2)继承了RAID0的快速与RAID1的安全,RAID1在这里提供了冗余备份的阵列,而RAID0则负责数据的读写阵列.因这 ...

  4. 在宿主机上执行docker容器内部的shell或程序

    为了避免反复进入docker容器内部操作,可以将一系列容器内部的指令由宿主机来操作完成. 在宿主机(作者主机为windows7)上执行centos容器(name为centos-1)中/usr目录下的“ ...

  5. JDOJ1100: Fix

    题目大意 给你n个点,其中一些点是固定的,然后还有一些没有固定的,然后问你固定所有点所用的线段的最小长度是多少. 所谓固定,就是形如三角形的情况,就是两个固定的点向一个未固定的点连两条边,就能把未固定 ...

  6. 天翼宽带家庭网关用户:useradmin,nE7jA%5m 这个是中国电信的超级密码

    天翼宽带家庭网关用户:useradmin,nE7jA%5m 这个是中国电信的超级密码

  7. 目标检测中的pooling操作

    1.SPPnet池化过程 假设这个feature map的尺寸是M*N*256,将这个feature map的每一个channel以4*4,2*2和1*1来划分格子,每个格子里面做max poolin ...

  8. day74_10_21 三大认证

    一.权限六表. 一般在django中,基于用户权限访问控制的认证是RBAC(Role-Based Access Control) 还有一些基于auth的认证规则. Django框架采用的是RBAC认证 ...

  9. jTopo介绍(一)

    jTopo(Javascript Topology library)是一款完全基于HTML5 Canvas的关系.拓扑图形化界面开发工具包.jTopo关注于数据的图形展示,它是面向开发人员的,需要进行 ...

  10. Nginx 负载均衡算法

    Nginx 负载均衡算法 1.轮询(默认) 每个请求按时间顺序逐一分配到不同的后端服务,如果后端某台服务器死机,自动剔除故障系统,使用户访问不受影响. upstream tomcat_server { ...