通配符相关:
首先我们要明白类型擦出是怎么回事,也就是说,类型的确定是编译时确定的;编译时发现你往里存的对象有问题就报错;如果运行了你通过反射强制向里面添加元素其实是随便的;
< T >表示某种类型,比如Integer;< ? >表示不知道具体那种类型;< T >简单啊,你添加,读取都是T类型;?呢,不知道是哪种类型,能放进去吗?显然不能啊,你总不能把电视和地球放在一起把,这样会很奇怪;但是?读取,就会很方便,因为集合里已经有了这么一些东西,我管它是啥呢,拿出来就好了;
以这种思想,我们来看一下上下界通配符;
< ? extend A> 也就是T是个A的子类,那是哪个呢?很显然,你没办法向里面储存A的全部子类吧;比如T是个A的其中大儿子的儿子;那么A小儿子的儿子,很显然存不进去的嘛;但是反过来我不管T是哪个类,它总可以向上转型为A,所以就可以读取并转型为A;(不可转型为A的子类);
< ? super B> 就是说T是B得一个父类,那么很显然的,存什么我都可以把它转型为T嘛,因为T是B的父类嘛;但是当你读取的时候,T?B的父类,那是个什么玩意,到底是父亲,还是爷爷,还是Object呢?所以无法读取;除非你读取转型为Object;线程的状态
- 正常运行的一种状态
- 阻塞掉了,阻塞就分为三种了,一种是等待阻塞wait,就是等待有人唤醒了,一种是同步阻塞,等待锁的到来(线程当前活着呢);一种就是io请求啊,sleep啊,还有就是join方法;
- 对于运行来说,加上cpu的话,就有正在运行,和时间片用完,在外面的等待的情况;
sleep和wait的区别
- sleep是线程类Thread的方法,wait是Object的;
- sleep是占着锁睡觉的,wait是会释放锁的;
- 一个是线程主动睡觉,另一个则是线程中的对象需要等待;
- Synchronized与Lock锁的区别
- Lock的粒度更小,可以尝试获取一下锁,尝试获取一段时间,如果你没有得到锁的话,也可以做别的事情
- 当线程非常多的时候,Lock更加好用;
- gc相关
- 几种gc的算法:标记法,对象有一个引用就计数1,如果计数为0的话,就可以回收了;根搜索标记清除,从根开始访问对象,给那些能访问到的标记,剩下的清除;复制算法,从一个区域移到另一个区域,这样没有移动的,就是死掉的对象;标记-整理算法,简单的说,就是先标记,然后向前移动,这样,另一端的肯定是死翘翘的对象;
- 新生代的gc算法;先是伊甸园,然后是两个存活区;在没有满的情况,一个向另一个复制就是复制清除算法,剩下的使用标记-清楚;这叫做minor gc算法;
- 年老代,如果新生代地方不够,就转移那些还活着的,放在年老代里;使用标记-整理清楚,叫做full gc /major gc;
- 持久代,几乎不死的那种,使用标记-整理;
- 何时gc
- 伊甸园不够,就开始minor jc;
- 老年代不够了;
- 持久代不够了
- 新生代上传到老年代过来的对象太大;
- 7.
Java应急 知识
最新推荐文章于 2021-01-06 22:32:00 发布