java集合框架学习笔记
思维导图
一、什么是集合
存放在java.util.*。是一个存放对象的容器。
- 存放的是对象的引用,不是对象本身
- 长度不固定
- 只能存放对象
二、collection接口
collection的使用
- 增加元素 add();
- 判断是否包含某个元素 contains();
- 删除某个元素 remove();
- 遍历元素(iterator迭代器)
package com.zheng.demo1;import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;public class MyCollection {public static void main(String[] args) {Collection c = new ArrayList();//增加元素c.add("足球");c.add("篮球球");c.add("乒乓球");//集合大小System.out.println("当前集合大小:" + c.size());//判断是否包含某个元素System.out.println(c.contains("足球"));//删除元素c.remove("足球");System.out.println("删除一个元素之后大小:" + c.size());System.out.println("===============");//打印,增强for循环for (Object obj : c) {System.out.println("增强for循环取值:"+obj);}System.out.println("==============");//迭代器形式Iterator it = c.iterator();while (it.hasNext()){//判断有无下一个元素Object obj=it.next();//取值System.out.println("iterator取值:"+obj);}}
}
Iterator:迭代器
- hasNext(); 查看是否有下一个元素。有为true,无为false
- next(); 取出下一个元素的值
- remove(); 删除当前元素
在JAVA中,所有的对象都有toString方法;方便打印
通过添加一个对象到collection集合中
实体类
package com.zheng.demo1;public class Student {private int id;private String name;private String address;public Student() {}public Student(int id, String name, String address) {this.id = id;this.name = name;this.address = address;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}@Overridepublic String toString() {return "Student{" +"id=" + id +", name='" + name + '\'' +", address='" + address + '\'' +'}';}
}
加入到集合
package com.zheng.demo1;import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;public class MyCollection1 {public static void main(String[] args) {//创建容器Collection<Student> students = new ArrayList<Student>();//创建对象Student student1 = new Student(1, "小明", "北京");Student student2 = new Student(2, "小红", "河南");Student student3 = new Student(3, "小黑", "深圳");Student student4 = new Student(4, "小蓝", "上海");//添加对象到容器中students.add(student1);students.add(student2);students.add(student3);students.add(student4);//查看System.out.println(students.toString());System.out.println("=========增强for循环输出=========");//增强for循环输出for (Student student : students) {System.out.println(student.toString());}System.out.println("=========迭代器输出=========");//迭代器输出Iterator<Student> iterator = students.iterator();while (iterator.hasNext()) {System.out.println(iterator.next());}}
}
三、List集合
特点
- 有序,打印输出的顺序和添加时的顺序一致(不会帮你自动排序)
- 有下标,可以通过下标的形式访问对象
- 元素可以重复
方法
- void add(int index,Object o) //在index位置插入元素
- boolean addAll(int index,Collection c) //将一个集合中的元素添加到次集合中的index位置
- Object get(int index) //返回集合中指定位置的元素
- List subList(int fromIndex,int toIndex) //返回二者之间的元素
package com.zheng.demo1;import java.util.ArrayList;
import java.util.ListIterator;public class MyList2 {public static void main(String[] args) {ArrayList list = new ArrayList();list.add(2);list.add(3);list.add(1);list.add(5);list.add(2);list.add(4);System.out.println("通过下标访问:" + list.get(0));ListIterator listIterator = list.listIterator();while (listIterator.hasNext()) {System.out.println(listIterator.next());}}
}
listIterator:迭代器
- hasNext(); 查看是否有下一个元素。有为true,无为false
- next(); 取出下一个元素的值
- hasPrevious();查看前一个元素是
- previous();取出前一个元素
- remove(); 删除当前元素
package com.zheng.demo1;import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;public class MyList {public static void main(String[] args) {//创建一个list集合容器List list = new ArrayList();//添加数据list.add("1-小红");list.add("2-小黑");list.add("3-小青");list.add("4-小紫");System.out.println("当前集合大小" + list.size());//一般的遍历System.out.println("=========一般的遍历=======");for (int i = 0; i < list.size(); i++) {System.out.println(list.get(i));}System.out.println("=========增强for循环遍历=======");//增强for循环遍历for (Object o : list) {System.out.println(o);}System.out.println("=========一般的迭代器遍历=======");//一般的迭代器遍历Iterator iterator = list.iterator();while (iterator.hasNext()) {System.out.println(iterator.next());}System.out.println("=========list迭代器从前到后遍历=======");//list特有的ListIterator listIterator = list.listIterator();while (listIterator.hasNext()) {String str = (String) listIterator.next();System.out.println(str);}System.out.println("=========list迭代器从后到前遍历=======");while (listIterator.hasPrevious()) {Object obj = listIterator.previous();System.out.println(obj);}}
}
List实现类
1、ArrayList【重点】
- 数据结构实现,查询快(数组是连续的存储地址)。增删慢(每增加或者删除都要移动大量的数据。末尾快一点)
- jdk1.2版本。运行效率高,线程不安全
2、Vector:
- 数组结构,查询快,增删慢
- jdk1.0版本,运行效率低,线程安全
3、LinkedList
- 链表结构实现,增删快(不连续的存储空间,只需要改变节点之间的指向)查询慢
package com.zheng.demo1;import java.util.LinkedList;
import java.util.ListIterator;public class MyLinkList {public void print(LinkedList<Student> students) {//迭代器遍历System.out.println("======迭代器遍历======");ListIterator<Student> studentListIterator = students.listIterator();while (studentListIterator.hasNext()) {Student student = studentListIterator.next();System.out.println(student);}}public static void main(String[] args) {MyLinkList myLinkList = new MyLinkList();//1、创建一个容器LinkedList<Student> students = new LinkedList<>();//2、创建对象Student student1 = new Student(1, "小黑", "周口");Student student2 = new Student(2, "小名", "沈丘");Student student3 = new Student(3, "小郑", "范营乡");Student student4 = new Student(4, "小芳", "666");//3、将对象加入集合students.add(student1);students.add(student2);students.add(student3);students.add(student4);//查看System.out.println(students.toString());//调用迭代器遍历myLinkList.print(students);//删除System.out.println("=====删除某个元素=====");students.remove(1);myLinkList.print(students);}
}
四、泛型
jdk1.5中引入的新特性。本质是参数化类型,把类型当做参数传递
- 泛型接口、泛型方法、泛型类
- <T,…> T为占位符,表示一种引用类型
- 优点:(1)、提高代码的复用。(2)、防止类型转换异常,提高代码的安全性
1、泛型类
- 泛型变量
- 泛型作为传递的参数
- 泛型作为方法的返回值
注意:
- 泛型只能使用引用类型
- 不同泛型类型对象之间不能相互赋值
package com.zheng.demo2;//泛型类
public class MyGeneric<T> {T t;//1、泛型变量//2、泛型作为传递的参数public void show(T t) {System.out.println(t);}//3、泛型作为方法的返回值public T getT() {return t;}
}
package com.zheng.demo2;public class TestMyGeneric {public static void main(String[] args) {//使用泛型类创建对象MyGeneric<String> sm = new MyGeneric<>();sm.t = "你好";sm.show("呦呦呦");System.out.println(sm.getT());System.out.println("=============");MyGeneric<Integer> im = new MyGeneric<>();im.t = 999;im.show(666);System.out.println(im.getT());}
}
2、泛型接口
package com.zheng.demo2;public interface MyInterface<T> {T show(T t);
}
实现类
package com.zheng.demo2;public class MyInterfaceImpl1 implements MyInterface<Integer>{@Overridepublic Integer show(Integer integer) {return integer;}public static void main(String[] args) {MyInterfaceImpl1 impl1 = new MyInterfaceImpl1();System.out.println(impl1.show(999));}}
2、
package com.zheng.demo2;public class MyInterfacetImpl implements MyInterface<String>{public String show(String s) {return s;}public static void main(String[] args) {MyInterface omf = new MyInterfacetImpl();System.out.println(omf.show("hhhhhh"));}
}
3、
package com.zheng.demo2;public class MyInterfaceImpl2<T> implements MyInterface<T> {@Overridepublic T show(T t) {return t;}public static void main(String[] args) {MyInterfaceImpl2<String> impl2 = new MyInterfaceImpl2<>();System.out.println(impl2.show("daoajao"));System.out.println("============");MyInterfaceImpl2<Double> impl21 = new MyInterfaceImpl2<>();System.out.println(impl21.show(520.1313));}
}
3、泛型方法
package com.zheng.demo2;public class MyGenericMethod {//泛型方法public <T> T show(T t) {System.out.println("泛型方法" + t);return t;}public static void main(String[] args) {System.out.println(new MyGenericMethod().show(5));System.out.println("=============");System.out.println(new MyGenericMethod().show("哈哈哈哈"));}
}
四、set集合
无序、无下标、元素不可重复
1、hashSet【重点】
- 数组+链表+红黑树
- 基于hashcode计算元素存储位置
- 当哈希吗一样的时候,调用equals,如果为true,拒接存入
package com.zheng.demo3;import java.util.HashSet;
import java.util.Iterator;public class MySet {public static void main(String[] args) {//创建集合框架HashSet<String> set = new HashSet<>();//添加数据set.add("1-小红");set.add("2-小明");set.add("3-小白");set.add("4-小黑");set.add("5-小红");set.add("1-小红");//迭代器迭代集合元素 遍历Iterator<String> iterator = set.iterator();while (iterator.hasNext()) {System.out.println(iterator.next());}}
}
实体类
package com.zheng.demo3;public class School {private int id;private String name;public School() {}public School(int id, String name) {this.id = id;this.name = name;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic String toString() {return "School{" +"id=" + id +", name='" + name + '\'' +'}';}
}
package com.zheng.demo3;import java.util.HashSet;
import java.util.Iterator;public class TestSet {public static void main(String[] args) {//1、创建集合容器HashSet<School> schools = new HashSet<>();//创建对象School school1 = new School(1, "清华大学");School school2 = new School(2, "北京大学");School school3 = new School(3, "浙江大学");//3、放入集合schools.add(school1);schools.add(school2);schools.add(school3);schools.add(new School(2,"北京大学"));//4、遍历Iterator<School> iterator = schools.iterator();while (iterator.hasNext()){School school=iterator.next();System.out.println(school);}}
}
2、TreeSet
- 存储结构:红黑树
- 要实现comparable接口,重写里边的方法,返回0代表元素重复
- 元素不重复
- 元素自动排序
package com.zheng.demo3;import java.util.Iterator;
import java.util.TreeSet;public class MyTree {public static void main(String[] args) {//1、创建一个集合TreeSet treeSet = new TreeSet();//2、加入元素treeSet.add(1);treeSet.add(3);treeSet.add(2);treeSet.add(4);treeSet.add(3);//3、迭代遍历Iterator iterator = treeSet.iterator();while (iterator.hasNext()) {int i = (int) iterator.next();System.out.println(i);}}
}
TreeSet案例:排列字符串的顺序
package com.zheng.demo3;import java.util.Comparator;
import java.util.Iterator;
import java.util.TreeSet;public class MyTreeSet {public static void main(String[] args) {//匿名内部类TreeSet<String> set = new TreeSet<>(new Comparator<String>() {@Overridepublic int compare(String o1, String o2) {int n1 = o1.length() - o2.length();int n2 = o1.compareTo(o2);return n1 == 0 ? n2 : n1;}});set.add("he");set.add("hhhhh");set.add("jdjdjkdkk");set.add("djdj");Iterator<String> iterator = set.iterator();while (iterator.hasNext()) {System.out.println(iterator.next());}}
}
comparator:定制比较器
五、Map集合【重要】
特点:
- 用于存储任意键值对(k-v)
- key不能重复,唯一。无序、无下标
- value可以重复。无序、无下标
1、hashMap
- 存储结构:哈希表(数组+链表+红黑树)
方法: - put(k,v);存入
- get(k);取值
- containsKey();判断是否包含key
- containsValue();判断 是否包含value
- entrySet();返回映射关系中包含的映射视图
- keySet();返回映射关系中包含的键的映射视图
package com.zheng.demo4;import javax.lang.model.element.NestingKind;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;public class MyMap {public static void main(String[] args) {//1、创建集合Map<String, String> map = new HashMap<>();//2、塞入值map.put("A", "我是A");map.put("B", "我是B");map.put("C", "我是C");map.put("D", "我是D");//判断System.out.println(map.containsKey("A"));System.out.println(map.containsValue("我是C"));System.out.println("map集合大小:" + map.size());System.out.println("打印:" + map.toString());//遍历1、使用keysetSystem.out.println("=======使用keyset=======");Set<String> set = map.keySet();for (String s : set) {System.out.println(s + "=======" + map.get(s));}System.out.println("=======使用entryset=======");Set<Map.Entry<String, String>> entries = map.entrySet();for (Map.Entry<String, String> entry : entries) {System.out.println(entry.getKey() + "========" + entry.getValue());}//简化System.out.println("+===简化====+");for (Map.Entry<String, String> entry : map.entrySet()) {System.out.println(entry.getKey() + "========" + entry.getValue());}}
}
jdk1.8后当链表长度大于8,转化为红黑树存储
jdk1.8后,当链表长度小于6,转化为链表存储
map集合的实现类
- HashMap
jdk1.2版本,线程不安全,运行快;允许null为key或者value - Hashtable
jdk1.0版本,线程安全,运行慢,不允许null为key或者value - properties
Hashtable的子类,使用String作为key或者value.通常用于配置文件的读取
六、Collections工具类
package com.zheng.demo5;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class MyCollection {
public static void main(String[] args) {
List arrayList = new ArrayList();
arrayList.add(4);
arrayList.add(1);
arrayList.add(5);
arrayList.add(3);
arrayList.add(6);
arrayList.add(2);
System.out.println(arrayList.toString());System.out.println("调用排序工具类");//调用工具类排序Collections.sort(arrayList);System.out.println(arrayList.toString());}
}
总结
集合的概念
- 对象的容器,和数组相似,定义了多个对象进行操作的常用方法
List集合
- 有序、有下标、元素可以重复(ArrayList,LinkedList,Vector)
set集合:
- 无序、无下标、元素不可重复(HashSet,TreeSet)
Map集合
- 存储一对数据,无序,无下标,键不可重复,值可以重复(HashMap,HashTable,TreeMap)
Collections:
- 集合工具类,定义了除存取以外的集合常用方法
java集合框架学习笔记相关推荐
- Java日志框架学习笔记
Java日志框架学习笔记 文章目录 0 主流Java日志框架 1 log4j 1.1 理论知识 1.1.1 Loggers日志记录器 1.1.2 Appenders输出端 1.1.3 Layout日志 ...
- 集合框架学习笔记:Collection体系和Map体系、Collections工具类
集合框架 Java是面向对象编程,万事万物皆"对象",为了方便对"对象"进行操作,需要对"对象"进行存储,而Java集合就是存储" ...
- Java⽇志框架学习笔记
目录 1.⽇志概述 1.1 ⽇志是⽤来做什么的? 1.2 为什么要⽤到⽇志框架? 1.3 现有的⽇志框架有哪些? 1.4 ⽇志⻔⾯技术 2.logback 2.1 logback介绍 2.1.1 lo ...
- java集合的学习笔记
1 区别 1.1 数组 长度固定 可以存储基本类型和引用类型 1.2 集合 长度不固定 只能存储引用类型,存储基本类型则通过装箱操作,把基本类型装箱到引用类型保存到集合当中. 集合在java.util ...
- java集合-ArrayList学习笔记
集合和数组关系? 1) 集合是一种容器,可以存储多个数据. 2) 数组的长度是固定的,集合的长度是可变的. 3) 集合中存储的元素必须为引用类型数据,初始值为NULL Arra ...
- JavaSE中Map框架学习笔记
前言:最近几天都在生病,退烧之后身体虚弱.头疼.在床上躺了几天,什么事情都干不了.接下来这段时间,要好好加快进度才好. 前面用了三篇文章的篇幅学习了Collection框架的相关内容,而Map框架相对 ...
- JavaEE学习笔记-(2)java集合框架
JCF:java集合框架 Collection:单值类型集合 1.List 类型 底层实现 ArrayList(数组元素个数) 数组 LinkedList() 链表 Vector(数组元素个数,步长) ...
- java 集合框架、迭代器、比较器 学习笔记
java集合框架总览 接口.实现类.算法的定义 常见的集合接口 Set和List的区别 常见的集合实现类 java.util包中定义的实现类 集合算法的概念 Collection Algorithms ...
- Java集合框架笔记记录 --- 原创@余胜军 但有个人心得
Java集合框架课程安排 1.集合框架API知识 List/Set/Map集合 2.常见数据结构 数组/链表/队列/树 3.集合源码解读 List/Set/Map1.为什么需要学习Java中集合框架呢 ...
最新文章
- snmp Oid整理与运用
- redux-thunk的简单使用
- 转:pytorch版的bilstm+crf实现sequence label
- C语言:L1-031 到底是不是太胖了 (10分)(解题报告)
- LSI系新军搅局,PCIe固态盘混战?
- git菜单形式的_Idea:Git的常用菜单操作和常用命令
- web端业务数据管理平台+Axure运营数据管理平台+月度数据统计分析+年度排行榜数据统计页面分析+运营大数据统计管理后台+用户信息管理+Axure通用web端高保真交互业务数据管理平台
- 函数指针,函数指针数组,函数返回值为函数指针
- 计算机专业窗体的事件何时触发,高三计算机专业VB试题(六)1
- 我读“世界500强面试题”
- Java Web面试题及答案整理(2021年最新版,持续更新)
- 十大经典排序算法-堆排序算法详解
- 【翻译】如何编写 Git 提交消息
- 在GNU/Linux下将CD音乐转为mp3
- 课后习题7.11 医院内科有A,B,C,D,E,F,G共7位医生,每人在一周内要值一次夜班,排班的要求是: (1)A医生值班日比C医生晚1天; (2)D医生值班日比E医生晚2天; (3)B医生值班日比
- SpringBoot 重置 kafka 偏移量offset(kafka-0.10.1.0)
- 彩色复古装饰麻绳-----四色麻绳
- [Luogu4169] [Violet]天使玩偶/SJY摆棋子 [cdq分治/k-d tree]
- 如何选购阿里云服务器并快速入门(Windows版本)?
- 使用node nightly每夜编译版