JAVA基础常见面试题

news2024/9/27 9:20:52

在这里插入图片描述

1.Java接口和抽象类的区别?

  • 接口

    • 接口中不能定义构造器

    • 方法全部都是抽象方法,JDK8提供方法默认实现

    • 接口中的成员都是public的

    • 接口中定义的成员变量实际上都是常量

    • 一个类可以实现多个接口

  • 抽象类

    • 抽象类中可以定义构造器

    • 可以有抽象方法和具体方法

    • 抽象类中的成员可以是private、默认、protected、public

    • 抽象类中可以定义成员变量

    • 有抽象方法的类必须声明为抽象类,而抽象类未必有抽象方法

    • 抽象类中可以包含静态方法

    • 一个类只能继承一个抽象类

2.Java面向对象有哪些特征?

  • 抽象:把现实世界的某一类物质抽象出来,抽象分为数据抽象,过程抽象(数据抽象就是比如鸟的翅膀,过程抽象就是鸟用翅膀飞。)

  • 继承:存在层级关系,子类复用父类的代码块,继承关系存在方法重写。

  • 封装:将一部分代码封装出来,实现代码的复用

  • 多态:子类的对象指向父类的引用,不同的子类对同一消息做出的响应。

3.JDK8的新特性有哪些?

  • 接口的默认实现,default方法。给程序员留的一个后悔药,可以直接在接口的默认方法里写业务的代码逻辑。

  • LocalDateTime、LocalDateAPI,jdk8新加的时间Api,或方法LocalDate.now()可以通过提供的API获取年月日信息,格式化简便。

  • lambda表达式,使java语言拥有类似python语言的函数式编程方式,代码简洁。jdk8提供的函数式接口有Function、BiFunction、Consumer、Supplier、Predicate。

  • Stream集合API,提供流式操作集合,对集合的分类,规整更方便,常见的API有map()转换函数,filter()过滤函数,groupingBy()分组函数,sort()排序函数等配合Collectors收集器使用。

  • Optional类,解决空指针异常的类,支持获取对象,判断对象是否存在,对象为null返回兜底数据等。

4.你知道运算符&和&&、|和||的区别吗?

  • &:按位与操作,只有对应的两个二进制数为1时,结果才为1。

    • 1&1=1、1&0 = 0、0&1 = 0、0&0 = 0
  • |:按位或操作,只要有一个二进制数为1时,结果就为1。

    • 1&1=1、1&0 = 1、0&1 = 1、0&0 = 0
  • &&:短路与操作,判断短路与左侧是否正确,如果不正确则不执行短路与后面的判断。

  • ||:短路或操作,判断短路或左侧是否正确,如果正确则不执行短路或后面的判断。

5.如何以最有效的方法计算2乘8?

  • 采用位运算:2<<3

  • 将一个数左移n位,就相当于乘以2的n次方,位运算是CPU直接支持的,所以效率高。

  • JDK源码中HashMap的默认容量是16,采用位运算。

  • int DEFAULT_INITIAL_CAPACITY = 1 << 4; //16

	public static void main(String[] args) {
        int num = 2 << 3;
        System.out.println(num);
    }

6.实现变量交换的方式有几种?

  • 第一种
定义一个中间变量c,但是这种往往损耗性能。
  • 第二种
    private static void swap1(int a, int b) {
        System.out.println("a = "+a+",b = "+b);
        //现在a 相当于a和b的和
        a = a+b;
        //b就相当于a的值了
        b = a-b;
        //a就相当于b的值了
        a = a-b;
        System.out.println("a = "+a+",b = "+b);
    }
  • 第三种 异或运算(一个数与另一个数异或两次就是其本身,一个数和自身异或的结果是0)
	private static void swap2(int a, int b) {
        System.out.println("a = "+a+",b = "+b);
        //a = a^b
        a = a^b;
        //b = b^a^b
        b = b^a;
        //a = a^b^a
        a = a^b;
        System.out.println("a = "+a+",b = "+b);
    }

7.说下Java数据类型分类?

  • 基本数据类型:byte、short、int、long、boolean、char、double、float
  • 引用数据类型:String、Enum、接口、抽象类、数组

8.==和equals的区别?

==在比较基本数据类型的时候,比较的是数值,比较引用数据类型的时候,比较的是内存地址,Object类下的equals比较的是对象的地址,String类中重写了equals方法,比较的是字符串的数值。

9.try里面有个return,finally里也有个return,会有什么返回结果?

	public boolean test(){
        try {
            return false;
        }finally {
            return true;
        }
    }
在执行try、catch中的return之前⼀定会执行finally中的代码(如果finally存在),如果finally中有return语句,就会直接执行finally中的return方法,所以finally中的return语句⼀定会被执行的。

10.你知道try-with-resource新特性吗?

JDK1.7之后处理异常块,可实现自动关闭资源操作,try()里面定义多个资源,执行完进行关闭。

11.String str = new String(“a”),创建了几个对象?

如果常量池中存在,则直接new一个对象。如果常量池不存在,则在常量池中创建一个对象,也在堆中创建一个对象。

12.String、StringBuffer、StringBuilder的区别?

  • 三者都是被final修饰的类。

  • 本质上都是char[]字符数组的实现。

  • String、StringBuffer、StringBuilder中,String是不可变的对象,其他两个是可变的。

  • 使用场景

    • 操作少量的数据用String,但是常改动内容且操作数据多情况下最好不要用String,因为每次生成中间对象性能会降低。

    • 单线程下操作大量的字符串用StringBuilder,虽然线程不安全但是不影响。

    • 多线程下操作大量字符串,且需要保证线程安全,则用StringBuffer

13.Overload和Override的区别?

  • 重载Overload:表示同一个类中可以有多个名称相同的方法,但这些方法的参数列表各不相同,参数个数或类型不同。
  • 重写Override:表示子类中的方法可以与父类中的某个方法的名称和参数完全相同。

14.JDK8接口的新特性?

  • interface中可以有static方法,但必须有方法体实现,该方法只属于该接口,接口名直接调用该方法。
  • 接口中新增default关键字修饰的方法,default方法只能定义在接口中,可以在子类或子接口中被重写default定义的方法。
  • 父接口的default方法如果被重写那么子类的实现对象调用,以重写的方法为准。
  • 本类没有重写父接口的default方法,则使用父接口的default方法逻辑。

15.说下Vector和ArrayList、LinkedList的联系和区别?

  • 三者区别:
    • ArrayList:底层是数组实现,线程不安全,查询和修改非常快,但是增加和删除慢。
    • LinkedList:底层是双向链表,线程不安全,查询和修改速度慢,但是增加和删除快。
    • Vector:底层是数组实现,线程安全的,操作的时候使用synchronized进行加锁。
  • 使用场景:
    • Vector已经很少用了
    • 增加和删除场景多用LinkedList
    • 查询修改多用ArrayList

16.如果需要保证线程安全,ArrayList应该怎么做?

  • 方式一:可以自己写个包装类,继承ArrayList,根据业务一般是add/update/remove加锁
  • 方式二:使用Collections.synchronizedList(new ArrayList),使用synchronized加锁,底层加入同步代码块。
  • 方式三:采用CopyOnWriteArrayList<>(),底层使用ReentrantLock加锁。

17.了解CopyOnWriteArrayList吗?

CopyOnWriteArrayList是JUC下提供的一个类,在执行修改操作时,会拷贝一份新的数组进行操作(add、set、remove),代价十分昂贵,在执行完修改后会将原来的集合的引用指向新的集合来完成修改的操作,源码里用ReentrantLock可重入锁来保证不会有多个线程同时拷贝一份数组。

  • 应用场景:读高性能,适用读操作远远大于写操作的场景中使用(读的时候是不需要加锁的,直接获取,删除和增加是需要加锁的,读多写少)。
  • Collections.synchronizedList:线程安全的原因是因为它几乎在每个方法中使用了synchronized同步锁。
  • 场景:写操作性能那个比CopyOnWriteArrayList好,读操作性能那个并不如CopyOnWriteArrayList。

18.CopyOnWriteArrayList的设计思想是怎样的,有什么缺点?

  • CopyOnWriteArrayList的设计思想读写分离+最终一致。

  • 缺点:内存占用问题,写时复制机制,内存里面会同时驻扎两个对象的内存,旧的对象和新写入的对象,如果对象大则容易发生Yong GC和Full GC。

19.说下ArrayList的扩容机制是怎样的?

  • 注意:JDK1.7之前ArrayList默认大小是10,JDK1.7之后是0。

  • 未指定集合容器大小,默认是0,若已经指定大小则集合大小为指定的,当集合第一次添加元素的时候,集合大小扩容为10,ArrayList的元素个数大于其容量,扩容的大小=原始大小+原始大小/2。

20.说下HashMap和HashTable的区别?

  • HashMap:底层是哈希表实现,非线程安全的,默认容量是16、允许有空的键和值,实现的是Map接口。

  • HashTable:基于哈希表实现,线程安全的(加了synchronized),默认容量是11,不允许有null的键和值,继承自 Dictionary 类。

21.说下对象的hashcode()和equals()?

  • hashcode():顶级类Object里面的方法,所有的类都是继承自Object,返回一个int类型的数,根据一定的hash规则,映射成一个数组,即散列值。

  • equals():顶级类Object类的方法,返回一个boolean类型,根据自定义的匹配规则,用于匹配两个对象是否一样。

  • 判断一个对象是否相等,先判断hashcode,当hashcode不同时,返回两个对象不同,当hashcode相同时,就进行equals比较。

22.HashMap和TreeMap应怎样选择?

  • HashMap:底层实现是散列桶(数组+链表)jdk1.8之后,当链表长度大于8的时候转换成红黑树,可以实现快速的存储和检索,但是确实包含无序的元素,适用于map中插入删除和定位元素。

  • TreeMap:使用存储结构是一个平衡二叉树->红黑树,可以自定义排序规则,要实现Comparator接口,能便捷的实现内部元素的各种排序,但是一般性能比HashMap差,适用于按照自然排序或自定义规则的场景。

23.Set和Map的关系?

  • Set的核心就是不保存重复的元素,存储一组唯一的对象。

  • Set的每一种实现都是对应Map里的一种封装,HashSet对应的就是HashMap,TreeSet对应的就是TreeMap。

  • Set的集合对象作为Map的Key,在使用一个Object常量作为value。

24.常见Map的排序规则是怎样的?

  • 按照添加顺序使用LinkedHashMap(),按照自然排序使用TreeMap,自定义排序TreeMap(Comparetor c)。

25.如果需要线程安全,且效率高的Map,应该怎么做?

  • 多线程环境下可以用JUC包下的ConcurrentHashMap,Collections.synchronizedMap(),ConcurrentHashMap的效率要比HashTable高很多,使⽤Collections.synchronizedMap包装后返回的map是加锁的。

26.说一说HashMap的底层实现?

  • HashMap底层是数组+链表+红黑树,红黑树是JDK1.8之后才有的,当链表长度大于8的时候,链表会转换成红黑树。

  • 数组中的每一项都是一个链表,即数组和链表的结合体。

  • jdk1.8之后是一个Node<K,V>[] tables 数组,jdk1.8之前是Entry<K,V>数组,Node继承Entry,Entry是一个key-value的键值对,它持有一个指向下一个Entry的引用,table数组中存放每个Node元素。

27.什么是hash碰撞,创建的解决办法有哪些,HashMap采用哪种方法?

  • hash碰撞的意思就是不同的key计算得到相同的Hash值。需要放到同个数组的桶内。

  • 常见的解决办法:链表法、开发地址法、再哈希法等。

  • HashMap采用的就是链表法。

28.说一说HashMap底层为什么要用数组+链表+红黑树?

  • 数组Node<K,V>[] table,根据对象的key的hash值判断数组在那个索引节点下。

  • 链表的作用是为了解决Hash冲突,将Hash值一样的对象存放在一个链表中对应的槽位上。

  • 红黑树是JDK8替换节点超过8个的时候的链表用的,主要是提升查询性能。

  • 通过hash碰撞,让HashMap不断产生碰撞,那么相同的key的位置的链表就会不断的增长,当对这个HashMap的响应位置进行查询的时候,就会遍历这个超大的链表,性能会下降,所以改用红黑树。

29.为什么选择红黑树,为什么链表长度到达8之后才去替换成红黑树?

  • 使用红黑树只要是为了提升查询的速度,红黑树是平衡二叉树的一种,插入数据后会通过左旋、右旋、变色等操作来保持平衡,解决单链表查询深度的问题。

  • 二叉树在查找的时候会变成一个线性结构,和原来的链表存在一样深度遍历的问题,所以不是用二叉树。

  • 在数据量少的时候操作数据,遍历线性表比红黑树所消耗的资源少,前期采用线性表,等到一定数量之后才会变成红黑树。

30.了解ConcurrentHashMap吗,为什么性能比HashTable高?

  • ConcurrentHashMap线程安全的Map,采用了分段锁的思想提高性能,锁粒度更细化。HashTable类基本上所有的方法都是采用synchronzied进行线程安全控制,高并发下效率降低。

31.JDK7和JDK8中的ConcurrentHashMap实现有什么区别?

  • JDK8之前,ConcurrentHashMap使用锁分段技术,将数据分成⼀段段存储,每个数据段配置⼀把锁,即segment类,这个类继承ReentrantLock来保证线程安全。

    • 技术点:Segment+HashEntry
  • JKD8的版本取消Segment这个分段锁数据结构,底层也是使⽤Node数组+链表+红⿊树,从而实现对每⼀段数据就行加锁,也减少了并发冲突的概率,CAS(读)+Synchronized(写)。

    • 技术点:Node+Cas+Synchronized

32.Map的遍历方式有哪些?

  • 先通过map.keySet()获取到键,然后根据键获取到值。

  • 通过Map.Entry(String,String)获取,然后使用entry.getKey()获取到键,然后通过entry.getValue()获取到值。

  • 使用Iterator迭代器遍历Map。

  • Map.values()获取所有的value,进行遍历。

33.说下HashMap的put和get的核心逻辑

  • put核心逻辑
    • 首先判断table是否为空或者长度为0,如果是的话进行扩容初始化。
    • 如果为否的话,则进行hash分析命中的那个桶是否有值,如果没有直接插入数据。
    • 如果命中桶中有数据判断key值是否一样,是的话直接覆盖原值。
    • 否则的话,判断是否为树节点,如果是树节点,则直接插入到红黑树。
    • 否则的话,就要遍历链表,判断长度是否大于8,是的话转为红黑树插入。
    • 最后都要判断一下是否需要扩容。
  • get核心流程
    • 先获取首节点,hash碰撞概率小,通常链表第一个节点就是值,没必要去循环遍历。
    • 如果不止一个节点,就要循环遍历了。
    • 判断是红黑树还是链表,在对应的数据结构中查找就行了。

34.说下ConcurrentHashMap的put的核心逻辑

  • 首先key进行重哈希spread(key.hashCode())。
  • 对当前table进行无条件的循环。
  • 如果没有初始化table,则用initTable进行初始化。
  • 如果没有hash冲突,则直接用cas插入新节点,成功后则直接判断是否需要扩容吗,然后结束。
  • 如果是MOVED状态的话,就需要扩容,如果存在hash冲突,利用synchronzied加锁保证线程安全。
  • 如果是链表,则直接遍历插入,如果数量大于8,则需要转成红黑树。
  • 最后是检查一下是否需要扩容。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/367018.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

字节序

字节序 字节序&#xff1a;字节在内存中存储的顺序。 小端字节序&#xff1a;数据的高位字节存储在内存的高位地址&#xff0c;低位字节存储在内存的低位地址 大端字节序&#xff1a;数据的低位字节存储在内存的高位地址&#xff0c;高位字节存储在内存的低位地址 bit ( 比特…

设计模式第八讲:观察者模式和中介者模式详解

一. 观察者模式1. 背景在现实世界中&#xff0c;许多对象并不是独立存在的&#xff0c;其中一个对象的行为发生改变可能会导致一个或者多个其他对象的行为也发生改变。例如&#xff0c;某种商品的物价上涨时会导致部分商家高兴&#xff0c;而消费者伤心&#xff1b;还有&#x…

内网部署api接口文档服务器端口如何让外网访问?

计算机业内人士对于swagger并不陌生&#xff0c; 不少人选择用swagger做为API接口文档管理。Swagger 是一个规范和完整的框架&#xff0c;用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。总体目标是使客户端和文件系统作为服务器以同样的速度来更新文件的方法&#x…

Apache Hadoop生态部署-3台设置的免密登录,xsync分发脚本,jpsall脚本

目录 查看服务架构图-服务分布、版本信息 集群服务器间的免密登录 jpsall集群jps查看脚本 xsync集群分发脚本 查看服务架构图-服务分布、版本信息 系统环境&#xff1a;centos7 Java环境&#xff1a;Java8 集群服务器间的免密登录 作用&#xff1a;这里配置的是root用户…

联想昭阳E5-ITL电脑开机后绿屏怎么U盘重装系统?

联想昭阳E5-ITL电脑开机后绿屏怎么U盘重装系统&#xff1f;有用户电脑正常开机之后&#xff0c;出现了屏幕变成绿屏&#xff0c;无法进行操作的情况。这个问题是系统出现了问题&#xff0c;那么如何去进行问题的解决呢&#xff1f;接下来我们一起来分享看看如何使用U盘重装电脑…

数据库系统概论——绪论

1、绪论 1.1、数据库系统概述 数据库系统的构成示意图 1.1.1、数据库系统基本概念 基本概念&#xff1a;数据、数据库、数据库管理系统和数据库系统 1&#xff09;数据&#xff08;data&#xff09; 定义&#xff1a;描述事物的符号记录称为数据数据是数据库中存储的基本对象…

Latex三线表画法合集

Latex常用表格画法合集 前言 当我们使用Latex写论文的时候&#xff0c;三线表是展示实验结果的常用方法&#xff0c;但网上的方法杂七杂八&#xff0c;找到自己想要的表格需要花费一番功夫。本篇文章旨在记录论文常用表格的画法&#xff0c;方便论文的书写。 导入的包&#x…

11.7 指针和多维数组

C语言学习栏目目录 目录 1 指向多维数组的指针 2 指针的兼容性 3 函数和多维数组 指针和多维数组有什么关系&#xff1f;为什么要了解它们的关系&#xff1f;处理多维数组的函数要用到指针&#xff0c;所以在使用这种函数之前&#xff0c;先要更深入地学习指针。至于第 1 个…

工作实战之系统交互api调用认证设计

目录 前言 一、黄金段位接口交互 二、钻石段位接口交互设计 1.接口文档定义 2.工具类以及demo提供 a.调用方部分代码 b.被调用方 三.星耀段位接口访问设计 1.在钻石段位的基础上&#xff0c;进行sdk的封装 a.maven引入 b.sdk包含工具类 四.王者段位接口访问设计 1.开发详情 2.…

大数据技术为何诞生,它究竟解决了哪些问题?

大数据诞生背景与基本概念大数据为什么会诞生&#xff1f;以及它解决了哪些问题&#xff1f;1.大数据诞生之前的数据处理模式2.结构化数据在传统处理方式下的瓶颈3.非结构化与半结构化数据在传统处理方式下的瓶颈4.大数据诞生的初衷与定义大数据场景特征大数据为什么会诞生&…

day19_Set

今日内容 上课同步视频:CuteN饕餮的个人空间_哔哩哔哩_bilibili 同步笔记沐沐霸的博客_CSDN博客-Java2301 零、 复习昨日 一、作业 二、Set 三、HashSet 四、LinkedHashSet 五、TreeSet 六、Collections 零、 复习昨日 提问过了… 一、作业 见代码… 二、Set Set集合是Collecti…

Mybatis源码笔记

String resource "mybatis-config.xml";Reader reader;try {//将XML配置文件构建为Configuration配置类reader Resources.getResourceAsReader(resource);// 通过加载配置文件流构建一个SqlSessionFactory DefaultSqlSessionFactorySqlSessionFactory sqlMapper …

多点电容触摸屏实验

目录 一、简介 二、硬件原理 ​编辑1、CT_INT 2、I2C2_SCL和I2C2_SDA 3、RESET复位引脚 三、FT54x6/FT52x6电容触摸芯片 四、代码编写 1、编写ft5426.h 2、编写ft5426.c 3、main函数 一、简介 电容屏只需要手指轻触即可&#xff0c;而电阻屏是需要手指给予一定的压力才…

Elasticsearch7.8.0版本进阶——动态更新索引

目录一、如何在保留不变性的前提下实现倒排索引的更新二、按段搜索执行流程三、按段搜索的文档查询四、按段搜索的文档删除五、按段搜索的文档更新一、如何在保留不变性的前提下实现倒排索引的更新 用更多的索引。通过增加新的补充索引来反映最近的修改&#xff0c;而不是直接…

【华为OD机试模拟题】用 C++ 实现 - 整理扑克牌(2023.Q1)

最近更新的博客 华为OD机试 - 入栈出栈(C++) | 附带编码思路 【2023】 华为OD机试 - 箱子之形摆放(C++) | 附带编码思路 【2023】 华为OD机试 - 简易内存池 2(C++) | 附带编码思路 【2023】 华为OD机试 - 第 N 个排列(C++) | 附带编码思路 【2023】 华为OD机试 - 考古…

[Flink]部署模式(看pdf上的放上面)

运行一个wordcountval dataStream: DataStream[String] environment.socketTextStream("hadoop1", 7777) //流式数据不能进行groupBy,流式数据要来一条处理一次.0表示第一个元素,1表示第二个元素 //keyBy(0)根据第一个元素进行分组 val out: DataStream[(String, In…

Spring Boot中使用Sa-Token实现轻量级登录与鉴权

1. Sa-Token 介绍 Sa-Token 是一个轻量级 Java 权限认证框架&#xff0c;主要解决&#xff1a;登录认证、权限认证、单点登录、OAuth2.0、分布式Session会话、微服务网关鉴权 等一系列权限相关问题。 功能结构图 2. 登录认证 对于一些登录之后才能访问的接口&#xff08;例如&…

Graph Embedding基础 图表示学习 什么是Graph Embedding

本文包括 DeepWalk LINE SDNE Node2vec Struc2vec等几个重要的Graph Embedding 方法 先说下不同embedding的区别是什么&#xff1a; DeepWalk&#xff1a;采用随机游走&#xff0c;形成序列&#xff0c;采用skip-gram方式生成节点embedding。node2vec&#xff1a;不同的随机游…

[游戏开发][Unity]Assetbundle打包篇(4)开始打包

上一篇文章讲了如何收集打包资源&#xff0c;得到了一个List<AssetInfo>下面正式进入打包流程&#xff0c;调用PostAssetBuild方法即可开始正式打包流程public void PostAssetBuild() {Debug.Log("------------------------------OnPostAssetBuild-----------------…

ASE140N04-ASEMI低压MOS管ASE140N04

编辑-Z ASE140N04在TO-220F封装里的静态漏极源导通电阻&#xff08;RDS(ON)&#xff09;为4mΩ&#xff0c;是一款N沟道低压MOS管。ASE140N04的最大脉冲正向电流ISM为400A&#xff0c;零栅极电压漏极电流(IDSS)为1uA&#xff0c;其工作时耐温度范围为-55~175摄氏度。ASE140N04…