JavaSE探赜索隐之乾坤袋(集合)
目录
- 集合的概念
- 集合API
- Collection接口
- List接口、实现类
- Set接口实现类
- Map接口
集合的概念
说道集合就得先谈谈数组。数组是同一类元素的有序集合,但数组有其局限性,那就是定义之后长度固定,且里面只能存一种类型的元素。我们在开发中经常会使用到长度可变的数据集合,数组不能满足要求,我们就需要长度能动态变化的容器来保存数据。这容器就是集合。
集合API
集合类位于java.util包中。是java数据结构的实现,由许多接口、抽象类、实现类构成。
Collection接口
collection接口定义了存取一组对象的方法,其子接口List、Set分别定义了对象的存储方式。
Set中的数据对象没有顺序,不可以重复。
List中的数据对象有顺序,可以重复。
Colletion接口中定义的共有的方法:
返回值类型 | 方法名 | 功能 |
---|---|---|
boolean | add(Object element) | 添加元素 |
boolean | addAll(Collection c) | 添加一个集合到调用集合后 |
boolean | remove(Object element) | 删除元素 |
boolean | removeAll(Collection c) | 删除集合中另一个集合的全部元素 |
void | clear() | 清空集合 |
int | size() | 集合的长度 |
boolean | isEmpty() | 集合是否为空 |
boolean | contains(Object element) | 判断元素是否是集合的子集 |
boolean | containsAll(Collecton c) | 判断真子集 |
boolean | retainAll(Collecton c) | 求交集 |
public class CollectionDeno {public static void main(String[] args) {Collection c = new ArrayList();ArrayList list = new ArrayList();list.add("tb");list.add("wph");//System.out.println(c.add("pdd"));//1.给集合添加元素。返回值:boolean,始终是true。c.add("tb");c.add("tm");//c.remove("tb");//从集合删除元素。返回值:boolean,集合中有该元素返回true,否则返回false。//System.out.println(list.removeAll(c));/*条件删除语句c.removeIf(new Predicate() {//实现抽象接口要用匿名内部类.@Overridepublic boolean test(Object o) {return o.equals("tm");//返回判断条件.}});*/System.out.println(c);// c.contains("tb");//判断集合中是否包含元素。返回值:boolean//System.out.println(c.containsAll(list));//判断该集合是否包含另外一个集合.//System.out.println(Arrays.toString(c.toArray()));//将集合转化成数组.//System.out.println(Arrays.asList(c.toArray()));//将数组转化成集合.//System.out.println(c.size());//集合长度.System.out.println(c);}}
List接口、实现类
List接口继承了Collection接口,有三个实现类ArrayList、LinkedList、Vector。
ArrayList底层是数组存储。
实现长度可变数组,遍历元素效率比较高。优点: 底层数据结构是数组,长度可变的,查询快,增删慢。
缺点: 线程不安全,效率高
package day2;
/*ArrayList底层是数组实现的.*/import java.util.ArrayList;public class ArrayListDemo extends ArrayList {public static void main(String[] args) {ArrayList list = new ArrayList();//无参构造方法,默认10行.ArrayList list1 = new ArrayList(15);//有参构造方法,指定初始容量.ArrayList list2 = new ArrayList(list1);//有参构造方法,里面可以将集合直接传进去,但是只能传collection(单列)接口下的.list.add("a");list.add("s");list.add("s");list.add("d");list.add("f");//装满之后,扩容为原来的1.5倍.在调用add时,会判断原来的集合长度是否够用,不够的话调用group()复制原来的集合并添加新的元素.;list.add(0,"s");//给指定位置添加元素.//System.out.println(list.get(2));//获取指定索引的元素.//System.out.println(list.indexOf("b"));//获取指定元素的索引.//System.out.println(list.lastIndexOf("s"));//获取最后一次出现的指定元素索引.list.remove(2);list.set(1,"n");list.sort(new StringC());//排序,括号中传入比较器.(比较器类的构造方法.)}}
LinkedList底层是链表。插入、删除效率比较高。
优点: 底层数据结构是链表(双向链表),查询慢,增删快。
缺点: 线程不安全,效率高package day2;import java.util.LinkedList; import java.util.List;public class LinkedListDemo {public static void main(String[] args) {LinkedList list = new LinkedList<>();list.add("a");list.add("a");list.add("a");list.add("a");list.add("a");//调用Linkalst()list.addFirst("b");list.addLast("c");//调用Linklast()System.out.println(list);list.get(2);//获取指定(索引)序号的元素.list.getFirst();list.getLast();list.lastIndexOf("a");//获取最后一次出现该元素的索引.list.remove("a");//删除首个3出现的该元素.如果不填,默认为第一个元素.list.set(2,"s");//修改第二个元素为s.System.out.println(list);List list1 = list.subList(3,4);//将集合中部分元素截取出来组成新的集合.(List)System.out.println(list1);} }
Vector底层是数组存储,添加同步锁,线程安全。
优点: 底层数据结构是数组,查询快,增删慢。
缺点: 添加同步锁, 线程安全,效率低//Vector里面的方法用synchronized修饰,是线程安全的. /*以add()方法为例演示Vector底层方法源码。 */ public synchronized boolean add(E e) {modCount++;ensureCapacityHelper(elementCount + 1);elementData[elementCount++] = e;return true;}
集合的迭代。
//方法一/*删除元素后集合长度发生变化。*//*for (int i = 0; i < list.size(); i++) {if(list.get(i).equals("a")){list.remove(i);i--;}}System.out.println(list);*///方法二/*不允许在循环时对集合中的元素进行操作。没有break会抛出异常ConcurrentModificationException.*/for (Object obj:list) {if(obj.equals("a")){list.remove(obj);//break;//允许删一次.将循环封装起来,不允许修改变量i.没有break会抛出异常ConcurrentModificationException.}//System.out.println(list);如果第一个元素为a,则后面全部跳过,所以该步骤无效。}System.out.println(list);//方法三/*Iterator 集合迭代器(内部类可以对外部的元素进行操作.)*/Iterator iterator = list.iterator();while (iterator.hasNext()){//检测集合中是否还有未迭代的元素.Object obj = iterator.next();System.out.println(obj);//iterator.remove();//只能使用迭代器中的删除方法.if (obj.equals("a")){iterator.remove();}}
Set接口实现类
(不允许有重复元素。)
hashSet
不是按照添加的元素进行排序的。
底层数据结构是hash表加链表。向hashset中添加元素时如何判定是否是重复元素? 【效率】首先会获得添加内容的hash值,再经过hash()计算出添加元素的hash值,判断原集合中是否存在。 【安全】当hash值相同时会调用equals()比较内容是否相等。
public class Student implements Comparable<Student> {private int num;private String name;private int age;public int getNum() {return num;}public void setNum(int num) {this.num = num;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Student(int num, String name, int age) {this.num = num;this.name = name;this.age = age;}/*当hash值出现重复时,会调用eauals方法,进行内容判断效率第,安全*/@Overridepublic boolean equals(Object o) {if (this == o) return true;if (!(o instanceof Student)) return false;Student student = (Student) o;return num == student.num &&age == student.age &&Objects.equals(name, student.name);}/*重写Object类中的hashCode(),来自己操作对象中包含的内容计算hash值效率高,会出现重复*/@Overridepublic int hashCode() {return Objects.hash(num, name, age);}@Overridepublic String toString() {return "Student{" +"num=" + num +", name='" + name + '\'' +", age=" + age +'}';}//以学号排序@Overridepublic int compareTo(Student o) {return this.num-o.num;}}
public static void main(String[] args) {//HashSet无序 不按照输入顺序 有自己特定的方法//public native int hashCode(); 会调用此方法HashSet<String> hs = new HashSet<>();hs.add("a");hs.add("a");hs.add("b");hs.add("呵呵");hs.add("嘻嘻");System.out.println(hs);HashSet<Student> h = new HashSet<>();Student s1 = new Student(101,"tom",2);Student s2 = new Student(101,"tom",26);Student s3 = new Student(102,"jim",23);Student s4 = new Student(103,"bom",14);h.add(s1);h.add(s2);h.add(s3);h.add(s4);System.out.println(h);}
TreeSet
TreeSet底层是二叉树。(红黑树是一种自平衡的二叉树。)
按照元素添加顺序进行排序。不可存储重复元素。
向TreeSet中添加元素时底层会调用compareTo()比较大小。因此存储的对象必须实现comparable接口。
public static void main(String [] args){TreeSet<String> t1 = new TreeSet();t1.add("l");t1.add("o");t1.add("v");t1.add("e");System.out.println(t1);TreeSet<Student> t2 = new TreeSer();Student s1 = new Student(001,"铁男",20);Student s2 = new Student(002,"陆伟",21);Student s3 = new Student(003."赵红兵",22);t2.add(s1);t2.add(s2);t2.add(s3);System.out.println(t2);}
Map接口
**双列存储,键值对。**键不能重复,值可以重复。如果键重复,后面的键会覆盖掉前面已经添加进去的键的值。
map中常用的方法:
V put(K key,V value)//添加键值对,返回value类型
V remove(Object key)//删除键值对
void clear()//删除所有键值对
boolean containsKey(Object key)//判断该集合中是否包含有此键的键值对。
boolean containsValue(Object value)
boolean isEmpty()
int size()
V get(Object key)//返回到指定键所映射的值,
Set<K> keySet()//返回此地图中包含的键的Set视图。
Collection<V> values()
Set<Map.Entry<K,V>> entrySet()
Map的实现类有三个:HashMap、TreeMap、HashTable。
Treemap是有序的HashMap、HashTable是无序的。
hashtable的方法时同步的,hashmap的方法是不同步的。因此前者线程安全,后者不安全。
hashmap效率更高,hashtable效率低。
hashtable不允许null值,hashmap允许null值。
public static void main(String []args){HashMap<Integer,String> map1 = new HashMap<Integer,String>();map.put(1,"Tom");map.put(2,"Bob");map.put(3,"Alan");System.out.println(map);HashMap<String,String> map2 = new HashMap<String,String>();map2.put("姓名:","五五开");map2.put("年龄:","26");map2.put("爱好:","给阿姨倒卡布奇诺。");System.out.println(map2);System.out.println(map2.remove("姓名"));//删除,返回布尔类型System.out.println(map2.get("年龄:"));//获取信息,返回value类型System.out.println(map2.containsKey("姓名:"));System.out.println(map2.contiansValue("26"));System.out.println(map2.size());System.out.println(map2.isEmpty());map2.clear();}
map集合的遍历
- 方式1:根据键找值
获取所有键的集合
遍历键的集合,获取到每一个键
根据键找值 - 方式2:根据键值对对象找键和值
获取所有键值对对象的集合
遍历键值对对象的集合,获取到每一个键值对对象
根据键值对对象找键和值
- 方式1:根据键找值
JavaSE探赜索隐之乾坤袋(集合)相关推荐
- 3.1_12 JavaSE入门 P11 【集合】单例 Collection集合
相关链接 Excel目录 目录 P11 [集合]单例 Collection集合 1 集合的概述 1.1 为什么会出现集合类 1.2 集合类体系结构图 2 Collection集合 2.1 Collec ...
- JavaSE各阶段练习题----集合-Collection-Set-List
1.分析以下需求,并用代码实现: (1)有如下代码: List<String> list = new ArrayList<>(); list.add("a" ...
- javaSE探赜索隐四<数组>
数组 一.概念 数组是相同数据类型元素的集合.(如果数组中存的是引用类型,则存的是对象的引用.) 数组是一种线性的数据结构. 二.声明方式 数据类型 [] 数组名(后面可以跟多个数组名定义多个数组.) ...
- javaSE探赜索隐六(常用类API)
常用类(API) 概述 java API 就是java应用程序编程接口.在我们程序员看来,API就是对java中预定义的类或者接口中的.属性.方法的功能进行说明的文档. Object Object类是 ...
- javaSE探赜索隐之三--<类与对象的爱恨情仇下>
封装 封装就是将类的某些信息隐藏在类的内部,不允许外部直接访问.而是通过该类提供的方法对隐藏的信息进行访问. public class Person {//隐藏类的信息,这样外部就不能访问privat ...
- javaSE探赜索隐之一<小生的第一篇CSDN博客,欢迎大家指正>
文章目录 java语言的应用 Java语言发展史 Java语言的特点 Java语言体系结构 Java语言的运行机制 Java运行环境 java语言的应用 web程序 安卓app 软件工具 大数据 传感 ...
- JavaSE 第七章集合 Collection
第七章集合Collection 7.1 Iterable 接口 首先是集合Collection的的爸爸,列表List的爷爷 Iterable接口. 实现此接口的类队形可以成为for-each循环的目标 ...
- JavaSE基础加强、集合案例 斗地主
import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.u ...
- JavaSE基础18笔记集合
18.01_集合框架(Map集合概述和特点) A:Map接口概述 查看API可以知道: 将键映射到值的对象 一个映射不能包含重复的键 每个键最多只能映射到一个值 B:Map接口和Collection接 ...
最新文章
- 电脑qq文件服务器地址,在电脑上接收QQ地理位置打不开,提示获取不到详细地址...
- Python D6 if分支结构
- 文件服务器和客户模式有什么区别,客户端和服务器端编程有什么区别?
- POJ - 3614 Sunscreen(贪心/二分图最大匹配-多重匹配/网络流-最大流)
- python代码覆盖率测试_利用coverage工具进行Python代码覆盖率测试
- Extjs 代码拾穗
- 两种常用的启动和关闭MySQL服务
- Faster RCNN 结构总结
- dart 爬取 妹子图 豆瓣影评
- 清华等7校联考时间确定 北大联盟增至13所
- 内存数据库及技术选型
- meo学习笔记5:C++中的类型转换概述
- 专享 IP 与共享 IP:差异、优势及其影响
- 关于python全局性解释锁(GIL)
- 中移互联网Java后台开发一二面
- 【愚公系列】2021年12月 网络工程-PKI
- 35岁程序员:从焦虑到适应
- hmi服务器在宽限期下运行,通过HMI/SCADA 系统(如 WinCC)中的 SNMP OPC服务器,使用 ActiveX控件监测SIMATIC NET系列的SNMP兼容设备...
- office 2010打开word文件提示以安全模式打开
- C语言数据类型、变量、常量、作用域和生命周期的概念解释和案例
热门文章
- Java 已知三边求三角形求面积
- Qt美化之基础控件美化
- Greenplum的系统表
- 【圈外同学】Day01 一个模型,帮你找到真正热爱的
- ACM,IEEE ,Elsevier和Springer旗下期刊
- xp计算机连接不上网络打印机驱动,解决win10无法连接到XP计算机共享打印机
- Threejs入门教程
- 如何打印菱形图案(C语言)
- 基于Problem Solving with Algorithms and Data Structures using Python的学习记录(4)——Recursion
- 病毒木马查杀实战第013篇:一个基于.NET的“敲竹杠”病毒研究