任务队列的实现原理?
这里面试官是想让我说任务队列的工作原理,阻塞唤醒这些。
但是我理解错了。第一次面试问这么深,所以这里没答好。
我答的是ArrayBlockingQueue:底层是数组,有界队列LinkedBlockingQueue:底层是链表,可以当做无界和有界队列。
实际上应该回答阻塞队列,原理就是读操作和写操作都需要获取到 AQS 独占锁才能进行操作。如果队列为空,这个时候读操作的线程进入到读线程队列排队,等待写线程写入新的元素,然后唤醒读线程队列的第一个等待线程。如果队列已满,这个时候写操作的线程进入到写线程队列排队,等待读线程将队列元素移除腾出空间,然后唤醒写线程队列的第一个等待线程。
走向Java精通:基础知识 1
发布于 2019-08-25 8.36k 次阅读
学完java后,如果想要真的走向java精通,那就要向更深走进!
整理一下java的一些知识点!
一、什么是Java虚拟机
从宏观上,java虚拟机就像是一个应用。他运行在系统上,除理底层的事,这样程序猿就可以专注于上层的代码层,而不用过份去关注底层和内存!
同时,同样的虚拟机可以在多个平台安,这样,一份代码就可以拿到任何一个安装了虚拟机的设备上使用,而虚拟机版本相同,而底层又由虚拟机来做,自然功能一样!所以java的兼容性是很好的。
二、java的基本数据类型
java共有8种数据类型分别为
byte
short
int
long
float
double
boolean
char
三、String与StringBuffer
java.lang.String 被定义为final,因此该类无法被继承,也无法被修改。
而StringBuffer可以提供字符串的修改方法,但返回的实为一个新的字符串。
四、static关键字
static表明一个成员变量或方法在所属类没有实例的情况下依然可以被访问。所以 static 关键字所标记的成员或方法不可能被 @Override 复写。因为static关键字定义的成员函数或变量在java虚拟机载入的时候就会对其初始化,而复写则是在虚拟机运行时进行的。
五、Overload和Override的区别
Override 重写 , Overload 重载
Override面向的是父类与子类之间的 具有相同方法名和参数的。对于子类而言,重写该方法后在子类中使用的将是重写后的方法,父类中的老方法会被屏蔽!
Overload是指在同一个类中,有不同的参数的同名方法!在同一个类中定义了多个同名但形参不同的方法称为重载。
Override,Overload都是java多态性的表现!
六、接口与抽象类
对于一个类而言,它可以有多个接口,但只能有一个父类!
一个类想要实现一个接口,那就要实现这个接口的所有方法。
但类可以不实现所继承的抽象类中的所有方法,但前提是这个子类也是个抽象类!
在接口中声明的变量都是final的。而抽象类中可以包含非final的变量
java接口中成员函数默认为public ,抽象类中成员函数可以是其它的
接口是绝对抽象的,是实例的,但如果抽象类中包函main方法,则可以被调用
七、值传递和引用传递
值传递如内传递了一个复本,对所传内容的修改完全不会影响原值。
而引用传递如内传递了原值的指针,当对其的修改就是对原对象的修改!
八、创建线程的方法
继承Thread类
实现Runnable接口
应用程序可以使用Executor框架来创建线程池
九、什么是死锁
当两个线程都在等对方释放自己所占用的资源时,就会造成死锁。结果就是两个线程都在等待对方释放资源从而都进入无限的休眠当中
十、sleep与wait的区别
sleep是Thread类的一个方法,该方法会让线程暂停执行当前行动,但监控状态依然保持,到时间会自动恢复,其暂停期间不会释放自己所占资源的对对象锁
wait是Object类的一个方法,对此对象调用wait方法,会使本线程放弃执行当前命令回到等待区,同时释放自己所占用资源的对象锁,直到notify方法运行后,本线程才会准备进入运行状态
走向Java精通:基础知识2 – 集合篇
发布于 2019-08-26 21.03k 次阅读
这一篇主要是对集合知识的一些整理
一、集合类的基本接口有哪些
Collection:代表一组对象,每一个对象都是它的子元素
Set:不包含重复元素的Collectio
List:有顺序的Collection,并且可以包含重复元素
Map:可以把键(key)映射到值(value)的对象上,键不能重复。
二、什么是迭代器
Iterator接口提供了很多对集合元素进行迭代的方法。
每一个集合类都包含了可以返回迭代器实例的迭代方法。迭代器可以在迭代的过程中删除底层集合元素。
三、Iterator 和 ListIterator的区别
Iterator可以用来遍历,Set 和 List ,但是ListIterator只能用来遍历 List
Iterator只能是前向遍历,但ListIterator可以双向遍历
ListIterator是对Iterator的实现,并且包含了它的全部功能。
四、HashMap的工作原理
Java中的HashMap是以键值对(key - value)的形式存储元素的。HashMap需要一个hash函数,它使用hashCode() 和 equals() 方法来向集合添加和查找元素
当调用 push() 方法时,HashMap会计算 key的hash值,然后把键值对存储在集合中合适的索引上。如果key已经存在了,value会被更新成新值。
HashMap有一些重要的特性:容量(capacit),负载因子(load factor),和扩容极限(threshold resizin)。
五、HashMap和Hashtable
HashMap和Hashtable都实现了Map接口
Hashtable是同步的,而HashMap不是。因此Hashtable适用于多线程环境,而HashMap更适合单线程环境。
HashMap允许键值为null,但Hashtable不允许
测试代码 - 15行有警告
运行报错
Hashtable的 put() 方法源码
上图可见不可以给空值
六、Array和ArrayList的区别
Array可以包含对象和基本类型,而ArrayList只能包含对象
Array的长度固定不变,而ArrayList是动态变化的
ArrayList提供了更多的方法和特性,比如:addAll(),removeAll() , iterator() 等
对于基本类型数据集合使用自动装箱来减少编码工作量,但是,当处理固定大小的基本数据类型的时候,这种方法很慢。
七、ArrayList和LinkedList的区别
都实现了List接口
ArrayList是基于索引的数据接口,它的底层是数组。LinkedList是以元素链表的形式储存数据。
因此,ArrayList的查询速度快,但插入,添加,删除速度慢。而LinkedList正好与之相反
LinkedList也因此比ArrayList更加节省内存,不会有浪费的内存
八、HashSet 和 TreeSet的区别
HashSet是由一个hash表来实现的,因此,它的元素是无序的。add() , remove() , contains() 方法的时间复杂度是 O(1)
TreeSet是由一个树形结构来实现的,它里面的元素是有序的。因此,add() , remove() , contains() 的方法是 O(logn)
九、Collection 和 Collenctions 的区别
Collection 是所有集合类的接口,Collenctions 是一个帮助类,他提供一系列静态方法实现对各种集合的搜索,排序,线程安全化等操作,其构造函数为 private 故不能实例化。
十、List , Set , Map 是否继承自Collection接口
List 和 Set 是,但 Map 不是。
十一、List ,Set,Map 三个接口存取元素时有什么区别
List 以特定次序来持有元素,可以重复
Set 无法拥重复元素,内部排序
Map 保存 key - value 值,value 可多值
还在收集和整理基础知识,可能总共会有 5 到 6 节~
所以现在还没走出基础。
但只要有坚持,就会有胜利
一、final,finally,finalize的区别
final 用于声明属性,方法,类。当声明在方法上时,代表方法不可覆盖。当声明在属性上时,则属性只能赋值一次(不可变)。声明于类时,类不可被继承。
finally 是异常处理语句结构的一个方法,表示始终执行该段代码
finalize 是 Object 类的一个方法, 在垃圾收集器执行时会调用被回收的对象的 finalize() 方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等
二、& 和 && 的区别
&是位运算符,表示按位 ‘与’ 运算,&& 是逻辑运算符,表示逻辑 ‘与’ (and)
三、error和exception有什么区别
error 表示恢复不是不可能,但是很困难的情况下的一种严重问题。
exception 表示一种设计或实现问题。换句话说,是程序员写错了,正常运行时是不会的情况!
四、同步与异步的区别
可以线程这间共享的数据,必须是同步存取
当程序在执行耗时较高的方法时,但不希望和序等待方法的返回时,就应该用异步编程
五、synchronized 和 java.util.concurrent.locks.Lock 的区别
Lock可以完成 synchronized 所实现的所有功能
Lock有比synchronized 更加精确的线程语议和更好的性能
Lock是一个类,但 synchronized 是一个关键字
synchronized 会自动释放锁,但 Lock 只能手动释放,且比须要从finally 中释放
六、StringBuffer 和 StringBuider 的区别
两都表是内容可修改的字符串,
StringBuider 是线程不安全的,但是运行效率高,StringBuffer与之相反
如果一个字符串定义在方法内,那它只有一个线程调和,不会出现线程不安全问题,所以建议使用StringBuider
如果一个字符串是类的成员变量,并且这个类的实例对象会在多线程的环境下使用,那么建议使用StringBuffer
七、heap和stack的区别
java的内存分为两类,一类是栈内存,一类是堆内存。
栈内存是指程序进入一个方法时,会为这个方法单独分配一块私属的存储空间,用于存储这个方法内部的局部变量,当这个方法结束时,分配给这个方法的栈会释放,这个栈中的变量也将随之释放
堆是与栈作用不同的内存,一般用于存放不放在当前方法栈中的那些数据,例如,使用new创建的对象都放在堆里,所以它不会随方法的结束而消失。方法中的局部变量使用final修饰后,放在堆中,而不是栈中。
https://www.cnblogs.com/ASPNET2008/p/7954782.html
https://www.cnblogs.com/ASPNET2008/p/7712974.html
https://www.cnblogs.com/ASPNET2008/p/7636276.html