数组和集合
数组部分
-
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中的集合框架体系结构:
集合部分
-
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采用分段加锁的机制来确保安全。