集合和多线程相关知识

Java中的集合有哪些?

java中的集合分为单列集合和双列集合,单例集合顶级接口为Collection,双列集合顶级接口为Map

Collection的子接口有:Set,List

list的特点:有序,可重复

List实现类:

ArrayList:底层数组,查询快,增删慢,线程不安全,效率高

Vector:古老实现类、查询、增删慢、线程安全【废弃】

LinkedList:底层链表、查询慢、增删快、线程不安全、效率高

Set的特点:不可重复,无序,元素唯一

Set的是实现类:

HashSet:底层HashMap 数组+链表,不可重复,无序

TreeSet:底层红黑树,实现元素排序

Map接口特点:K-V键值对形式

HashMap:链表+数组、线程不安全、效率高

LinkedHashMap:hashmap+linkedList,通过链表实现元素有序,K-V键值对

TreeMap:底层红黑树,元素排序

jdk 7 底层结构只有: 数组 + 链表。 jdk 8 底层结构: 数组 + 链表 + 红黑树。

 ArrayList 和 Vector 的区别?

相同点:

二者都是单列集合Collection子接口List的实现类

二者的底层数据结构,均为数组实现,查询快,增删慢

不同点:ArrayList是线程不安全的,效率高,Vector是线程安全的,效率慢,已经弃用

 hashMap 和 hashTable 的区别?

相同点:
1、都是Map接口下的实现类
2、都底层都是链表+数组
3、都是K-V键值对存储形式

不同点:

hashMap:  1.继承AbstractMap类  2.线程不安全

hashTable:1.继承Dictionary类  2.线程安全

如何实现数组和 List 之间的转换?

数组转为List:使用Arrays.asList(array)进行转换

List转为数组:使用List自带的toArray()方法

Array 和ArrayList 有何区别?

Array:
1、可以存储基本数据类型和对象
2、方法少
3、长度创建后就固定
ArrayList:
1、只能存储对象
2、方法多
3、长度灵活

Collection 和 Collections 的区别?

Collection:
是单列集合的顶级接口
Collections:
是Coleection的工具类,提供方法

线程和进程的区别?

线程:程序执行的最小单位,是进程的一条执行路径

进程:是一段正在运行的代码,资源分配的最小单位

多线程的实现方式?

1.继承Thread 2.实现callable 3.实现runable 4.线程池

线程的生命周期?

新建,就绪,运行,阻塞,销毁

线程有哪些状态?

NEW 尚未启动      RUNNABLE 正在执行中  BLOCKED 阻塞的(被同步锁或者 IO 锁阻塞)

WAITING 永久等待状态   TIMED_WAITING 等待指定的时间重新被唤醒的状态

TERMINATED执行完成

sleep() 和 wait() 有什么区别?

sleep:1、来自Thread 2、不释放锁 3、自动唤醒

wait: 1、来自Object   2、释放锁  3、手动通过notify等方法唤醒

线程的 run() 和start() 有什么区别?

run可重复,线程执行运行时代码

start启动线程,只能调用一次

 synchronized 和  Lock 的 区别?

相同点:都是可以实现线程安全,给线程加锁

不同点:synchronized

1.可以给方法,类,代码快加锁

2.使用简单,自动获取锁和释放锁

3.不可以直到是否获取取到锁

说一下 atomic 的原理?

atomic 主要利用 CAS (Compare And Wwap) 和 volatile 和 native 方法来保证原子操作,从而避免 synchronized的高开销,执行效率大为提升。

请说出与线程同步以及线程调度相关的方法

wait():使一个线程处于等待(阻塞)状态,并且释放所持有的对象的锁

sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法需要处理InterruptedException异常。

notify():唤醒一个处于等待状态的线程,当然在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程。而是由JVM确定唤醒那个线程,而且与优先级无关。

notifyAll():唤醒所有处于等待状态的线程,该方法并不是将对象的锁给所有线程,而是让他们竞争,只有获得锁的线程才能进入就绪状态。

什么是 ThreadLocal?

线程局部变量,每一个线程生成特有的一份线程局部变量,多线程之间是无法相互访问的

关键字 volatile 、transient 各有什么作用?

volaitle是一种轻量级的多线程同步问题解决方案,用volatile修饰的变量,线程自爱每次使用变量的时候,都会读取变量修改后的值

transient用于制定序列化的类中某个属性不参与序列化操作

多线程之间的通信方式?

1.synchronized同步

本质上就是“共享内存”式的通信,多个线程需要访问同一个共享变量,谁拿到了锁(获取了访问权限),谁就可以执行

2.while轮询

其实就是多线程同时执行,会牺牲部分cpu性能,不停地通过while语句检测条件是否成立,从而实现了多线程间的通信

3.wait/notify机制

通过Object类的wait()和notify()方法,切换线程状态,使线程阻塞或者运行

4.管道通信

管道流主要用来实现两个线程之间的二进制数据的传播

线程池中 submit() 和  execute() 方法有什么区别

execute():只能执行Runnable类型的任务

submit():可以执行Runnable和Callable类型的任务

Callable类型的任务可以获取执行的返回值,而Runnable执行无返回值

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值