• 数组和集合


    数组部分

    • 1、数组定义:类名[] 数组名 ,数组中存放该类型的数据;


    • 2、二维数组:

      • 二维数组的定义中,第一个括号必须有数值,不能为空,但可为0;


    • 3、数组的初始化方式:

    • 静态初始化

    int [] a = {1,2,5,7,3};    //静态初始化基本类型数组
    User[] b = {
        new User(01,"张三"),
        new User(02,"李四"),
        new User(03,"王五")
    };                     //静态初始化引用类型数组;
    
    
    • 动态初始化

    int[] a = new int[2];   //动态初始化数组,先分配空间;
    a[0] = 1;//给数组元素赋值;
    a[1] = 2;//给数组元素赋值;
    
    
    • 默认初始化

    int[] a = new int[2];   //默认值:0,0;
    boolean[] b = new boolean[2];   //默认值:false,false;
    String[] s = new String[2];     //默认值:null,null;
    
    

    • 4、二维数组的合法初始化:

    // 数据类型[][] 数组名;
    int [][] table = new int[2][2];
    int [][] table = new int[2][];
    int [] table [] = new int[2][2];
    int [] table [] = new int[2][];
    

    • 5、数组和集合的区别:

    • (1)数组长度固定且不可变;

    • (2)集合可以在运行时动态变化;


    • 6、java中的集合框架体系结构:

    image


    集合部分

    • 1、迭代器遍历集合:

    Interator it = List.interator();
    while(it.hasNext()){
        
    }
    

    • 2、在没有引入泛型的概念之前(Java SE 1.5引入泛型的概念),对象存入集合都变成Object,取出时需要类型转换;


    • 3、ArrayList和LinkedList

      • ArryList和LinkedList都实现了List接口,ArrayList的内存结构是数组,本质是顺序存储的线性表,插入和删除操作都会引起后续元素移动,效率低,但是随机访问效率高;

      • LinkedList的内存结构是双向链表存储的,链式存储结构插入和删除效率高,不需要移动,但是随机访问效率低,需要从头开始向后依次访问

    • 4、HashTable和HashMap:

      • HashMap和Hashtable两个类都实现了Map接口,二者保存K-V对(key-value对);

      • HashTable不允许null值(key和value都不可以),HashMap允许null值(key和value都可以);

      • Hashtable的方法是Synchronize的,而HashMap不是,在多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap 就必须为之提供外同步;

      • 由所有HashMap类的“collection 视图方法”所返回的迭代器都是快速失败的:在迭代器创建之后,如果从结构上对映射进行修改,除非通过迭代器本身的 remove 方法,其他任何时间任何方式的修改,迭代器都将抛出ConcurrentModificationException。Hashtable和HashMap的区别主要是前者是同步的,后者是快速失败机制保证.

    • 5、 关于HashMap的一些说法:

      • a) HashMap实际上是一个“链表散列”的数据结构,即数组和链表的结合体。HashMap的底层结构是一个数组,数组中的每一项是一条链表。
      • b) HashMap的实例有俩个参数影响其性能: “初始容量” 和 装填因子。
      • c) HashMap实现不同步,线程不安全。 HashTable线程安全
      • d) HashMap中的key-value都是存储在Entry中的。
      • e) HashMap可以存null键和null值,不保证元素的顺序恒久不变,它的底层使用的是数组和链表,通过hashCode()方法和equals方法保证键的唯一性
      • f) 解决冲突主要有三种方法:定址法,拉链法,再散列法。HashMap是采用拉链法解决哈希冲突的。
      • 注: 链表法是将相同hash值的对象组成一个链表放在hash值对应的槽位;

        • 用开放定址法解决冲突的做法是:当冲突发生时,使用某种探查(亦称探测)技术在散列表中形成一个探查(测)序列。 沿此序列逐个单元地查找,直到找到给定 的关键字,或者碰到一个开放的地址(即该地址单元为空)为止(若要插入,在探查到开放的地址,则可将待插入的新结点存人该地址单元)。
        • 拉链法解决冲突的做法是:
          • 将所有关键字为同义词的结点链接在同一个单链表中 。若选定的散列表长度为m,则可将散列表定义为一个由m个头指针组成的指针数 组T[0..m-1]。凡是散列地址为i的结点,均插入到以T[i]为头指针的单链表中。T中各分量的初值均应为空指针。在拉链法中,装填因子α可以大于1,但一般均取α≤1。拉链法适合未规定元素的大小。
    • 6、 Hashtable和HashMap的区别:

      • a) 继承不同。

    public class Hashtable extends Dictionary implements Map

    public class HashMap extends AbstractMap implements Map

      • b) Hashtable中的方法是同步的,而HashMap中的方法在缺省情况下是非同步的。在多线程并发的环境下,可以直接使用Hashtable,但是要使用HashMap的话就要自己增加同步处理了。
      • c) Hashtable 中, key 和 value 都不允许出现 null 值。 在 HashMap 中, null 可以作为键,这样的键只有一个;可以有一个或多个键所对应的值为 null 。当 get() 方法返回 null 值时,即可以表示 HashMap 中没有该键,也可以表示该键所对应的值为 null 。因此,在 HashMap 中不能由 get() 方法来判断 HashMap 中是否存在某个键, 而应该用 containsKey() 方法来判断。
      • d) 两个遍历方式的内部实现上不同。Hashtable、HashMap都使用了Iterator。而由于历史原因,Hashtable还使用了Enumeration的方式 。
      • e) 哈希值的使用不同,HashTable直接使用对象的hashCode。而HashMap重新计算hash值。
      • f) Hashtable和HashMap它们两个内部实现方式的数组的初始大小和扩容的方式。HashTable中hash数组默认大小是11,增加的方式是old*2+1。HashMap中hash数组的默认大小是16,而且一定是2的指数。
      • 注: HashSet子类依靠hashCode()和equal()方法来区分重复元素。

        • HashSet内部使用Map保存数据,即将HashSet的数据作为Map的key值保存,这也是HashSet中元素不能重复的原因。而Map中保存key值的,会去判断当前Map中是否含有该Key对象,内部是先通过key的hashCode,确定有相同的hashCode之后,再通过equals方法判断是否相同。
    • 7、hashMap在单线程中使用大大提高效率,在多线程的情况下使用hashTable来确保安全;

      • hashTable中使用synchronized关键字来实现安全机制,synchronized是对整张hash表进行锁定即让线程独享整张hash表,在安全同时造成了浪费;
      • concurrentHashMap采用分段加锁的机制来确保安全。
  • 相关阅读:
    通过包名获取该包下的所有类
    spring各版本下载地址
    Hash函数和消息摘要算法
    @Value在Controller中取值
    Velocity根据模版生成静态html
    所谓人生
    用递归解决问题
    获取客户端IP
    windows下文件名非法字符
    各控件所支持的数据源格式
  • 原文地址:https://www.cnblogs.com/caoleiCoding/p/8974575.html
Copyright © 2020-2023  润新知