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这门包含了编程方方面面的语言,有着太多的基础知识了,从最初的 ...
随机推荐
- Android 浮动窗口进阶——画中画,浮动视频(附Demo)
今天继续上一篇Android顶层窗口.浮动窗口的进阶应用.上一篇主要讲解了WindowManager服务和如何使用WindowManager编写一个顶层窗口.今天主要是讲讲如何在顶层窗口里面播放视频, ...
- 【WPF】自定义形状的按钮Button
需求:做一个如下图所示的多边形按钮. <!-- 特殊形状的按钮 --> <Grid> <Polygon Points="0,0 140,0 190,42 140 ...
- Unity5 AssetBundle系列——资源加载卸载以及AssetBundleManifest的使用
下面代码列出了对于assetbundle资源的常用操作,其中有针对bundle.asset.gameobject三种类型对象的操作,实际使用中尽量保证成对使用. 这一块的操作比较繁琐,但只要使用正确, ...
- fresco xml配置属性不起作用
在xml中配置加载等待图标,不起作用. 正确的如下: <?xml version="1.0" encoding="utf-8"?> <Line ...
- java二叉树字典查询(qq 928900200)
This assignment will help you practice and understand better the Binary Tree and Binary Search Tree ...
- Error - SqlDateTime overflow. Must be between 1/1/1753 12:00:00 AM and 12/31/9999 11:59:59 PM
I find using the following works quite well for SQL min/max dates after many DB related errors: Date ...
- 近5年常考Java面试题及答案整理(二)
上一篇:近5年常考Java面试题及答案整理(一) 31.String s = new String("xyz");创建了几个字符串对象? 答:两个对象,一个是静态区的"x ...
- 为什么V8引擎这么快?[转]
转载请注明出处:http://blog.csdn.net/horkychen Google研发的V8 JavaScript引擎性能优异.我们请熟悉内部程序实现的作者依源代码来看看V8是如何加速的. 作 ...
- javascript +new Date()
最近学习JavaScript时,看到Date的一个有意思的用法就是+new Date(),结果跟Date对象的getTime(),valueOf()是一样的,他们返回的都是1970年1月1日午夜以来的 ...
- echarts - 使用echarts过程中遇到的问题(pending...)
1. 配合tab切换时,被display:none的元素init设置echarts失败 2018-11-09 18:09:35 现象描述:有一个tabs选项卡,每个切换项A.B中都有使用echart ...