【Java编程思想笔记】-集合2
详细的接口API转自博客:https://blog.csdn.net/jyg0723/article/details/80498840#collection-api-%E8%AF%A6%E8%A7%A3
集合详解转自博客:https://www.cnblogs.com/ysocean/p/6555373.html
三大接口:Iterator , Collection , Map
1.Collection接口:
Collection是 Set、 List、 Queue和 Deque(Queue: 先进先出队列 Deque: 双向链表)的接口。
基本方法:
boolean add(E e) 添加新元素,但不能添加集合中已有的元素 ,这是考虑到Set中不能有重复的元素。
boolean addAll(Collection<? extends E> c) , 添加某一集合的所有元素到该集合中。 (如果添加的集合中有和本集合重复的元素怎么办?)
boolean contains(Object o) 如果集合中包含指定元素那么返回true。特别的,如果集合中也包含NULL元素的时候并且要查找的元素也是NULL的时候也返回true。
boolean containsAll() , boolean isEmpty() , void clear() 等等
1.1 List接口
List接口在Collection的基础上添加了一些方法,重写了一些列函数,使得可以在List的中间插入和移除元素。
和Set集合不同的地方是:有序,允许重复元素
List的常见实现类:
(1)ArrayList:
List<E> alist = new ArrayList<>();
底层数据结构是数组,查询快,增删慢;线程不安全,效率高
它善于随机访问元素,但是在List的中间插入和移除元素时较慢。
(2)LinkedList:
List<E> llist = new LinkedList<>();
底层数据结构是链表,查询慢,增删快;线程不安全,效率高
它通过代价较低地在List中间进行插入和删除工作,提供了优化的顺序访问。LinkedList在随机访问方面相对比较慢,但是它的特性集较ArrayList更大。
(3)Vector:
List<E> vlist = new Vector<>();
底层数据结构是数组,查询快,增删慢;线程安全,效率低,几乎已经淘汰了这个集合
1.2 Set接口
Set与List不同点:无序(不是普通意义上的无序,具体可以看顶部的博客),不允许重复元素
Set不保存重复的元素,Set中最常被使用的是测试归属性,你可以很容易地询问某个对象是否在某个Set中。正因为如此,查找成为了Set中最重要的操作,因此通常会选择一个HashSet的实现,它专门对快速查找进行了优化。
Set具有与Collection完全一样的接口,因此没有额外功能。实际上Set就是Collection,只是行为不同(继承与多态的表现)。
Set的实现类:
(1)HashSet:底层数据结构是哈希表(是一个元素为链表的数组) 。
它是Set的典型实现,不能保证元素的顺序,不可重复,不是线程安全的,集合元素可以为NULL
(2)TreeSet:底层数据结构是红黑树(是一个自平衡的二叉树)。保证元素的排序方式 ,不可重复,善于范围查询
(3) LinkedHashSet:底层数据结构由哈希表和链表组成。不可以重复,有序
因为底层采用 链表 和 哈希表的算法。链表保证元素的添加顺序,哈希表保证元素的唯一性
public void setrun(){
//HashSet中的数据不按添加顺序存储
HashSet<Integer> hset =new HashSet<>();
hset.add(88);
hset.add(8);
hset.add(888); System.out.println(hset); //LinkedHashSet中的数据按照添加顺序存储
LinkedHashSet<Integer> lhset = new LinkedHashSet<>();
lhset.add(88);
lhset.add(8);
lhset.add(888); System.out.println(lhset); //TreeSet中的数据会进行排序
TreeSet<Integer> tset = new TreeSet<>();
tset.add(88);
tset.add(8);
tset.add(888); System.out.println(tset);
}
2.Map:key-value 的键值对,key 不允许重复,value 可以
1、严格来说 Map 并不是一个集合,而是两个集合之间 的映射关系。
2、我们可以把两个集合之间成映射关系的一对数据,看成是一条数据。即 Entry(key,value)。Map 可以看成是由多个 Entry 组成。
3、因为 Map 集合即没有实现 Collection 接口,也没有实现 Iterable 接口,所以不能对 Map 集合进行 for-each 遍历
4、Map的通用实现类有:HashMap,HashTable,LinkedHashMap,TreeMap,WeakHashMap等等(这里主要实现HashMap)
public void HashMaprun(){
HashMap<Integer,String> hmap = new HashMap<>(); //添加元素到HashMap中
for (int i = 0; i < 10; i++) {
hmap.put(i,"String"+i);
}
System.out.println(hmap); //通过key值删除元素
String str = hmap.remove(3);
System.out.println(str); //通过key值获取元素
str = hmap.get(5);
System.out.println(str); //通过添加已有的key来修改该key中的value
hmap.put(2,"测试2");
str = hmap.get(2);
System.out.println(str); //通过keySet()方法得到key的集合,然后遍历keySet来遍历Value的集合
Set<Integer> keyset = hmap.keySet();
for(Integer i:keyset){
String temp = hmap.get(i);
System.out.print(temp+" -- ");
} System.out.println(""); //通过entrySet()得到Map的Entry集合,然后遍历
Set<Map.Entry<Integer,String>> entries = hmap.entrySet();
for(Map.Entry<Integer,String> entry:entries){
Integer key = entry.getKey();
String value = entry.getValue();
System.out.println(key+"<===>"+value);
}
}
2.1 HashMap: 采用哈希表算法,此时Map中的key不会保证添加的先后顺序,key也不允许重复
key判断重复的标准是:key1和key2是否equals为true,并且hashCode相等
2.2 TreeMap:采用红黑树算法,此时Map中的key会按照自然顺序或定制顺序进行排序,key也不允许重复
key判断重复的标准是:compareTo/compare的返回值是否为0
2.3 LinkedHashMap:采用链表和哈希表算法,此时Map中的Key会保证先后添加的顺序,key不允许重复
key判断重复的标准和HashMap相同
2.4HashTable: 采用哈希表算法,是HashMap的前身
在java的集合框架之前,表示映射关系就用HashTable
所有的方法都是用synchronized修饰符,线程安全,但是性能比HashMap第
2.5 Properties: Hashtable的子类,此时要求key和value都是String类型
用来加载资源文件(I/O)
注意:Map和Set集合有很大程度上的相似,都有使用哈希表和红黑树实现的子类
实际上,Set集合就是由Map集合的key组成的。
【Java编程思想笔记】-集合2的更多相关文章
- java编程思想笔记(1)
java编程思想笔记(1) 一,对象的创建和生命周期 对象的数据位于何处?怎样控制对象的生命周期? 在堆(heap)的内存池中动态地创建对象. java完全采用了动态内存分配方式. 二,垃圾回收器 自 ...
- Java编程思想 笔记
date: 2019-09-06 15:10:00 updated: 2019-09-24 08:30:00 Java编程思想 笔记 1. 四类访问权限修饰词 \ 类内部 本包 子类 其他包 publ ...
- #Java编程思想笔记(一)——static
Java编程思想笔记(一)--static 看<Java编程思想>已经有一段时间了,一直以来都把笔记做在印象笔记上,今天开始写博客来记录. 第一篇笔记来写static关键字. static ...
- 2.1(java编程思想笔记)位移操作
java位移操作主要有两种: 有符号位移:有符号位移会保留原有数字正负性,即正数依然是正数,负数依然是负数. 有符号位左移时,低位补0. 有符号右移时:当数字为正数,高位补0.当数字为负时高位补1. ...
- 【Java编程思想笔记】-集合1
1.为什么要用集合? 一般情况下,数组是保存一组对象(或基本数据类型)最有效的方式.但是数组有着固定的尺寸,而在更一般的情况下,我们在写程序时不知道将需要保存多少个对象,或者是否需要更复杂的存储结构来 ...
- java编程思想笔记(第一章)
Alan Kay 第一个定义了面向对象的语言 1.万物皆对象 2.程序是对象的集合,他们彼此通过发送消息来调用对方. 3.每个对象都拥有由其他对象所构成的存储 4.每个对象都拥有其类型(TYpe) 5 ...
- java编程思想笔记(一)——面向对象导论
1.1 抽象过程 1.所有编程语言都提供抽象编程机制. 2.人们所能够解决的问题的复杂性直接取决于抽象的类型(所抽象的是什么)和质量. 3."命令式"语言(basic,c等)都是对 ...
- 7.JAVA编程思想笔记隐藏实施过程
欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/51040237 "进行面向对象的设计时,一项主要的考虑是:怎样将发生变 ...
- 【Java编程思想笔记】注解1-简单了解注解
文章参考:https://www.cnblogs.com/xuningchuanblogs/p/7763225.html https://www.cnblogs.com/xdp-gacl/p/3622 ...
随机推荐
- KMP之计算Next数组
KMP的Next数组:模式串的前缀与后缀的“相交”长度 KMP算法步骤: 1.先算next数组 2.若失配(此时模式串下标为j),利用Next数组求出失配后滑动的新位置 a.Next[j] \geq ...
- Python3的第一个程序
软件:Anaconda Navigator集成开发环境中的Spyder,自带Python,无需单独安装. 注意:Python对缩进和空格敏感,代码必须对齐(包括注释),否则出现错误unexpected ...
- Jqgrid pager 关于“local” dataType 动态加载数据分页的研究(没好用的研究结果)
系列索引 Web jquery表格组件 JQGrid 的使用 - 从入门到精通 开篇及索引 Web jquery表格组件 JQGrid 的使用 - 4.JQGrid参数.ColModel API.事件 ...
- python自动化开发-[第九天]-异常处理、进程
今日概要: 1.异常处理使用 2.进程 3.paramiko模块使用 一.异常处理 1.常见的错误异常 #错误异常一 print(a) #NameError #错误异常二 int('sdadsds') ...
- Tensorflow object detection API 搭建物体识别模型(四)
四.模型测试 1)下载文件 在已经阅读并且实践过前3篇文章的情况下,读者会有一些文件夹.因为每个读者的实际操作不同,则文件夹中的内容不同.为了保持本篇文章的独立性,制作了可以独立运行的文件夹目标检测. ...
- 网络编程基础【day10】:我是一个进程(三)
本节内容 1.引子 2.进程的诞生 3.线程 4.争吵 一.引子 我听说我的祖先们生活在专用计算机里, 一生只帮助人类做一件事情,比说微积分运算 了.人口统计了 .生成密码.甚至通过织布机印花 ! ...
- JAVA-Proxy 代理
jdk静态代理 interface Dao { void save(); } class DaoImpl implements Dao { @Override public void save() { ...
- linux环境下遇到的所有问题
启动redis # 进去到src目录下,指定配置文件启动 ./redis-server ../redis.conf 设置外网访问 更改redis.conf 文件 bind 127.0.0.1 prot ...
- mssql的 for xml path 与 mysql中的group_concat类似MSSQL For xml Path
/****** Script for SelectTopNRows command from SSMS ******/ SELECT D_ID,[D_Name] as Name FROM [LFBMP ...
- 阅读:ECMAScript 6 入门(3)
参考 ECMAScript 6 入门 ES6新特性概览 ES6 全套教程 ECMAScript6 (原著:阮一峰) JavaScript 教程 重新介绍 JavaScript(JS 教程) 字符串的扩 ...