牛客java选择题每日打卡Day9
👩💻博客主页:京与旧铺的博客主页
✨欢迎关注🖱点赞🎀收藏⭐留言✒
🔮本文由京与旧铺原创,csdn首发!
😘系列专栏:java学习
👕参考网站:牛客网
💻首发时间:🎞2022年5月25日🎠
🎨你做三四月的事,八九月就会有答案,一起加油吧
🀄如果觉得博主的文章还不错的话,请三连支持一下博主哦
🎧最后的话,作者是一个新人,在很多方面还做的不好,欢迎大佬指正,一起学习哦,冲冲冲
图片
🛒导航小助手🎪
🤴选择题1
以下代码执行的结果显示是多少()?
正确答案: B 你的答案: D (错误)
num * count = 505000
num * count = 0
运行时错误
num * count = 5050
这题目挺好的!考察count++与++count的区别!for循环外面count=0,循环里面的count=count++;(count的值都等于count值,而后面count自加不影响count结果,因此这个式子无意义);循环count都为0(因count++是先返回count的本身值再自加1的)!若是改为count=++count;(先自加,再返回自加后的值),结果就是5050101=510050了!改为count++;结果就是5050101=510050了!
👩🦰选择题2
下面哪些写法能在 java8 中编译执行()
正确答案: A D 你的答案: B D (错误)
dir.listFiles((File f)->f.getName().endsWith(“.Java”));
dir.listFiles((File f)=>f.getName().endsWith(“.Java”));
dir.listFiles((_.getName().endsWith(“.Java”)));
dir.listFiles( f->f.getName().endsWith(“.Java”));
Lanbda表达式的主要作用就是代替匿名内部类的繁琐语法, 它由三部分组成:
(1) 形参列表。形参列表允许省略形参类型。如果形参列表中只有一个参数,甚至连形参列表的圆括号也可以省略。
(2) 箭头(→)。必须通过英文中画线和大于符号组成。
(3)代码块。如果代码块只包含一条语句,Lambda表达式允许省略代码块的花括号,那么那条语句就不要用花括号表示语句结束。Lambda代码块只有一条return语句,甚至可以省略return关键字。Lambda表达式需要返回值,而它的代码块中仅有一套省略了return的语句。Lambda表达式会自动返回这条语句的值。
由此可见,应该是A和D正确。
🍿选择题3
下面关于Spring的说法中错误的是()
Spring是一个支持快速开发Java EE框架的框架
Spring中包含一个“依赖注入”模式的实现
使用Spring可以实现声明式事务
Spring提供了AOP方式的日志系统
解析
D.Spring提供了AOP方式的日志系统 Spring并没有为我们提供日志系统,我们需要使用AOP(面向方面编程)的方式,借助Spring与日志系统log4j实现我们自己的日志系统。
spring没有提供AOP方式的日志系统 AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态***实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。 Spring通过对AOP的支持,借助log4j等Apache开源组件实现了日志系统。
解释一下答案A
Spring 框架是一个分层架构,由 7 个定义良好的模块组成。
核心容器,Spring上下文,Spring AOP, Spring DAO, Spring ORM, Spring Web, Spring MVC。
👧选择题4
String str = ``""``;``System.out.print(str.split(``","``).length);
输出结果为:
0
1
出现异常
/** * String split 这个方法默认返回一个数组, * 如果没有找到分隔符, * 会把整个字符串当成一个长度为1的字符串数组 * 返回到结果, 所以此处结果就是1 */ private static void testSpringSpilte(){
String str = "12,3";
String str2 = "123";
System.out.print(str.split(",").length);
System.out.print(str2.split(",").length);
}
}
结果 2 1
🌯选择题5
public class Person{
private String name = "Person";
int age=0;
}
public class Child extends Person{
public String grade;
public static void main(String[] args){
Person p = new Child();
System.out.println(p.name);
}
}
1.一个java文件里,public 的类只能出现一个,只能出现一个,只能出现一个,否则,不管你用哪一个类名命名文件名编译器都会报错
2.关于多态。子类继承了父类的所有成员,包括private权限的成员变量,但是继承的子类具有私有变量的拥有权但是没有使用权。
3.private的成员变量,根据权限修饰符的访问控制范围,只有在类内部才能被访问,就算是他的子类,也不能访问。
👳♂️选择题6
下列关于final、finally、finalize说法正确的是( )
正确答案: A B D 你的答案: B C D (错误)
final可以用来修饰类、方法、变量
finally是java保证重点代码一定要被执行的一种机制
变量被final修饰后不能再指向其他对象,但可以重写
finalize设计的目的是保证对象在被垃圾收集前完成特定资源的回收
-
final用于声明属性、方法和类:
-
final属性不可变,指的是引用不可变,而不关心指向对象内容的变化,被final修饰的变量必须初始化
-
final方法不可被子类重写,可以实现inline(内联)的机制
-
final类不可以被继承(如String、StringBuffer),所有的方法不可以被重写,但其内的非final变量可以被修改
-
-
finaally作为异常处理的一部分,只能用在try/catch语句中,并且附带一个语句块,表示这段语句最终一定被执行(特殊情况不会被执行,如try语句前出现异常或try语句块中出现的异常没有被捕获),经常被用在需要释放资源的情况下或是释放锁
-
finalize是Object类的一个方法,在垃圾回收器执行时会调用被回收对象的finalize()方法,可以覆盖此方法来实现对其他资源的回收(一旦垃圾回收器准备好释放对象占用的空间,将首先调用该方法,并且在下一次垃圾回收动作发生时,才会真正回收对象占用的内存),从功能上来说,finalize()方法与c++中的析构函数比较相似,但是Java采用的是基于垃圾回收器的自动内存管理机制,所以finalize()方法在本质上不同于C++中的析构函数。
关于finalize的补充!
判定一个对象objA是否可回收,至少要经历两次标记过程:
-
如果对象objA到GC Roots没有引用链,则进行第一次标记。
-
进行筛选,判断此对象是否有必要执行finalize()方法
-
如果对象objA没有重写finalize()方法,或者finalize()方法已经被虚拟机调用过,则虚拟机视为“没有必要执行”,objA被判定为不可触及的。
-
如果对象objA重写了finalize()方法,且还未执行过,那么objA会被插入到F-Queue队列中,由一个虚拟机自动创建的、低优先级的Finalizer线程触发其finalize()方法执行。
-
finalize()方法是对象逃脱死亡的最后机会,稍后GC会对F-Queue队列中的对象进行第二次标记。如果objA在finalize()方法中与引用链上的任何一个对象建立了联系,那么在第二次标记时,objA会被移出“即将回收”集合。之后,对象会再次出现没有引用存在的情况。在这个情况下,finalize方法不会被再次调用,对象会直接变成不可触及的状态,也就是说,一个对象的finalize方法只会被调用一次。
-
😍选择题7
以下哪些内存区域属于JVM规范?( )
正确答案: A D E 你的答案: A C E (错误)
方法区
实例变量
静态变量
程序计数器
虚拟机栈
-
JVM内存区:程序计数器、虚拟机栈、本地方法栈、堆、方法区(包括常量池)。
不属于JVM内存区:直接内存(Direct Memory),用户I/O操作
😘选择题8
有关线程的哪些叙述是对的()
正确答案: B C D 你的答案: B D (错误)
一旦一个线程被创建,它就立即开始运行。 使用start()方法可以使一个线程成为可运行的,但是它不一定立即开始运行。 当一个线程因为抢先机制而停止运行,它可能被放在可运行队列的前面。 一个线程可能因为不同的原因停止并进入就绪状态。
我自己最开始的时候只选了BD没选C。看评论里面也对C存疑,通过书籍查证C是可以选的。
在抢先式系统下,由高优先级的线程参与调度。分为2种情况:
1.若多个线程都处于就绪状态,则具有高优先级的线程会在低优先级之前得到执行;
2.在当前线程的运行过程中,如果有较高级别的线程准备就绪,则正在运行的较低级别的线程将被挂起,转到较高级别的线程运行,直到结束后又会转到原来被挂起的线程。
第二种情况就描述了C所代表的情况,可以看到当较高级别的线程抢去运行权并运行完成之后,是先将权利转给原来的线程的,所以C是正确的。
D选项 Java线程中的Thread.yield( )方法,译为线程让步。顾名思义,就是说当一个线程使用了这个方法之后,它就会把自己CPU执行的时间让掉,
让自己或者其它的线程运行,注意是让自己或者其他线程运行,并不是单纯的让给其他线程。
yield()的作用是让步。它能让当前线程由“运行状态”进入到“就绪状态”,从而让其它具有相同优先级的等待线程获取执行权;但是,并不能保
证在当前线程调用yield()之后,其它具有相同优先级的线程就一定能获得执行权;也有可能是当前线程又进入到“运行状态”继续运行!
一个新创建的线程并不是自动的开始运行的,必须调用它的start()方法使之将线程放入可运行态(runnable state),这只是意味着该线程可被JVM的线程调度程序调度而不是意味着它可以立即运行。 线程的调度是抢先式的,而不是分时间片式的。 具有比当前运行线程高优先级的线程可以使当前线程停止运行而进入就绪状态。 不同优先级的线程间是抢先式的,而同级线程间是轮换式的。 一个线程停止运行可以是因为不同原因,可能是因为更高优先级线程的抢占,也可能是因为调用sleep()方法。 而即使是因为抢先而停止也不一定就进入可运行队列的前面,因为同级线程是轮换式的,它的运行可能就是因为轮换,而它因抢占而停止后只能在轮换队列中排队而不能排在前面。
😫选择题9
下面有关java的引用类型,说法正确的有?
正确答案: A B C D 你的答案: A C (错误)
被GCroot强引用=Gcroot对象来说,只要有强引用的存在,它就会一直存在于内存中
如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收器回收。
如果一个对象只具有软引用,则内存空间足够,垃圾回收器就不会回收它;如果内存空间不足了,就会回收这些对象的内存
一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的空间
发现这道题完全没头绪,就去查了一下,感觉说的比较清楚了。
四种引用类型
JDK1.2 之前,一个对象只有“已被引用”和"未被引用"两种状态,这将无法描述某些特殊情况下的对象,比如,当内存充足时需要保留,而内存紧张时才需要被抛弃的一类对象。
所以在 JDK.1.2 之后,Java 对引用的概念进行了扩充,将引用分为了:强引用(Strong Reference)、软引用(Soft Reference)、弱引用(Weak Reference)、虚引用(Phantom Reference)4 种,这 4 种引用的强度依次减弱。
一,强引用
Object obj = new Object(); //只要obj还指向Object对象,Object对象就不会被回收 obj = null; //手动置null
只要强引用存在,垃圾回收器将永远不会回收被引用的对象,哪怕内存不足时,JVM也会直接抛出OutOfMemoryError,不会去回收。如果想中断强引用与对象之间的联系,可以显示的将强引用赋值为null,这样一来,JVM就可以适时的回收对象了
二,软引用
软引用是用来描述一些非必需但仍有用的对象。在内存足够的时候,软引用对象不会被回收,只有在内存不足时,系统则会回收软引用对象,如果回收了软引用对象之后仍然没有足够的内存,才会抛出内存溢出异常。这种特性常常被用来实现缓存技术,比如网页缓存,图片缓存等。
在 JDK1.2 之后,用java.lang.ref.SoftReference类来表示软引用。
三,弱引用
弱引用的引用强度比软引用要更弱一些,无论内存是否足够,只要 JVM 开始进行垃圾回收,那些被弱引用关联的对象都会被回收。在 JDK1.2 之后,用 java.lang.ref.WeakReference 来表示弱引用。
四,虚引用
- 点赞
- 收藏
- 关注作者
评论(0)