牛客错题集4

在这里插入图片描述

局部内部类是放在代码块或方法中的,不能有访问控制修饰符,且不能用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.

50.以下程序的运行结果是?

===========================================================================

在这里插入图片描述

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经常需要清除无用的对象,使用纯数组更加方便。

52.关于抽象类与接口,下列说法正确的有?

==================================================================================

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类型 |

53.下面有关Java的说法正确的是( )

==================================================================================

A.一个类可以实现多个接口
B.抽象类必须有抽象方法
C.protected成员在子类可见性可以修改
D.通过super可以调用父类构造函数
E.final的成员方法实现中只能读取类的成员变量
F.String是不可修改的,且java运行环境中对string对象有一个对象池保存
答案:A C D F
解析:

这里解释一下E和F选项

E:

final 的成员方法除了能读取类的成员变量,还能读取类变量

F:

String 声明的是不可变的对象,每次操作都会生成新的 String 对象,然后将指针指向新的 String 对象

54.下列说法错误的有( )

===========================================================================

A.在类方法中可用this来调用本类的类方法
B.在类方法中调用本类的类方法时可直接调用
C.在类方法中只能调用本类中的类方法
D.在类方法中绝对不能调用实例方法
答案: A C D
解析:
成员方法

又称为实例方法,非静态成员函数, 暗含this指针

静态方法

又称为类方法,静态成员函数,由static修饰,与类对象无关,缺少this指针

  • this是对象,及有实例 故A错;

  • 静态成员函数可以直接引用该类的静态成员变量和函数,但不允许直接引用非静态成员变量(若要引用,则需 通过传递参数的方式得到对象名)故B对

  • 可以通过继承,来调用父类的 类方法。故C错;

  • 可以生成实例,然后通过this来调用实例方法,故D对

55.以下哪些jvm的垃圾回收方式采用的是复制算法回收()

==========================================================================================

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收集器:整体上是基于标记 整理 ,局部采用复制

56.以下定义一维数组的语句中,正确的是:()

====================================================================================

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;

静态与动态初始化的区别就在于,前者是声明的时候就初始化,后者是先声明,再动态初始化。

57.有关线程的叙述正确的是()

=============================================================================

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前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:前端)

完整版面试题资料免费分享,只需你点赞支持,动动手指点击此处就可领取了

前端实习面试的套路


回顾项目

往往在面试时,面试官根据你简历中的项目由点及面地展开问答,所以请对你做过的最好的项目进行回顾和反思。回顾你做过的工作和项目中最复杂的部分,反思你是如何完成这个最复杂的部分的。

面试官会重点问你最复杂的部分的实现方法和如何优化。重点要思考如何优化,即使你项目中没有对那部分进行优化,你也应该预先思考有什么优化的方案。如果这部分答好了,会给面试官留下很不错的印象。

重点在于基础知识

这里指的基础知识包括:前端基础知识和学科基础知识。

前端基础知识:html/css/js 的核心知识,其中 js 的核心知识尤为重要。比如执行上下文、变量对象/活动对象(VO/AO)、作用域链、this 指向、原型链等。

学科基础知识:数据结构、计算机网络、算法等知识。你可能会想前端不需要算法,那你可能就错了,在大公司面试,面试官同样会看重学生这些学科基础知识。
你可能发现了我没有提到React/Vue这些框架的知识,这里得说一说,大公司不会过度的关注这方面框架的知识,他们往往更加考察学生的基础。
这里我的建议是,如果你至少使用或掌握其中一门框架,那是最好的,可以去刷刷相关框架的面试题,这样在面试过程中即使被问到了,也可以回答个 7788。如果你没有使用过框架,那也不需要太担心,把重点放在基础知识和学科基础知识之上,有其余精力的话可以去看看主流框架的核心思想。


回顾项目

往往在面试时,面试官根据你简历中的项目由点及面地展开问答,所以请对你做过的最好的项目进行回顾和反思。回顾你做过的工作和项目中最复杂的部分,反思你是如何完成这个最复杂的部分的。

面试官会重点问你最复杂的部分的实现方法和如何优化。重点要思考如何优化,即使你项目中没有对那部分进行优化,你也应该预先思考有什么优化的方案。如果这部分答好了,会给面试官留下很不错的印象。

重点在于基础知识

这里指的基础知识包括:前端基础知识和学科基础知识。

前端基础知识:html/css/js 的核心知识,其中 js 的核心知识尤为重要。比如执行上下文、变量对象/活动对象(VO/AO)、作用域链、this 指向、原型链等。

学科基础知识:数据结构、计算机网络、算法等知识。你可能会想前端不需要算法,那你可能就错了,在大公司面试,面试官同样会看重学生这些学科基础知识。
你可能发现了我没有提到React/Vue这些框架的知识,这里得说一说,大公司不会过度的关注这方面框架的知识,他们往往更加考察学生的基础。
这里我的建议是,如果你至少使用或掌握其中一门框架,那是最好的,可以去刷刷相关框架的面试题,这样在面试过程中即使被问到了,也可以回答个 7788。如果你没有使用过框架,那也不需要太担心,把重点放在基础知识和学科基础知识之上,有其余精力的话可以去看看主流框架的核心思想。

  • 45
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
牛客 a卷2022年第四季度的华为题目中,要求考生设计一种高效的数据结构,能够支持以下几种操作: 1. 添加一个元素 2. 删除一个元素 3. 查找是否存在某个元素 4. 返回元素的总数 该数据结构要求满足空间复杂度较小、时间复杂度较低、能够快速地进行查找和修改等多种操作。 想要编写这样一种数据结构,我们可以参考许多已有的经典算法与数据结构,如二叉树、哈希表、红黑树等,通过综合利用它们的优点来实现这个问题的解决。 例如,我们可以通过哈希表来存储所有元素的值,并在每个哈希链表的元素中再使用红黑树来进行排序与查找。这样,我们既能够轻松地进行元素的添加和删除操作,也能够在查找较大数据范围和数量时保持较高的速度与效率。同时,由于使用了多个数据结构来协同完成这个问题,我们也能够在空间复杂度上适度地进行优化。 当然,在具体设计这个数据结构的过程中,我们还需要考虑一些实践中的细节问题,例如如何避免哈希冲突、如何处理数据丢失与被删除元素所占用的空间等问题,这都需要相应的算法与流程来进行处理。 总体来看,设计这种支持多种操作的高效数据结构,需要我们具备丰富的算法知识和编程实践能力,同时需要我们在具体处理问题时能够将多种算法和数据结构进行有效地结合。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值