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. Oracle有哪些诊断事件

    作者:eygle | [转载请注出处]链接:https://www.eygle.com/archives/2004/12/oracle_diagnostics_events_list.html 经常有 ...

  2. 【mysql】pymysql.err.InterfaceError Interface Error: (0, '')

    八成是丢失连接了 while 1: try: self.conn.ping(reconnect=True) self.cur.execute(sql,tuple(item.values())) sel ...

  3. Linux使用Samba实现文件共享

    Samba服务是现在Linux系统与Windows系统之间共享文件的最佳选择. [root@study ~]# yum install samba -y #安装samba服务 [root@study ...

  4. 6.Java基础_Java自增自减/关系/逻辑/三元运算符

    /* 自增自减运算符 关系运算符 逻辑运算符 三元运算符 (同C++) */ public class OperatorDemo01 { public static void main(String[ ...

  5. aiomysql

    aiomysql: import aiomysql import asyncio async def aiomysql_test(): loop = asyncio.get_event_loop() ...

  6. 通过channel实现同步和数据交互

    package main import ( "fmt" "time" ) func main(){ //创建channel ch := make(chan st ...

  7. Luogu P5022 旅行

    开始写复赛题了 先放张图纪念我惨烈的卡常之路 不说了,简直悲伤 题目链接 思路么..不想写了 Code //不要在意四十行超级加速,卡常用的 #include<bits/stdc++.h> ...

  8. vue_03day

    目录 作业: vue组件操作页面渲染: 组件渲染: 作业: vue组件操作页面渲染: 1.有以下广告数据(实际数据命名可以略做调整) ad_data = { tv: [ {img: 'img/tv/0 ...

  9. Nor Flash的理论性能

    简介 为了评估Nor性能优化空间,我需要根据Spec计算出极限情况下,Nor Flash的性能理论值. 在全志的R**相关项目中分别支持ESMT.MXIC.Winbond.GD这4个厂家的Nor Fl ...

  10. (二十)golang--变量的作用域

    (1)函数内部申明/定义的变量叫局部变量,作用域仅限于函数的内部: (2)函数外部申明/定义的变量叫全局变量,作用域在整个包都有效,如果其首字母为大写,则作用域是整个程序: (3)如果变量是在一个代码 ...