Java基础知识之集合
Collection集合
特点:长度可变,只能存储引用类型,可以存储不同的类型的元素
list分类
特点:元素有序(存储和取出的顺序一致),元素可以重复。list除了可以用迭代器循环遍历之外,因为其是有序存入的所以可以用for来通过下表获取相应的值。list可以动态增长,查询元素的效率高,但是插入和删除时会引起其他元素的位置变化
- ArrayList
数据结构:底层数据结构是数组,查询快,增删慢。线程不安全,效率高
- LinkedList
数据结构:底层数据结构是链表,查询慢,增删快。线程不安全,效率高
- Vector
数据结构:底层数据结构是数组,查询快,增删慢。线程安全,效率低。
ArrayList和LinkedList的比较
Arraylist
优点:实现了基于动态数组的数据结构,因为元素的地址是连续的,所以一旦数据存储好了,查询的数据就会比较高(在内存中是连着放的)。
缺点:因为地址是连续的,所以在插入或者删除数据时,要移动数据,所以效率会比较低
LinkedList
优点:实现了基于链表的数据结构,地址是任意的,所以开辟一个内存空间的时候不需要开辟一个连续的地址,这对增加和删除操作是比较快的。适用于插入指定位置的场景
缺点:因为linkedList要移动指针,所以查询效率比较低
ArrayList和Vector的比较
ArrayList构造函数:
public ArrayList(int initialCapacity)//构造一个具有指定初始容量的空列表。
public ArrayList()//构造一个初始容量为10的空列表。
public ArrayList(Collection<? extends E> c)//构造一个包含指定 collection 的元素的列表
vector构造函数:
public Vector()//使用指定的初始容量和等于零的容量增量构造一个空向量。
public Vector(int initialCapacity)//构造一个空向量,使其内部数据数组的大小,其标准容量增量为零。
public Vector(Collection<? extends E> c)//构造一个包含指定 collection 中的元素的向量
public Vector(int initialCapacity,int capacityIncrement)//使用指定的初始容量和容量增量构造一个空的向量
ArrayList和vector的区别:
1.从源码中可以看出vector的很多方法都加了synchronized修饰符,这就使得vector是线程安全的,但是arrayList是线程不安全的,但是也正是vector使用了synchronized使得他在效率上无法和ArrayList相比
2.vector和ArrayList都采用了线性连续空间存储元素,但是当空间不足时,两者增加的方式不同
3.vector可以设置增长因子,但是arrayList不能
4.vector是老的动态数组,是线程同步的,所以效率很低
set分类
特点:元素无序,元素唯一;虽然元素的无放入顺序,但是元素的位置是有该元素的hashcode值来决定的,其位置其实也是固定的。另外加入set的元素必须定义equals()方法,否则就无法保证其唯一性了。set只能用迭代器来遍历,因为其无序所以无法用获取下标的方式获取想要的值。查询效率低,但是插入和删除效率高,切不会引起其他元素位置的变化。
- HashSet
数据结构:底层数据结构是哈希表。哈希表底层依赖两个方法:hashCode()和equals()。允许出现null值,但是只能出现一个null值。元素不能重复,但是同一对象可以放入不同的实例。
存储数据时的判断顺序:
1.首先判断对象的hashCode()是否相同
2.是:继续走equals(),看其返回值是
true:说明元素重复了,不添加
false:就直接添加到集合
否:就直接添加到集合
用的时候看到Hash结构的集合,我们就可能需要重写hashCode()和equals()。并且,我们也不用自己写,可以自动生成。
- LinkedHashSet
- TreeSet
数据结构:是二叉树实现的,所以treeSet的数据是自动排序好的,不允许null(因为二叉树不允许空节点)。数据不能重复。
HashSet值通过hash算法实现的,其性能要优于treeSet,是为快速查找而设计的set,所以一般我们都是使用hashSet。但是如果我们需要排序就要使用treeSet了
Map(map不是collection的子接口或者实现类,map本身是一个接口)
HashMap
HashMap其实就是一个Entry数组,Entry对象中包含了键和值,其中next也是一个Entry对象,它就是用来处理hash冲突的,形成一个链表。
从源码中可以看出没有使用Synchronize修饰,所以线程不安全。效率较高。其实HashMap是HashTable的轻量级实现。只能有一个null键可以有多个null值。无序的(没有按存储和获取顺序),但是元素的位置也是有hash值来决定的
HashMap的底层主要是基于数组和链表来实现的,它之所以有相当快的查询速度主要是因为它是通过计算散列码来决定存储的位置。HashMap中主要是通过key的hashCode来计算hash值的,只要hashCode相同,计算出来的hash值就一样。如果存储的对象对多了,就有可能不同的对象所算出来的hash值是相同的,这就出现了所谓的hash冲突。学过数据结构的同学都知道,解决hash冲突的方法有很多,HashMap底层是通过链表来解决hash冲突的
如何保证HashMap的线程安全:1.Collections.synchronizedMap(new hashMap()),这种方式是将整个hashMap加锁,访问效率相对较低;2.重写了hashMap,把hashMap分成如干个独立的快,并对每个块加锁,这样可以减少并发时的锁冲突。
hashTable
源码中使用了Synchronize修饰,所以线程安全,是线程同步的,也就是每次只允许一个线程对其进行修改。效率较低,不允许null键和null值
TreeMap
不支持线程同步,也就是线程不安全。数据存储时默认是按键的升序储存的,也可以创建映射时提供的排序比较器Comparator,当用Iterator 遍历TreeMap时,得到的记录是排过序的。键和值都不可以为null
LinkedHashMap
看到这个名字就会发现LinkedHashMap除了具有hashMap的特点外,还有保留了插入时的顺序,也就是先插入的先被获取到
ConcurrentHashMap
1.通过锁分段技术实现线程安全,但是它实现的是每个片段的安全,也就是一个线程在访问一个片段时,不影响其他线程线程访问其他片段,这样访问的效率就比较高,但是不能保证整体的线程安全。
2.应用场景是高并发,但是不能保证线程安全
3.ConcurrentHashMap在调用get方法时不加锁,但是value是volidate变量;调用put时会加锁,保证每个块的线程安全;Remove时也会加锁,由于next是final类型不可改变,所以必须把删除的节点之前的节点都复制一遍
jdk1.8中Concurrent'Hash'Map的原理解析
jdk1.7和Jdk1.8中concurrentHashMap的区别
HashMap和TreeMap区别
友情链接:Java中HashMap和TreeMap的区别深入理解
HashMap冲突
友情链接:2种办法让HashMap线程安全
Java基础知识之集合的更多相关文章
- Java基础知识:集合框架
*本文是最近学习到的知识的记录以及分享,算不上原创. *参考文献见链接. 目录 集合框架 Collection接口 Map接口 集合的工具类 这篇文章只大致回顾一下Java的总体框架. 集合框架 ht ...
- Java基础知识之集合(容器)简介
JAVA的集合体系,主要由Collection接口,Map接口,Iterator接口和操作集合的工具类Collections组成.其中的Iterator只是一个迭代器,真正的容器则派生自Collect ...
- Java基础知识强化之集合框架笔记76:ConcurrentHashMap之 ConcurrentHashMap简介
1. ConcurrentHashMap简介: ConcurrentHashMap是一个线程安全的Hash Table,它的主要功能是提供了一组和Hashtable功能相同但是线程安全的方法.Conc ...
- Java基础知识(壹)
写在前面的话 这篇博客,是很早之前自己的学习Java基础知识的,所记录的内容,仅仅是当时学习的一个总结随笔.现在分享出来,希望能帮助大家,如有不足的,希望大家支出. 后续会继续分享基础知识手记.希望能 ...
- Java基础知识回顾之七 ----- 总结篇
前言 在之前Java基础知识回顾中,我们回顾了基础数据类型.修饰符和String.三大特性.集合.多线程和IO.本篇文章则对之前学过的知识进行总结.除了简单的复习之外,还会增加一些相应的理解. 基础数 ...
- Java基础知识总结(超级经典)
Java基础知识总结(超级经典) 写代码: 1,明确需求.我要做什么? 2,分析思路.我要怎么做?1,2,3. 3,确定步骤.每一个思路部分用到哪些语句,方法,和对象. 4,代码实现.用具体的java ...
- 毕向东—Java基础知识总结(超级经典)
Java基础知识总结(超级经典) 写代码: 1,明确需求.我要做什么? 2,分析思路.我要怎么做?1,2,3. 3,确定步骤.每一个思路部分用到哪些语句,方法,和对象. 4,代码实现.用具体的java ...
- 第二十九节:Java基础知识-类,多态,Object,数组和字符串
前言 Java基础知识-类,多态,Object,数组和字符串,回顾,继承,类的多态性,多态,向上转型和向下转型,Object,数组,多维数组,字符串,字符串比较. 回顾 类的定义格式: [类的修饰符] ...
- 沉淀,再出发:Java基础知识汇总
沉淀,再出发:Java基础知识汇总 一.前言 不管走得多远,基础知识是最重要的,这些知识就是建造一座座高楼大厦的基石和钢筋水泥.对于Java这门包含了编程方方面面的语言,有着太多的基础知识了,从最初的 ...
随机推荐
- 【WPF】点击滑动条(Slider),移动滑块(Tick)到鼠标点击的位置
问题:点击Slider控件时,滑块会自动跳到滑动条的最边缘位置,无法跳到鼠标点击的位置上. 办法:给Slider控件设置属性IsMoveToPointEnabled="True"即 ...
- unable to locate package gparted
在unbuntu安装gparted的时候出现这个错误提示,意思为:找不到这个安装包 可能的原因: 1.当前系统更新包没有更新,执行命令:sudo apt-get update 2.命令错误,重新检查需 ...
- NoSuchMethodError: ... addOnCompleteCallback
问题描述: 使用ES 2.3.1和Spark streaming 2.1时,出现以上报错信息. 原因: addOnCompleteCallback方法在spark2.0中移除了 The addOnCo ...
- Java 8 并发性基础
https://www.ibm.com/developerworks/cn/java/j-jvmc2/index.html http://www.nurkiewicz.com/2013/05/java ...
- 巧妙解决windows下 copy命令不接受太长路径的问题
今天遇到了写的bat文件中执行xcopy成功,但是部分文件丢失的问题,查看日志,发现很多提示 : “the system can not find the path specified.“ 但是去指定 ...
- [React] 09 - Tutorial: components
jsx变为js的过程:http://babeljs.io/repl/ youtube: https://www.youtube.com/channel/UCA-Jkgr40A9kl5vsIqg-BIg ...
- 使用 ssh -R 穿透局域网访问内部服务器主机,反向代理 无人值守化
一.搭建SSH方向代理 准备: 局域网主机(虚拟主机): 192.168.6.233 CentOS 6.7 阿里云服务器:120.25.68.60 CentOS 6.7 1. 阿里云服务器12 ...
- C# 解决读取dbf文件,提示Microsoft Jet 数据库引擎找不到对象的问题
前言 最新项目需要经常和dbf文件打交道,在实际场景中很多软件需要和一些老的系统进行数据交互,而这些系统都在使用foxpro数据库,读取dbf文件一般都是分为两种情况:第一:安装foxpro的驱动进行 ...
- 跟bWAPP学WEB安全(PHP代码)--终结篇:文件目录遍历、文件上传、SSRF、CSRF、XXE、文件包含
前言 过年过的很不顺,家里领导和我本人接连生病,年前腊月29才都治好出院,大年初六家里的拉布拉多爱犬又因为细小医治无效离开了,没能过年回家,花了好多钱,狗狗还离世了.所以也就没什么心思更新博客.今天初 ...
- Logistic 与 softmax
之前写的一篇感觉太 Naive ,这里重新写一篇作为总结.Logistic 与 Softmax 都是一种概率判别模型(PRML p203),Softmax 通常用在 Neural Network 里最 ...