Java基础之 集合体系结构(Collection、List、ArrayList、LinkedList、Vector)
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)的更多相关文章
- java基础-对集合(Collection)的总结
集合(Collection)类型也是Java标准库中被使用最多的类型. List ArrayList LinkedList 对于自定义的对象,需要正确覆写 equals方法 参看7.3 例子 Map ...
- JAVA基础整理-集合篇(一)
集合作为JAVA的基础知识,本来感觉自己理解的很清楚了,但是在最近的一次面试中还是答得不尽如人意!再次做一下整理,以便加深理解以及随时查阅. 首先,java.util包中三个重要的接口及特点:List ...
- 第6节:Java基础 - 三大集合(上)
第6节:Java基础 - 三大集合(上) 本小节是Java基础篇章的第四小节,主要介绍Java中的常用集合知识点,涉及到的内容包括Java中的三大集合的引出,以及HashMap,Hashtable和C ...
- java基础技术集合面试【笔记】
java基础技术集合面试[笔记] Hashmap: 基于哈希表的 Map 接口的实现,此实现提供所有可选的映射操作,并允许使用 null 值和 null 键(除了不同步和允许使用 null 之外,Ha ...
- java基础-Map集合
java基础-Map集合 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Map集合概述 我们通过查看Map接口描述,发现Map接口下的集合与Collection接口下的集合,它 ...
- Java中的集合框架-Collection(二)
上一篇<Java中的集合框架-Collection(一)>把Java集合框架中的Collection与List及其常用实现类的功能大致记录了一下,本篇接着记录Collection的另一个子 ...
- 备战金三银四!一线互联网公司java岗面试题整理:Java基础+多线程+集合+JVM合集!
前言 回首来看2020年,真的是印象中过的最快的一年了,真的是时间过的飞快,还没反应过来年就夸完了,相信大家也已经开始上班了!俗话说新年新气象,马上就要到了一年之中最重要的金三银四,之前一直有粉丝要求 ...
- ArrayList LinkedList Vector
ArrayList是基于数组实现的,没有容量的限制. 在删除元素的时候,并不会减少数组的容量大小,可以调用ArrayList的trimeToSize()来缩小数组的容量. ArrayList, Lin ...
- ArrayList, LinkedList, Vector - dudu:史上最详解
ArrayList, LinkedList, Vector - dudu:史上最详解 我们来比较一下ArrayList, LinkedLIst和Vector它们之间的区别.BZ的JDK版本是1.7.0 ...
随机推荐
- Oracle有哪些诊断事件
作者:eygle | [转载请注出处]链接:https://www.eygle.com/archives/2004/12/oracle_diagnostics_events_list.html 经常有 ...
- 【mysql】pymysql.err.InterfaceError Interface Error: (0, '')
八成是丢失连接了 while 1: try: self.conn.ping(reconnect=True) self.cur.execute(sql,tuple(item.values())) sel ...
- Linux使用Samba实现文件共享
Samba服务是现在Linux系统与Windows系统之间共享文件的最佳选择. [root@study ~]# yum install samba -y #安装samba服务 [root@study ...
- 6.Java基础_Java自增自减/关系/逻辑/三元运算符
/* 自增自减运算符 关系运算符 逻辑运算符 三元运算符 (同C++) */ public class OperatorDemo01 { public static void main(String[ ...
- aiomysql
aiomysql: import aiomysql import asyncio async def aiomysql_test(): loop = asyncio.get_event_loop() ...
- 通过channel实现同步和数据交互
package main import ( "fmt" "time" ) func main(){ //创建channel ch := make(chan st ...
- Luogu P5022 旅行
开始写复赛题了 先放张图纪念我惨烈的卡常之路 不说了,简直悲伤 题目链接 思路么..不想写了 Code //不要在意四十行超级加速,卡常用的 #include<bits/stdc++.h> ...
- vue_03day
目录 作业: vue组件操作页面渲染: 组件渲染: 作业: vue组件操作页面渲染: 1.有以下广告数据(实际数据命名可以略做调整) ad_data = { tv: [ {img: 'img/tv/0 ...
- Nor Flash的理论性能
简介 为了评估Nor性能优化空间,我需要根据Spec计算出极限情况下,Nor Flash的性能理论值. 在全志的R**相关项目中分别支持ESMT.MXIC.Winbond.GD这4个厂家的Nor Fl ...
- (二十)golang--变量的作用域
(1)函数内部申明/定义的变量叫局部变量,作用域仅限于函数的内部: (2)函数外部申明/定义的变量叫全局变量,作用域在整个包都有效,如果其首字母为大写,则作用域是整个程序: (3)如果变量是在一个代码 ...