1. Map接口
HashMap:底层是哈希表,线程不安全
TreeMap:底层是二叉树,线程不安全
HashMap不允许空key和value
map.put()返回null; 如果key相同,value会被覆盖返回html
2.两种遍历方式:
①先把key值放入set中,遍历set输出value
Set set=map.keySet();
Iterator iterator=set.iterator();
while(iterator.hasNext()) {
syso"iterator.next()";
}
②把key和value看作一个entry实体,得到一个entry实体的set
Set<Map.Entry<E,E>> set=map.entrySet();
Iterator<Map.Entry<E,E>> iterator=set.iterator();
while(iterator.hasNext()){
Map.Entry<E,E> entry=iterator.next();
syso"entry.getKey()+entry.getValue()";
}
#HashMap的底层实现
HashMap:去重,操作的是key,对key去重
#HashMap与HashTable的区别
①HashTable不允许key为null,HashMap允许key为null
②HashTable是线程不安全,HashTable是线程安全
3.TreeMap注意点
①实现了Comparable接口的compareTo()方法,或者实现了Comparator接口的compareTo()方法,因为TreeMap的put方法重写了这两个接口的某一个;
②元素可不可以作为key,跟元素内部的成员没有关系
#可变参数
int…a == int a[]
①:传值的实参可以直接写,个数不限制;
public void sum1(int…a){方法体}
sum1(5,6,4,2,1);//sum1(2,3,4);
②:当方法中出现包括可变参数的多个参数时,可变参数必须放在最后,并且一个方法的参数中只能有一个可变参数
public void sum2(int b,int…a){方法体}
③:当可变参数的方法与固定参数的方法是重载关系时,调用的顺序,固定参数的优先于可变参数的.
public void sum3(int b){方法体}
public void sum3(int…b){方法体}
//sum3(2)–>默认调用第一个无可变参数的方法
4.Collections
按照从短到长排序:
定义一个A类实现Comparator接口,重写Comparator下的compare()方法
Collections.sort(list,new A());
按照从长到短排序:
Comparator comparator1=Collentions.reverseOrder(new A());
Collentions.sort(list,comparator1);
倒叙字典排序:
Copparator comparator2=Collections.reverseOrder();
Collentions.sort(list,comparator2);
5数据结构
数组:内存空间是连续的,查找快,插入删除慢
链表:内存空间是不连续的,查找慢,插入删除快
#哈希表
- 链地址法
hash表扩容的理解
java默认的散列单元大小全部都是2的幂,初始值为16(2的四次幂)。假如链表中的75%链接有数据的时候,则认为加载因子达到默认值0.75,然后散列单元会扩容为原来的二倍,散列单元中每个地址里存储的数组里的数据会全部重新计算,并存储到新的散列单元;
//Map是接口,一般而言concurrentHashMap是线程安全的
6多线程
程序:可执行文件
进程:一个正在运行的程序
线程:负责程序的运行,通常将进程的工作理解为线程的工作
作用:同一时间干多件事情
任务区:我们将线程工作的地方称为任务区
jvm默认是多线程,最少是两个任务区,一个在main一个在object下的finalize函数