局部内部类是放在代码块或方法中的,不能有访问控制修饰符,且不能用static修饰
49.Java.Thread的方法resume()负责重新开始被以下哪个方法中断的线程的执行()。
==============================================================================================================
A.stop
B.sleep
C.wait
D.suspend
答案:D
解析:
线程的五大状态及其转换
- resume与suspended一起使用 wait与notify(notifyAll)一起使用 sleep会让线程暂时不执行 suspend() 和 resume() 方法:两个方法配套使用,suspend()使得线程进入阻塞状态,并且不会自动恢复,必须其对应的 resume() 被调用,才能使得线程重新进入可执行状态。
- 线程从创建、运行到结束总是处于下面五个状态之一:新建状态、就绪状态、运行状态、阻塞状态及死亡状态。
- 1.新建状态(New): 当用new操作符创建一个线程时, 例如new Thread®,线程还没有开始运行,此时线程处在新建状态。 当一个线程处于新生状态时,程序还没有开始运行线程中的代码
- 2.就绪状态(Runnable)
- 一个新创建的线程并不自动开始运行,要执行线程,必须调用线程的start()方法。
当线程对象调用start()方法即启动了线程,start()方法创建线程运行的系统资源,
并调度线程运行run()方法。当start()方法返回后,线程就处于就绪状态。
处于就绪状态的线程并不一定立即运行run()方法,线程还必须同其他线程竞争CPU
时间,只有获得CPU时间才可以运行线程。因为在单CPU的计算机系统中,不可能
同时运行多个线程,一个时刻仅有一个线程处于运行状态。因此此时可能有多个
线程处于就绪状态。对多个处于就绪状态的线程是由Java运行时系统的线程调度
程序(thread scheduler)来调度的。
- 3.运行状态(Running)
当线程获得CPU时间后,它才进入运行状态,真正开始执行run()方法.
- 4.阻塞状态(Blocked)
线程运行过程中,可能由于各种原因进入阻塞状态: 1>线程通过调用sleep方法进入睡眠状态; 2>线程调用一个在I/O上被阻塞的操作,即该操作在输入输出操作完成之前不会返回到它的调用者; 3>线程试图得到一个锁,而该锁正被其他线程持有; 4>线程在等待某个触发条件; …
所谓阻塞状态是正在运行的线程没有运行结束,暂时让出CPU,这时其他处于就绪状态的线程就可以获得CPU时间, 进入运行状态。
- 5.死亡状态(Dead)
有两个原因会导致线程死亡:
run方法正常退出而自然死亡,
一个未捕获的异常终止了run方法而使线程猝死。 为了确定线程在当前是否存活着(就是要么是可运行的,要么是被阻塞了),需要使用isAlive方法。如果是 可运行或被阻塞,这个方法返回true; 如果线程仍旧是new状态且不是可运行的, 或者线程死亡了, 则返回false.
===========================================================================
A.foobar
B.barfoo
C.foobar或者barfoo都有可能
D.Bar
E.Foo
F.程序无法正常运行
答案:A
解析:
- 线程的启动方式只能通过start这种方式启动才能真正的实现多线程的效果
- 如果是手动调用run方法和普通方法调用没有区别,所以这个还是按照顺序执行首先执行run方法之后,执行输出语句所以最终得到结果foobar.
- 调用start()后,线程会被放到等待队列,等待CPU调度,并不一定要马上开始执行,只是将这个线程置于可动行状态。然后通过JVM,线程Thread会调用run()方法,执行本线程的线程体。
51.java8中,下面哪个类用到了解决哈希冲突的开放定址法
===========================================================================================
A.LinkedHashSet
B.HashMap
C.ThreadLocal
D.TreeMap
答案:C
解析:
- ThreadLocalMap中使用开放地址法来处理散列冲突
- HashMap中使用的是分离链表法
之所以采用不同的方式主要是因为:在ThreadLocalMap中的散列值分散得十分均匀,很少会出现冲突。并且ThreadLocalMap经常需要清除无用的对象,使用纯数组更加方便。
==================================================================================
A.优先选用接口,尽量少用抽象类
B.抽象类可以被声明使用,接口不可以被声明使用
C.抽象类和接口都不能被实例化。
D.以上说法都不对
答案:AC
解析:
抽象类:
- 含有abstract修饰符的class即为抽象类,abstract类不能创建的实例对象。
- 含有abstract方法的类必须定义为abstract class,abstract class类中的方法不必是抽象的。abstract class
- 类中定义抽象方法必须在具体(Concrete)子类中实现,所以,不能有抽象构造方法或抽象静态方法,如果的子类没有实现抽象父类中的所有抽象方法,那么子类也必须定义为abstract类型。
接口:
接口中的所有方法都必须是抽象的。接口中的方法定义默认为public abstract类型,接口中的成员变量类型默认为public static final。
两者之间的联系和区别:
| 抽象类 | 接口 |
| — | — |
| 可以有构造方法 | 不能有构造方法 |
| 可以有普通成员变量 | 没有普通成员变量 |
| 可以包含非抽象的普通方法 | 所有方法必须都是抽象的,不能有非抽象的普通方法 |
| 访问类型可以是public,protected | 只能是public类型的,并且默认即为public abstract类型 |
| 可以包含静态方法 | 不能包含静态方法 |
| 可以包含静态成员变量,静态成员变量的访问类型可以任意 | 可以包含静态成员变量,但接口中定义的变量只能是public static final类型,并且默认即为public static final类型 |
==================================================================================
A.一个类可以实现多个接口
B.抽象类必须有抽象方法
C.protected成员在子类可见性可以修改
D.通过super可以调用父类构造函数
E.final的成员方法实现中只能读取类的成员变量
F.String是不可修改的,且java运行环境中对string对象有一个对象池保存
答案:A C D F
解析:
这里解释一下E和F选项
E:
final 的成员方法除了能读取类的成员变量,还能读取类变量
F:
String 声明的是不可变的对象,每次操作都会生成新的 String 对象,然后将指针指向新的 String 对象
===========================================================================
A.在类方法中可用this来调用本类的类方法
B.在类方法中调用本类的类方法时可直接调用
C.在类方法中只能调用本类中的类方法
D.在类方法中绝对不能调用实例方法
答案: A C D
解析:
成员方法
又称为实例方法,非静态成员函数, 暗含this指针
静态方法
又称为类方法,静态成员函数,由static修饰,与类对象无关,缺少this指针
-
this是对象,及有实例 故A错;
-
静态成员函数可以直接引用该类的静态成员变量和函数,但不允许直接引用非静态成员变量(若要引用,则需 通过传递参数的方式得到对象名)故B对
-
可以通过继承,来调用父类的 类方法。故C错;
-
可以生成实例,然后通过this来调用实例方法,故D对
==========================================================================================
A.新生代串行收集器
B.老年代串行收集器
C.并行收集器
D.新生代并行回收收集器
E.老年代并行回收收集器
F.cms收集器
答案:A D
解析:
两个最基本的java回收算法:复制算法和标记清理算法
复制算法:
两个区域A和B,初始对象在A,继续存活的对象被转移到B。此为新生代最常用的算法
标记清理算法:
一块区域,标记可达对象(可达性分析),然后回收不可达对象,会出现碎片,那么引出标记-整理算法:多了碎片整理,整理出更大的内存放更大的对象
两个概念:新生代和年老代
-
新生代:初始对象,生命周期短的
-
永久代:长时间存在的对象
整个java的垃圾回收是新生代和年老代的协作,这种叫做分代回收。
-
Serial New收集器是针对新生代的收集器,采用的是复制算法
-
Parallel New(并行)收集器,新生代采用复制算法,老年代采用标记整理
-
Parallel Scavenge(并行)收集器,针对新生代,采用复制收集算法
-
Serial Old(串行)收集器,新生代采用复制,老年代采用标记整理
-
Parallel Old(并行)收集器,针对老年代,标记整理
-
CMS收集器,基于标记清理
-
G1收集器:整体上是基于标记 整理 ,局部采用复制
====================================================================================
A.int a [10]
B.int a []=new [10]
C.int a[] int a []=new int [10]
D.int a []={1,2,3,4,5}
答案:D
解析:
Java一维数组有两种初始化方法:
- 1、静态初始化
int array[] = new int[]{1,2,3,4,5}
或者
int array[] = {1,2,3,4,5}
注意:写成一下形势也是错误的
int array[] = new int[5]{1,2,3,4,5}
- 2、动态初始化
array[0] = 1;
array[1] = 2;
array[2] = 3;
array[3] = 4;
array[4] = 5;
静态与动态初始化的区别就在于,前者是声明的时候就初始化,后者是先声明,再动态初始化。
=============================================================================
A.可以获得对任何对象的互斥锁定。
B.通过继承Thread类或实现Runnable接口,可以获得对类中方法的互斥锁定。
C.线程通过使用synchronized关键字可获得对象的互斥锁定。
D.线程的创建只能通过继承Thread类来实现。
答案:C
解析:
-
互斥锁指的是只有一个线程可以访问该对象。
-
如果变量用volatile修饰,则该变量是线程共享的,无法获得该变量的互斥锁
-
采用synchronized修饰符实现的同步机制叫做互斥锁机制,它所获得的锁叫做互斥锁。每个对象都有一个monitor(锁标记),当线程拥有这个锁标记时才能访问这个资源,没有锁标记便进入锁池。任何一个对象系统都会为其创建一个互斥锁,这个锁是为了分配给线程的,防止打断原子操作。每个对象的锁只能分配给一个线程,因此叫做互斥锁。
58.Java的Daemon线程,setDaemon( )设置必须要?
================================================================================================
A.在start之前
B.在start之后
C.前后都可以
答案:A
解析:
java线程是一个运用很广泛的重点知识,我们很有必要了解java的daemon线程.
首先我们必须清楚的认识到java的线程分为两类: 用户线程和daemon线程
- 2:守护线程。
守护线程是服务用户线程的线程,在它启动之前必须先set。
- 1.用户线程
通过Thread.setDaemon(false)设置为用户线程;
用户线程可以简单的理解为用户定义的线程,当然包括main线程
- 2.daemon线程
通过Thread.setDaemon(true)设置为守护线程,如果不设置,默认用户线程
daemon线程是为我们创建的用户线程提供服务的线程,比如说jvm的GC等等,这样的线程有一个非常明显的特征: 当用户线程运行结束的时候,daemon线程将会自动退出.(由此我们可以推出下面关于daemon线程的几条基本特点):
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:前端)
![](https://i-blog.csdnimg.cn/blog_migrate/ca4322a6390e68f0e1a3eb08987a7a33.jpeg)
最后
分享一套阿里大牛整理的前端资料给大家,点击前端校招面试题精编解析大全即可获取
❤️ 谢谢支持,喜欢的话别忘了 关注、点赞哦。
索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!**
因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
[外链图片转存中…(img-nbNNvYcf-1713370697804)]
[外链图片转存中…(img-pOcd5KU0-1713370697805)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!
[外链图片转存中…(img-pExAbtkz-1713370697805)]
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:前端)
![](https://i-blog.csdnimg.cn/blog_migrate/ca4322a6390e68f0e1a3eb08987a7a33.jpeg)
最后
分享一套阿里大牛整理的前端资料给大家,点击前端校招面试题精编解析大全即可获取
❤️ 谢谢支持,喜欢的话别忘了 关注、点赞哦。