天天看点

牛客java选择题每日打卡Day27

牛客java选择题每日打卡Day27

👩‍💻博客主页:京与旧铺的博客主页

✨欢迎关注🖱点赞🎀收藏⭐留言✒

🔮本文由京与旧铺原创

😘系列专栏:java学习

👕参考网站:牛客网

💻首发时间:🎞2022年7月22日🎠

🎨你做三四月的事,八九月就会有答案,一起加油吧

🀄如果觉得博主的文章还不错的话,请三连支持一下博主哦

🎧最后的话,作者是一个新人,在很多方面还做的不好,欢迎大佬指正,一起学习哦,冲冲冲

💬推荐一款模拟面试、刷题神器👉​​点击进入网站​​

🛒导航小助手🎪

文章目录

  • ​​牛客java选择题每日打卡Day27​​
  • ​​🛒导航小助手🎪​​
  • ​​@[toc]​​
  • ​​😊选择题1​​
  • ​​正确答案: B D F 你的答案: A D (错误)​​
  • ​​😊选择题2​​
  • ​​正确答案: E G 你的答案: B E (错误)​​
  • ​​😊选择题3​​
  • ​​正确答案: B C D 你的答案: C E (错误)​​
  • ​​😊选择题4​​
  • ​​正确答案: C 你的答案: B (错误)​​
  • ​​😊选择题5​​
  • ​​正确答案: B 你的答案: D (错误)​​
  • ​​😊选择题6​​
  • ​​正确答案: A D 你的答案: B C (错误)​​
  • ​​😊选择题7​​
  • ​​正确答案: A C 你的答案: C D (错误)​​
牛客java选择题每日打卡Day27

😊选择题1

关于Java中的ClassLoader下面的哪些描述是错误的:( )

正确答案: B D F 你的答案: A D (错误)

默认情况下,Java应用启动过程涉及三个ClassLoader: Boostrap, Extension, System
一般的情况不同ClassLoader装载的类是不相同的,但接口类例外,对于同一接口所有类装载器装载所获得的类是相同的
类装载器需要保证类装载过程的线程安全
ClassLoader的loadClass在装载一个类时,如果该类不存在它将返回null
ClassLoader的父子结构中,默认装载采用了父优先
所有ClassLoader装载的类都来自CLASSPATH环境指定的路径      

**A.Java系统提供3种类加载器:**启动类加载器(Bootstrap ClassLoader) 扩展类加载器(Extension ClassLoader) 应用程序类加载器(Application ClassLoader). A正确

**B.《深入理解Java虚拟机》P228:对于任意一个类,都需要由加载它的类加载器和这个类本身一同确立其在Java虚拟机中的唯一性,每一个类加载器,都拥有一个独立的类名称空间。这句话可以表达得更通俗一些:比较两个类是否“相等”,只有在这两个类是由同一个类加载器加载的前提下才有意义,否则,即使这两个类来源于同一个Class文件,被同一个虚拟机加载,只要加载它们的类加载器不同,那么这两个类必定不相等。**接口类是一种特殊类,因此对于同一接口不同的类装载器装载所获得的类是不相同的。B错误

C.类只需加载一次就行,因此要保证类加载过程线程安全,防止类加载多次。C正确

D. Java程序的类加载器采用双亲委派模型,实现双亲委派的代码集中在java.lang.ClassLoader的loadClass()方法中,此方法实现的大致逻辑是:先检查是否已经被加载,若没有加载则调用父类加载器的loadClass()方法,若父类加载器为空则默认使用启动类加载器作为父类加载器。如果父类加载失败,抛出ClassNotFoundException异常。D错误**

**

E.双亲委派模型的工作过程:如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成,每一个层次的类加载器都是如此,因此所有的加载请求最终都应该传送到顶层的启动类加载器中,只有当父加载器反馈自己无法完成这个加载请求时,子加载器才会尝试自己去加载。E正确

**F.**应用程序类加载器(Application ClassLoader)负责加载****用户类路径(ClassPath)上所指定的类库,不是所有的ClassLoader都加载此路径。F错误

😊选择题2

public class NameList
{
    private List names = new ArrayList();
    public synchronized void add(String name)
    {
        names.add(name);
    }
    public synchronized void printAll() {
        for (int i = 0; i < names.size(); i++)
        {
            System.out.print(names.get(i) + "");
        }
    }

    public static void main(String[]args)
    {
        final NameList sl = new NameList();
        for (int i = 0; i < 2; i++)
        {
            new Thread()
            {
                public void run()
                {
                    sl.add("A");
                    sl.add("B");
                    sl.add("C");
                    sl.printAll();
                }
            } .start();
        }
    }
}      

下面正确的2项是?

正确答案: E G 你的答案: B E (错误)

运行的时候可能抛异常
运行的时候可能没有输出,也没有正常退出
代码运行的时候可能没有输出,但是正常退出
代码输出"A B A B C C "
代码输出"A B C A B C A B C "
代码输出"A A A B C A B C C "
代码输出"A B C A A B C A B C "      
  • 在每个线程中都是顺序执行的,所以sl.printAll();必须在前三句执行之后执行,也就是输出的内容必有(连续或非连续的)ABC。

    而线程之间是穿插执行的,所以一个线程执行 sl.printAll();之前可能有另一个线程执行了前三句的前几句。

    E答案相当于线程1顺序执行完然后线程2顺序执行完。

    G答案则是线程1执行完前三句add之后线程2插一脚执行了一句add然后线程1再执行 sl.printAll();输出ABCA。接着线程2顺序执行完输出ABCABC

    输出加起来即为ABCAABCABC。

😊选择题3

下面有关forward和redirect的描述,正确的是() ?

正确答案: B C D 你的答案: C E (错误)

forward是服务器将控制权转交给另外一个内部服务器对象,由新的对象来全权负责响应用户的请求
执行forward时,浏览器不知道服务器发送的内容是从何处来,浏览器地址栏中还是原来的地址
执行redirect时,服务器端告诉浏览器重新去请求地址
forward是内部重定向,redirect是外部重定向
redirect默认将产生301 Permanently moved的HTTP响应      

1.从地址栏显示来说

forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器.浏览器根本不知道服务器发送的内容从哪里来的,所以它的地址栏还是原来的地址.

redirect是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址.所以地址栏显示的是新的URL.

2.从数据共享来说

forward:转发页面和转发到的页面可以共享request里面的数据.

redirect:不能共享数据.

3.从运用地方来说

forward:一般用于用户登陆的时候,根据角色转发到相应的模块.

redirect:一般用于用户注销登陆时返回主页面和跳转到其它的网站等.

4.从效率来说

forward:高.

redirect:低.

😊选择题4

一个容器类数据结构,读写平均,使用锁机制保证线程安全。如果要综合提高该数据结构的访问性能,最好的办法是______。

正确答案: C 你的答案: B (错误)

只对写操作加锁,不对读操作加锁
读操作不加锁,采用copyOnWrite的方式实现写操作
分区段加锁
无法做到      
  • 答案:C

    A,只对写操作加锁,不对读操作加锁,会造成读到脏数据

    B,CopyOnWrite的核心思想是利用高并发往往是读多写少的特性,对读操作不加锁,对写操作,先复制一份新的集合,在新的集合上面修改,然后将新集合赋值给旧的引用。这里读写平均,不适用

    C,分段加锁,只在影响读写的地方加锁,锁可以用读写锁,可以提高效率

😊选择题5

如果希望监听TCP端口9000,服务器端应该怎样创建socket?

正确答案: B 你的答案: D (错误)

new Socket("localhost",9000);
new ServerSocket(9000);
new Socket(9000);
new ServerSocket("localhost",9000);      

ServerSocket (int port)

创建一个serversocket 绑定在特定的端口

Socket(InetAddress address, int port)

创建一个socket流,连接到特定的端口和ip地址

😊选择题6

以下说法中正确的有?

正确答案: A D 你的答案: B C (错误)

StringBuilder是 线程不安全的
Java类可以同时用 abstract和final声明
HashMap中,使用 get(key)==null可以 判断这个Hasmap是否包含这个key
volatile关键字不保证对变量操作的原子性      
  • A.StringBuilder线程不安全,StringBuffer线程安全。

    B.同时用 abstract和final就会自相矛盾。

    C.Hashmap中的value可以之null,get(key)==null有两种情况,一是key不存在,二是该key中存的是null,所以应该使用map.containskey(key)返回的true/false来判断是否存在这个key。

    D.volatile关键字有两个作用:

    1.并发环境可见性:volatile修饰后的变量能够保证该变量在线程间的可见性,线程进行数据的读写操作时将绕开工作内存(CPU缓存)而直接跟主内存进行数据交互,即线程进行读操作时直接从主内存中读取,写操作时直接将修改后端变量刷新到主内存中,这样就能保证其他线程访问到的数据是最新数据

    2.并发环境有序性:通过对volatile变量采取内存屏障(Memory barrier)的方式来防止编译重排序和CPU指令重排序,具体方式是通过在操作volatile变量的指令前后加入内存屏障,来实现happens-before关系,保证在多线程环境下的数据交互不会出现紊乱。

😊选择题7

正确答案: A C 你的答案: C D (错误)

初始标记
并发标记
重新标记
并发清理      
  • **用户线程(user-level threads)**指不需要内核支持而在用户程序中实现的线程,其不依赖于操作系统核心,应用进程利用线程库提供创建、同步、调度和管理线程的函数来控制用户线程。

    CMS的GC过程有6个阶段(4个并发,2个暂停其它应用程序)

    1. 初次标记(STW initial mark)

    2. 并发标记(Concurrent marking)

    3. 并发可中断预清理(Concurrent precleaning)

    4. 最终重新标记(STW remark)

    5. 并发清理(Concurrent sweeping)

    6. 并发重置(Concurrent reset)

    在初次标记,重新标志的时候,要求我们暂停其它应用程序,那么这两个阶段用户线程是不会参与的