集合
Collection ====> List set
List ==> Arraylist ,LinkedList vector
Arraylist: 底层数据结构:数组。
ArrayList扩容机制:
使用无参构造方法创建,数组长度为0;第一次扩容发生在add()中,
使用有参构造,ArrayList arr = new ArrayList(100);则数组长度为100;
如果添加元素是,数组不足以容纳新元素时,则需要扩容。
ArrayList可以通过下标访问。
LinkedList底层数据结构双向链表。查找速度慢,插入速度快。
Vector用法与原理基本与ArrayList一直,但该Vector是线程安全的(绝大多数方法被同步关键字修饰)。
List中存放的数据有序,可重复
Set存放是数据无序,不可重复(如果hashcode()的返回值相等,并且equals方法返回值为true,则认为重复)
map:存放键值对,其中键不可重复
HashMap底层数组+链表+红黑树(平衡搜索二叉树)
HashMap中数组的每个元素成为桶,桶中的元素是链表或者红黑树。
1.当调用无参构造则最开始数组长度为0,当第一次put()时扩容,扩容为16,下次为64,以后为原来的两倍
2.当存放的元素数量/数组长度 > 0.75; 开始扩容
3.每次扩容时,都会涉及到hash值的重新分配,所以开销大
4.在每个桶中的元素超过八个,则从链表变为红黑树。
5.如果元素数量减少到少于6个,则从红黑树转为链表。
HashTable与HashMap对比
HashTable线程安全,HashMap线程不安全,HashTable底层基于HashMap,HashTable效率比较低。
反射
反射就是把java类中的各种成分映射成一个个的Java对象
例如:一个类有:成员变量、方法、构造方法、包等等信息,利用反射技术可以对一个类进行解剖,把个个组成部分映射成一个个对象。
获取Class对象的三种方式:
Class.forName(“类的全限定名”)
实例对象.getClass()
类名.class (类字面常量)
多线程
1、进程与线程
进程:应用程序的运行实例称之为进程。当然一个应用程序可以对应多个运行实例。
进程是操作系统资源分配的最小单位。一个进程可以有一个或多个线程(运行单元)。
线程是操作系统任务调度的最小单位。每一个线程是一个运行单元。
每个进程内存空间是相互隔离,非共享,所以进程切换开销非常大。
同一进程下的所有线程共享同一份用户空间。
关闭进程,线程也会关闭,反之则不一定。
2、创建线程的三种方式
2.1 继承Thread类,重写void run()方法
//此处说明什么类型的线程要干什么事情
class MyThread extends Thread{
@Override
public void run(){
//我要干什么事情。
//我结束,则线程结束--自然死亡
}
}
//多态父类的引用指向子类对象----运行时多态。
Thread mythread = new MyThread();
2.2 实现Runnable接口,重写void run()方法
//此处仅说明要干的事情
class MyRunnable implements Runnable{
@Override
public void run(){
//要干的事情
}
}
Runnable runnable = new MyRunnable();
Thread thread = new Thread(runnable);
thread.start();
thread.join();
2.3 实现Callable接口,重写 T call()方法;
class MyCallable implements Callable<Integer>{
@Overrid
public Integer call(){
//要干的事情
return ?;
}
}
Callable<Integer> callable = new MyCallable();
FutureTask<Integer> task = new FutureTask(callable);
Thread thread = new Thread(task);
thread.start();
//等待线程,获取执行结构
Integer result = task.get();
3、线程状态
Thread thread = new Thread();//新建状态
thread.start();//就绪状态(可执行状态)
//被操作系统调度到 运行态
//run方法结束 死亡态
//如果在run方法中执行Thread.sleep(n);进入阻塞态–sleep结束,进入就绪态
//如果执行join方法,则进入阻塞态—等待的线程执行完,进入就绪态
线程礼让:yield();如果执行该方法,则线程立刻从运行态进入就绪态。