广告
返回顶部
首页 > 资讯 > 后端开发 > JAVA >java常见面试题目(含答案)
  • 877
分享到

java常见面试题目(含答案)

java面试题java 2021-07-19 15:07:37 877人浏览 绘本
摘要

如何用数组实现队列?用数组实现队列时要注意 溢出 现象,这时我们可以采用循环数组的方式来解决,即将数组收尾相接。使用front指针指向队列首位,tail指针指向队列末位。 (推荐学习:java常见面试题)内部类访问局部变量的时候,为什么变

如何用数组实现队列?

数组实现队列时要注意 溢出 现象,这时我们可以采用循环数组的方式来解决,即将数组收尾相接。使用front指针指向队列首位,tail指针指向队列末位。 (推荐学习:java常见面试题

内部类访问局部变量的时候,为什么变量必须加上final修饰?

因为生命周期不同。局部变量在方法结束后就会被销毁,但内部类对象并不一定,这样就会导致内部类引用了一个不存在的变量。

所以编译器会在内部类中生成一个局部变量的拷贝,这个拷贝的生命周期和内部类对象相同,就不会出现上述问题。

但这样就导致了其中一个变量被修改,两个变量值可能不同的问题。为了解决这个问题,编译器就要求局部变量需要被final修饰,以保证两个变量值相同。

jdk8之后,编译器不要求内部类访问的局部变量必须被final修饰,但局部变量值不能被修改(无论是方法中还是内部类中),否则会报编译错误。利用javap查看编译后的字节码可以发现,编译器已经加上了final。

long s = 499999999 * 499999999 在上面的代码中,s的值是多少?

根据代码的计算结果,s的值应该是-1371654655,这是由于Java中右侧值的计算默认是int类型。

非静态内部类能定义静态方法吗?

public class OuterClass{
    private static float f = 1.0f;

    class InnerClass{
        public static float func(){return f;}
    }
}

以上代码会出现编译错误,因为只有静态内部类才能定义静态方法。

Lock 和 Synchronized 有什么区别?

1. 使用方法的区别
- **Synchronized**:在需要同步的对象中加入此控制,`synchronized`可以加在方法上,也可以加在特定代码块中,括号中表示需要的对象。
- **Lock**:需要显示指定起始位置和终止位置。一般使用`ReentrantLock`类做为锁,多个线程中必须要使用一个`ReentrantLock`类做为对象才能保证锁的生效。且在加锁和解锁处需要通过`lock()`和`unlock()`显示指出。所以一般会在`finally`块中写`unlock()`以防死锁。
2. 性能的区别
`synchronized`是托管给JVM执行的,而`lock`是java写的控制锁的代码。在Java1.5中,`synchronize`是性能低效的。因为这是一个重量级操作,需要调用操作接口,导致有可能加锁消耗的系统时间比加锁以外的操作还多。相比之下使用Java提供的Lock对象,性能更高一些。但是到了Java1.6,发生了变化。`synchronize`在语义上很清晰,可以进行很多优化,有适应自旋,锁消除,锁粗化,轻量级锁,偏向锁等等。导致在Java1.6上`synchronize`的性能并不比Lock差。
  - **Synchronized**:采用的是CPU悲观锁机制,即线程获得的是独占锁。独占锁意味着 **其他线程只能依靠阻塞来等待线程释放锁**。而在CPU转换线程阻塞时会引起线程上下文切换,当有很多线程竞争锁的时候,会引起CPU频繁的上下文切换导致效率很低。
  - **Lock**:用的是乐观锁方式。所谓乐观锁就是,**每次不加锁而是假设没有冲突而去完成某项操作,如果因为冲突失败就重试,直到成功为止**。乐观锁实现的机制就是`CAS`操作。我们可以进一步研究`ReentrantLock`的源代码,会发现其中比较重要的获得锁的一个方法是`compareAndSetState`。这里其实就是调用的CPU提供的特殊指令。
3. `ReentrantLock`:具有更好的可伸缩性:比如时间锁等候、可中断锁等候、无块结构锁、多个条件变量或者锁投票。

float 变量如何与 0 比较?

folat类型的还有double类型的,这些小数类型在趋近于0的时候直接等于0的可能性很小,一般都是无限趋近于0,因此不能用==来判断。应该用|x-0|

//用程序表示就是

fabs(x) < 0.00001f

如何新建非静态内部类?

内部类在声明的时候必须是 Outer.Inner a,就像int a 一样,至于静态内部类和非静态内部类new的时候有点区别:

Outer.Inner a = new Outer().new Inner()(非静态,先有Outer对象才能 new 内部类)

Outer.Inner a = new Outer.Inner()(静态内部类)

Java标识符命名规则

可以包含:字母、数字、$、_(下划线),不可用数字开头,不能是 Java 的关键字和保留字。

你知道哪些JDK中用到的设计模式?

装饰模式:java.io

单例模式:Runtime类

简单工厂模式:Integer.valueOf方法

享元模式:String常量池、Integer.valueOf(int i)、Character.valueOf(char c)

迭代器模式:Iterator

职责链模式:ClassLoader的双亲委派模型

解释器模式:正则表达式java.util.regex.Pattern

ConcurrentHashMap如何保证线程安全

JDK 1.7及以前:

ConcurrentHashMap允许多个修改操作并发进行,其关键在于使用了锁分离技术。它使用了多个锁来控制对hash表的不同部分进行的修改。ConcurrentHashMap内部使用段(Segment)来表示这些不同的部分,每个段其实就是一个小的hash table,它们有自己的锁。只要多个修改操作发生在不同的段上,它们就可以并发进行。

JDK 1.8:

Segment虽保留,但已经简化属性,仅仅是为了兼容旧版本。

插入时使用CAS算法:unsafe.compareAndSwapint(this, valueOffset, expect, update)。 CAS(Compare And Swap)意思是如果valueOffset位置包含的值与expect值相同,则更新valueOffset位置的值为update,并返回true,否则不更新,返回false。插入时不允许key或value为null

与Java8的HashMap有相通之处,底层依然由“数组” 链表 红黑树;

底层结构存放的是TreeBin对象,而不是Treenode对象;

CAS作为知名无锁算法,那ConcurrentHashMap就没用锁了么?当然不是,当hash值与链表的头结点相同还是会synchronized上锁,锁链表。

Thread.sleep() & Thread.yield()&Thread.wait()的区别

sleep()和yield()都会释放CPU。

sleep()可使优先级低的线程得到执行的机会,当然也可以让同优先级和高优先级的线程有执行的机会;yield()只能使同优先级的线程有执行的机会。

Thread.sleep和Thread.yield()不会导致锁行为的改变,如果当前线程是拥有锁的,那么Thread.sleep不会让线程释放锁。如果能够帮助你记忆的话,可以简单认为和锁相关的方法都定义在Object类中,因此调用Thread.sleep是不会影响锁的相关行为。

Thread.sleep和Object.wait都会暂停当前的线程,对于CPU资源来说,不管是哪种方式暂停的线程,都表示它暂时不再需要CPU的执行时间。OS会将执行时间分配给其它线程。区别是,调用wait后,需要别的线程执行notify/notifyAll才能够重新获得CPU执行时间。

arraylist 和 linkedlist 的区别?

ArrayList和LinkedList两者都实现了List接口,但是它们之间有些不同。

(1)ArrayList是由Array所支持的基于一个索引数据结构,所以它提供对元素的随机访问

(2)与ArrayList相比,在LinkedList中插入、添加和删除一个元素会更快

(3)LinkedList比ArrayList消耗更多的内存,因为LinkedList中的每个节点存储了前后节点的引

--结束END--

本文标题: java常见面试题目(含答案)

本文链接: https://www.lsjlt.com/news/4399.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • java常见面试题目(含答案)
    如何用数组实现队列?用数组实现队列时要注意 溢出 现象,这时我们可以采用循环数组的方式来解决,即将数组收尾相接。使用front指针指向队列首位,tail指针指向队列末位。 (推荐学习:java常见面试题)内部类访问局部变量的时候,为什么变...
    99+
    2021-07-19
    java面试题 java
  • redis常见面试题和答案
    这篇文章将为大家详细讲解有关redis常见面试题和答案,文章内容质量较高,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1、什么是redisRedis 是一个基于内存的高性能key-valu...
    99+
    2022-10-18
  • java实习生面试题(含答案)
    1.Java容器框架有哪些Java容器框架中有两个名称分别为Collection和Set的接口2.list,map,set,array,它们有什么区别 (推荐学习:java实习生面试题)List接口主要有三...
    99+
    2016-12-25
    java面试题 java
  • 35个MySQL常见面试题+答案
    今天给大家总结了35 个 Mysql 常见的小问题 说一说三大范式 2.MyISAM 与 InnoDB 的区别是什么? 3.为什么推荐使用自增 id 作为主键? 4.一条查询语句是怎么执行的 5.使用 Innodb 的情况下,一条更新语句是...
    99+
    2023-09-11
    java 经验分享 数据库架构
  • Redis最常见面试题和答案
    这篇文章将为大家详细讲解有关Redis最常见面试题和答案,文章内容质量较高,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1、什么是Redis?Redis本质上是一个Key-Value类型的...
    99+
    2022-10-18
  • uniApp常见面试题及答案(推荐!)
    目录1.一句话总的形容- -下uniapp与vue和微信小程序的异同点2. Uniapp 中配置tabbar的方式 3. Uniapp 中常见的组件(说几个即可)4. Un...
    99+
    2023-02-10
    uniapp的面试题 uniapp面试问题 uni-app常见面试题
  • Java架构师面试必备题(含答案)
    第一题:一条sql执行过长的时间,你如何优化,从哪些方面? 答:1、查看sql是否涉及多表的联表或者子查询,如果有,看是否能进行业务拆分,相关字段冗余或者合并成临时表(业务和算法的优化) 2、涉及链表的查询,是否能进行分表查询,单表查询之...
    99+
    2023-09-15
    java 面试 数据库
  • java智慧流面试笔试题大全含答案
    1 下列关于栈的描述错误的是(B)A. 栈是先进后出的线性表 (推荐学习:java程序员面试题)B. 栈只能顺序存储C. 栈具有记忆功能D.对栈的插入和删除操作中,不需要改变栈底指针2 对于长度为 n 的线性表,在最坏的情况下...
    99+
    2020-01-27
    java面试题 java
  • 超全面的SpringBoot面试题含答案
    1. 什么是 Spring Boot? Spring Boot 是 Spring 开源组织下的子项目,是 Spring 组件一站式解决方案,主要是简化了使用Spring 的难度,简省...
    99+
    2023-03-23
    SpringBoot面试题 SpringBoot面试题答案
  • 91 个常见的 Laravel 面试题和答案
    以下是经常问到的 Laravel 和 PHP 相关的面试问题,以便菜鸟以及有经验的应聘者找到合适的工作。1) 什么是 Laravel Laravel是一个开源的、广泛使用的PHP框架。该平台主要用于利用MVC架构模式开发web应用程序。La...
    99+
    2023-05-12
    Laravel 面试 答案 工作
  • Python常见面试题及答案有哪些
    这篇文章主要介绍“Python常见面试题及答案有哪些”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Python常见面试题及答案有哪些”文章能帮助大家解决问题。  1...
    99+
    2022-10-19
  • 常见Vue面试题及答案有哪些
    这篇文章主要介绍“常见Vue面试题及答案有哪些”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“常见Vue面试题及答案有哪些”文章能帮助大家解决问题。Vue 常见面试题总结MVVM模型?MVVM,是Mo...
    99+
    2023-07-05
  • 2023 Java 面试题精选40道,包含答案
    Java中什么是重载?什么是覆盖?它们有什么区别? 重载是指在同一个类中,方法名相同但参数类型、个数或顺序不同的情况下,编译器会根据参数列表的不同自动调用不同的方法。覆盖是指子类重写父类的同名方法,使得子类在调用该方法时执行子类的实现而不是...
    99+
    2023-08-16
    java 开发语言
  • java笔试手写算法面试题大全含答案
    1.统计一篇英文文章单词个数。public class WordCounting { public static void main(String[] args) { try(FileReader fr = new ...
    99+
    2017-08-02
    java面试题 java
  • 接口测试面试题汇总(含答案)
    目录   1、什么是接口? 2、接口组成的要素是什么? 3、你对requests了解多少 4、如何使用requests   5、requests.get作用    6、requests.get语法形式 7、requests.get的返回值 ...
    99+
    2023-08-31
    python 开发语言
  • java多线程面试题选择题大全含答案
    1.下面程序的运行结果()(选择一项)public static void main(String[] args) { Thread t=new Thread(){ public void run(){ ...
    99+
    2015-06-10
    java面试题 java
  • 【2022最新Java面试宝典】—— SpringBoot面试题(44道含答案)
    目录 1. 什么是 Spring Boot?2. 为什么要用SpringBoot3. SpringBoot与SpringCloud 区别4. Spring Boot 有哪些优点?5. Spring Boot 的核心注解是哪个?它主要...
    99+
    2023-08-17
    SpringBoot 面试题
  • 【2022最新Java面试宝典】—— SpringCloud面试题(49道含答案)
    目录 Spring Cloud1. 什么是微服务架构2. 为什么需要学习Spring Cloud3. Spring Cloud 是什么4. SpringCloud的优缺点5. SpringBoot和SpringCloud的区别?6....
    99+
    2023-08-18
    SpringCloud 面试
  • 【2022最新Java面试宝典】—— MySQL面试题(40道含答案)
    目录 1、MySQL 中有哪几种锁?2、MySQL 中有哪些不同的表格?3、简述在MySQL 数据库中 MyISAM 和InnoDB 的区别4、MySQL 中InnoDB 支持的四种事务隔离级...
    99+
    2023-09-03
    java 面试 mysql
  • Java常见的一些经典面试题(附答案解析)
    前言: 我想每个程序员比较头疼的事情都是:工作拧螺丝,面试造火箭吧。但是又必须经历这个过程,尤其是弄不清面试官问的问题,如果你准备的不是很充分,会导致面试的时候手足无措。今天这篇文章是从已工作5年的程序员面试几十次中挑选的面试概率比较大的一...
    99+
    2023-10-27
    java 面试 jvm mybatis mysql
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作