面试常见三类问题简单总结

集合

Collection ====> List set
List ==> Arraylist ,LinkedList vector
Arraylist: 底层数据结构:数组。
ArrayList扩容机制:

使用无参构造方法创建,数组长度为0;第一次扩容发生在add()中,

使用有参构造,ArrayList arr = new ArrayList100);则数组长度为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();如果执行该方法,则线程立刻从运行态进入就绪态。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值