哈哈,今天我们来讲解一下有关于一些数组 或者是集合的知识点

  1.ArrayList,LinkedList,Vector的区别

    ArrayList,LinkedList,Vector都是实现List接口,但ArrayList,LinkedList不是同步的,

    而Vector是同步的,ArrayList是一个可改变大小的数组,当更多的元素加入到ArrayList中,

    其大小将会动态增长,内部元素可以直接通过get()与set()方法进行访问,因为ArrayList

    本质上是一个数组.

    Vector与ArrayList类似,但属于强同步类,这个是线程安全的,但是一般我们不使用Vector,

    因为如果在多线程之中,我们自己可以实现同步,当Vector与ArrayList更多元素添加进来会

    请求更大的空间,Vector每一次请求双倍空间,而ArrayList每一次对Size增长50%

    LinkedList是一个双链表,在添加和删除时比ArrayList具有更好的性能,但在get与set方面

    弱于ArrayList,在LinkedList中似有的内部类,private static class Entry{Object element;

    Entry next;Entry previous},则ArrayList的空间浪费主要体现在list列表的结尾预留一定的

    容量空间,而LinkedList的空间则体现在他的每一个元素都要消耗相当的空间

  2.String,StringBuffer与StringBuilder的区别

    String字符串的常量

    StringBuffer是字符串的变量(线程安全)

    StringBuilder字符串变量(非线程安全)

    String类中使用字符数组保存在字符串中,如下所示,因为"final"修饰符,所以知道对象不变

    private final char value[];

    StringBuilder与StringBuffer都继承自AbstractStringBuilder类,在AbstractStringBuilder

    中也是使用字符数组保存字符串,如下所是,这两种对象都是可变的,char[] value;

    三者在执行速度方面的:StringBuilder>StringBuffer>String

    有一个特殊的例子

    String str = "This is only a"+ "simple"+"test" 

    StringBuffer buffer = new StringBuilder("This is only a").append("simple").append("tear")

    其实发现str的执行速度一点也不输给StringBuffer;但是其实是JVM一个把戏:

    Str = "This ia only a simple test",所以显得快,但是如果String a ="This is a only a",

    String b ="simple",String c="test",则str = a+b+c,则此时的速度就慢下来了

  3.Map,Set,List,Queue,Stack的特点与用法

    Map:键值对存放,一对一的往里面存,而且保证键的唯一性

    Hashtable:底层是哈希表数据结构,不可以存入null键null值,该集合是线程同步的

    HashMap:底层是哈希表结构,可以存入null键null值,该集合是不同步的,除了非同步和允许使用

      null值,HashMap和HashTable没有多大的区别

    TreeMap:底层是二叉树数据结构线程不同步,可以用于Map集合的键进行排序(记住,这不是

      你按放入的顺序进行排序,而是系统的内部定义的排序方法,如按字符串进行排序)

    Set:集合里面是无序的(存入和取出顺序不一致),元素不可重复

    HashSet:底层数据是哈希表,线程是非同的

    TreeSet:可以对集合中元素进行排序,底行数据结构是二叉树

    Queue接口与List,Set同一级别,都是继承Collection接口,其中队列是一种数组结构,符合先进先出

  4.HshMap和HashTable的区别

    1.HashTable继承Dictionary,则HashTable中不允许存放key或value为null的值

     HashMap继承AbstractMap,则允许在ke或value存放null值

    2.HashTable中有一个contains(Object value),但是由于怕引起误会,则在HashMap中删除掉,则在

     HashMap与HashTable中共有的方法为containsKey和containsValue方法

    3.Hashtable支持同步,则可以直接运用于多线程,而HashMap不支持同步,不能直接用于多线程

  5.HashMap和ConcurrentHashMap的区别,HashMap的底层源码

    1.HashMap的key与value的值都可以为null,但是ConcurrentHashMap的value值不能为null,否则会

      报HullPointerException

    2.从JDK1.2起,就有了HashMap,但是HashMap不是线程安全的,因此多线程操作要格外小心,在JDK1.5

      中,给我们带来concurrent包,从此Map包也有安全的

     解释:ConcurrentHashMap具体是怎么样实现线程安全的呢?肯定不是每一个方法加synchronized,那么

     就变成了HashTable

     从ConcurrentHashMap代码中可以看出,他引入了一个"分段锁"的概念,具体可以理解为把一个大的Map

     分为N个小的HashTable,根据key.hashCode()来决定把key放入哪个HashTable,在ConcurrentHashMap

     中,就是把Map分为N个Segment,put,get的时候,都是根据key.hashCode()算出放入到哪一个Segment.

     其实就是ConcurrentHashMap的工作机制,就是把整个Map分为N个Segment(类似HashTable),可以提供相同

     的线程安全,但是效率提升N倍,默认提升16倍

    HashMap底层源码:

    

put的源码:
public V put(K key,V value){
if(key == null) return putForNullKey(value);
int hash = hash(key);
int i = indexFor(hash,table.length);
for(Entry<K,V> e = table[i]; e!=null ;e=e.next){
Object k;
if(e.hash == hash && ((k = e.key)==key || key。equals(k))){
V oldValue = e.value;
e.value = value;
e.recordAccess(this);
return oldValue;
}
}
modCount ++;
addEntry(hash,key,value,i)
return null;
}

  6.TreeMap,HashMap,LinkedHashMap的区别

    TreeMap实现Sortmap接口,能够把它保存的记录根据键排序,默认是按键值的升序排序,

    也是可以指定的排序的比较器,当用到iterator便利TreeMap时,得到的记录是排序过的

    LinkedHashMap保存了记录的插入顺序,在用iterator遍历LinkedHashMap时,先得到

    的记录肯定是先插入的,也可以在构造函数时用带参数,按照应用次数排序,在遍历的时候

    会比HashMap慢,不过有种情况例外,当HashMap容量很大,实际数量较少时,遍历起来可能

    会比LinkedHashMap慢,因为LinkedHashMap的遍历速度只有和实际数据有关,和容量无关,

    而HashMap的遍历速度和他的容量有关.

    HashMap:HashMap是一个最常用的Map,它根据键的hashCode的值存储数据,根据键可以直接

    获取他的值,具有很快的访问速度,遍历时,取得数据的顺序是完全随机的,但是不支持同步,可以用

    Collections的synchronizedMap方法使HaspMap具有同步的能力,或者使用ConcurrentMap

    使用情况:

    我们最多使用的HashMap,HashMap里面存入的键值对在取出来的时候是随机的,它根据键的hashCode

    值存储数据,根据键可以直接获取它的值,具有很快的访问速度,在Map中插入和删除和定位元素,HashMap

    是最好的选择,TreeMap取出的是排序后的键值对.但如果你要是按自然顺序或自定义顺序遍历键,那么

    TreeMap会更好,LinkedMap是HashMap的一个子类,如果需要输出的顺序和输入的相同,那么用

    LinkedHashMap可以是实现,他还可以按读取顺序来排序,像连接池中可以应用

  7.Collection包结构,与Collections的区别

    Collection是集合类的上级接口,子接口有Set与List

    Collections是针对集合类的一个帮助类,提供了操作集合的工具方法,一系列静态方法实现对

    各种集合的搜索,排序,线程安全化等操作

JAVA-数组或集合的更多相关文章

  1. java 数组与集合(list)相互转化

    上代码 package com.core.array2collection; import java.util.ArrayList; import java.util.Arrays; import j ...

  2. java数组和集合的相互转换

    由于在学习过程中经常碰到这么一个问题,就是java中几种装数据的容器之间的转换,所以写了这篇随笔专门来总结这些转换方法. 数组转集合: 1.遍历,最常用的方法,但是过程会繁琐一点 int arrs[] ...

  3. java 数组和集合

    1.概念说明 区别:数组固定长度的,集合,数组的长度是可以变化的. List,继承Collection,可重复.有序的对象 Set,继承Collection,不可重复.无序的对象 Map,键值对,提供 ...

  4. Java数组转集合与集合转数组的坑

    在Java中将数组转为集合,会用到Arrays.asList()的方法,然而,这个方法却与我们的预期期望存在一些出入,当用到asList方法将数组转化成List列表时,对得到的List列表进行add( ...

  5. java数组或集合返回空的问题

    在有返回值的情况下,平时我写代码基本遇到错误什么都是返回null,我因为我觉得把数组或集合这个初始化占空间. 但是我发现这样在每次客户段调用都要进行非空判断,而且有时调用内置api还容易报错误,于是解 ...

  6. Java数组转集合之Arrays.asList()用法

    Arrays.asList()用法 使用Arrays.asList()的原因无非是想将数组或一些元素转为集合,而你得到的集合并不一定是你想要的那个集合. 而一开始asList的设计时用于打印数组而设计 ...

  7. JAVA数组和集合谁是儿子

    Java有哪些数据存储方式? 基本数据类型(1byte3整2小数1字符1布尔)分别是byte,short,int long,flort,double,char,boolean(颜色好喜庆的样子O(∩_ ...

  8. Java数组、集合的三种遍历方式(包懂)

    1 for循环 for(int i = 0;i<arr.length;i++){ System.out.print(arr[i]+" "); } 2 foreach循环,这种 ...

  9. Java数组、集合

    Vector类     类似C#的ArrayList.可扩展的数组,带有一些特定方法   Hashtable类     与C#的类似   Enumeration接口     类似C#的枚举器

  10. java数组集合元素的查找

    java数组和集合的元素查找类似,下面以集合为例. 数组集合元素查找分为两类: 基本查找: 二分折半查找: 基本查找: 两种方式都是for循环来判断,一种通过索引值来判断,一种通过数组索引判断. 索引 ...

随机推荐

  1. 学习html5 app项目开发

    这周因为部门接了个小的html5 app case,所以从事android开发的我就接下了这个项目.与其说是项目需要,其实更大部分是我自己想要做html5 app,因为我对这个全新的平台已经好奇很久了 ...

  2. ansible使用2-命令

    并发与shell # bruce用户身份,-m指定模块名称,默认模块名command,all所有目标主机,也可以指定组名或者主机名 ansible all -m ping -u bruce # bru ...

  3. ring0 暴力枚举进程

    原理:遍历进程ID,然后openprocess,能打开的都枚举出来 ring0 : #include "EnumProcessByForce.h" extern char* PsG ...

  4. Ubuntu 系统安装

    1.首先下载一个Ubuntu系统文件,以.ios后缀结尾的系统镜像文件压缩包. 2,下载一个ultraiso软件,用于制作u盘启动盘 3,将电脑重启,进入BOIS界面,调整系统顺序, 将启动盘系统设置 ...

  5. 模拟水题,牛吃草(POJ2459)

    题目链接:http://poj.org/problem?id=2459 题目大意:有C头牛,下面有C行,每头牛放进草地的时间,每天吃一个草,总共有F1个草,想要在第D的时候,草地只剩下F2个草. 解题 ...

  6. Object类的常用方法

    Object类是Java中所有类的始祖.如果没有明确的指定继承,则默认继承Object类.在Java中除了基本类型外都是Object类型的对象,包括数组. 1)equals方法 Object: pub ...

  7. Extjs4.2 tabPosition left 相关

    解决tabPosition:left 标签的方向问题   <%@ page language="java" import="java.util.*" pa ...

  8. 1.vue脚手架搭建项目

    前言: 在使用Vue-cli脚手架搭建项目之前,需要安装node.js和npm以及vue-cli. 开始搭建项目: 1.打开cmd win+R 2.转到要搭建的项目路径: g: cd Webapp/v ...

  9. CentOS 7 下 jdk8 安装教程

    方法一: 一.下载   官网下载地址   下载需要确认当前系统是32位还是64位,可通过命令查询:   sudo uname --m   根据查询结果下载对应的jdk版本(如):   i686 //表 ...

  10. sudo 密码超时时间

    Centos 没有默认超时时间,所以用一次sudo就需要输入密码. vi /etc/sudoers 添加下面的内容,2表示分钟数(看自己需求更改). Defaults timestamp_timeou ...