Java中的集合有哪些
Java中的集合分为单列集合和双列集合,单列集合顶级接口为Collection,双列集合顶级接口为Map。
Collection的子接口有两个:List和Set。
List接口的特点:元素可重复有序(存取顺序)
List接口的实现类:
ArrayList:底层实现是数组,查询快,增删慢,线程不安全,效率高
Vector:底层实现是数组,查询快,增删慢,线程安全,效率低;【废弃】
LinkedList:底层实现是链表,增删快,查询慢,线程不安全,效率高;
Set接口的特点:元素唯一,不可重复,无序。
Set接口实现类:
HashSet:底层实现hashMap,数组+链表实现,不允许元素重复,无序
TreeSet:底层实现红黑二叉树,实现元素排序
Map接口的特点:key-value键值对形式存储数据
Map接口实现类:
HashMap:底层数组+链表实现,线程不安全效率高
TreeMap:底层红黑二叉树实现,可实现元素的排序
LinkedHashMap:底层hashmap+linkedList实现,通过hashmap实现key-value键值对存储,通过链表实现元素有序。
线程和进程的区别
1、进程是资源分配的最小单位,线程是程序执行的最小单位。
2、进程有自己的独立地址空间,每启动一个进程,系统就会为它分配地址空间。而线程是共享进程中的数据的,使用相同的地址空间,因此CPU切换一个线程的花费比进程要小很多,同时创建一个线程的开销也比进程要小很多。
3、线程之间的通信更方便,同一进程下的线程共享全局变量、静态变量
等数据,而进程之间的通信需要以通信的方式(IPC)进行。
多线程的实现方式
1、继承Thread类
2、实现Runnable接口
3、实现Callable接口
4、通过线程池获取线程对象,实现多线程
线程的生命周期
新建状态(new一个线程的时候)
调用线程.start方法的时候,等待cpu分配时间片
可运行状态
当cpu分配到了时间片之后,线程开始运行,运行run方法当中的内容
运行状态
当线程遇到sleep、wait等方法的时候,线程会进入阻塞状态
阻塞状态
当休眠时间到期,或者被notify了,线程又回到了可运行状态
死亡状态
线程运行结束之后,就会销毁,被Jvm的gc回收
线程常用方法
1,.start():线程调用该方法将启动线程,使之从新建状态进入就绪队列排队,一旦轮到它来享用CPU资源时,就可以脱离创建它的线程独立开始自己的生命周期了。
2.run():Thread类的run()方法与Runnable接口中的run()方法功能和作用相同,都用来定义线程对象被调度之后执行的操作,都是系统自动调用而用户不得引用的方法。
3.sleep(int millsecond):优先级高的线程可以在它的run()方法中调用sleep方法来使自己放弃CPU资源,休眠一段时间。
4.isAlive():线程处于“新建”状态时,线程调用isAlive()方法返回false,在线程的run()方法结束之前,即没有进入死亡状态之前,线程调用isAlive()方法返回true。
5.currentTread():该方法是Thread类中的类方法,可以用类名调用,该方法返回当前正在使用CPU资源的线程。
6interrupt():一个占用CPU资源的线程可以让休眠的线程调用interrupt()方法“吵醒”自己,即导致休眠的线程发生InterruptedException异常,从而结束休眠,重新排队等待CPU资源。
7.join():线程加入,主线程需要在子线程执行之后在结束。这就需要用到join()方法,通过join方法,对线程执行顺序进行排序。
8.yield():线程礼让,线程一次运行,理论上平均分配CPU时间片,不会抢夺。
sleep()和wait()有什么区别
类的不同:sleep()来之Thread,wait()来自Object
释放锁:sleep()不释放锁:wait()释放锁。
用法不同:sleep()时间会到自动恢复;wait()可以使用notify()/notifyAll()直接唤醒。
notify()和notifyAll()有什么区别
notifyAll()会唤醒所有线程,notify()之后唤醒一个线程。notifyAll()调用后,会将全部线程由等待池移到锁池,然后参与锁的竞争,竞争成功则继续执行,如果不成功则留在锁池等待锁被释放后再次参与竞争。
而notify()自会唤醒一个线程,具体唤醒哪一个线程由虚拟机控制。
线程run()和start()有什么区别
start()方法用于启动线程,run()方法用于执行线程的运行时代码
run()方法可以重复调用,而start()只能调用一次。