Java面试遇到的一些常见题

目录

1. Java语言有几种基本类型,分别是什么?

整数类型(Integer Types):

浮点类型(Floating-Point Types):

字符类型(Character Type):

布尔类型(Boolean Type):

2. int[]类型是不是基本类型?

3. 什么是128陷阱?什么是装箱?什么是拆箱?为什么要有包装类?

128 位整数陷阱(128-bit Integer Trap):

装箱和拆箱(Boxing and Unboxing):

包装类(Wrapper Classes):

为什么要有包装类?:

4. 位运算有哪几种?

按位与(&):

按位或(|):

按位异或(^):

取反(~):

左移(<<):

右移(>>):

无符号右移(>>>):

5. “>>”和”>>>”的区别是什么?

>> 右移操作符:

>>> 无符号右移操作符:

6. String类的常用函数有哪些?列举十种。

length() 方法:

charAt(int index) 方法:

substring(int beginIndex) 和 substring(int beginIndex, int endIndex) 方法:

concat(String str) 方法:

indexOf(String str) 和 indexOf(String str, int fromIndex) 方法:

toUpperCase() 和 toLowerCase() 方法:

trim() 方法:

startsWith(String prefix) 和 endsWith(String suffix) 方法:

replace(char oldChar, char newChar) 和 replace(CharSequence target, CharSequence replacement) 方法:

split(String regex) 方法:

7. String和StringBuffer,StringBuilder的区别有哪些?所有类名包含Buffer的类的内部实现原理是什么?有什么优势?

String 类:

StringBuffer 类:

StringBuilder 类:

优势:

8. String字符串的不可变是指哪里不可变?

值不可变:

长度不可变:

        不可变性的好处:

9. 字符串常量池是什么?不同的JDK版本都分别位于哪个区域?

10. Java异常类有哪些?分别管理什么异常?

检查异常(Checked Exception):

非检查异常(Unchecked Exception):

我的其他博客


1. Java语言有几种基本类型,分别是什么?

在Java中,基本数据类型分为两大类:原始数据类型(Primitive Data Types)和引用数据类型(Reference Data Types)。原始数据类型又分为四类:整数类型、浮点类型、字符类型和布尔类型。

  1. 整数类型(Integer Types):

    • byte:8位,有符号,范围为-128到127。
    • short:16位,有符号,范围为-32,768到32,767。
    • int:32位,有符号,范围为-2^31到2^31-1。
    • long:64位,有符号,范围为-2^63到2^63-1。
  2. 浮点类型(Floating-Point Types):

    • float:32位,单精度浮点数。
    • double:64位,双精度浮点数。
  3. 字符类型(Character Type):

    • char:16位,无符号,表示Unicode字符。
  4. 布尔类型(Boolean Type):

    • boolean:表示逻辑值,只能取truefalse

这些基本数据类型是Java语言的基础,用于存储简单的数据值。在Java中,对象都是引用数据类型,包括类、接口、数组等。这些基本数据类型具有不同的大小和范围,根据需要选择合适的类型来存储数据。

2. int[]类型是不是基本类型?

不是,int[] 不是基本数据类型,而是一种引用数据类型。在Java中,数组是一种引用数据类型,它可以包含基本数据类型的元素或其他引用类型的元素。int[] 表示一个整数类型的数组,其中的元素都是 int 类型。

基本数据类型是存储简单数值的类型,而引用数据类型是用来存储对象引用的类型。基本数据类型直接包含数据值,而引用数据类型包含对存储在内存中的对象的引用。

当你声明一个 int[] 类型的数组时,实际上创建了一个对象,该对象存储了一组整数,并且变量(数组名)存储的是对该对象的引用。因此,int[] 是引用数据类型,而不是基本数据类型。

3. 什么是128陷阱?什么是装箱?什么是拆箱?为什么要有包装类?

128 位整数陷阱(128-bit Integer Trap):

Java 中的基本数据类型 long 是 64 位的,而在某些场景下需要表示更大的整数值,比如超过 Long.MAX_VALUE。在这种情况下,有时候会考虑使用 BigInteger 类,它可以表示任意大小的整数,但由于其灵活性和大数计算的特性,性能可能相对较低,而且在处理一些常规整数时不如基本数据类型高效。

装箱和拆箱(Boxing and Unboxing):

  • 装箱: 将基本数据类型转换为对应的包装类对象。例如,将 int 装箱为 Integer
  • 拆箱: 将包装类对象转换为对应的基本数据类型。例如,将 Integer 拆箱为 int
// 装箱
int primitiveInt = 42;
Integer boxedInt = Integer.valueOf(primitiveInt);

// 拆箱
int unboxedInt = boxedInt.intValue();
  1. 包装类(Wrapper Classes):

  2. Java 提供了一组包装类,用于将基本数据类型转换为对象,以便在需要对象的上下文中使用。以下是常见的包装类:

    • Boolean:对应基本数据类型 boolean
    • Byte:对应 byte
    • Short:对应 short
    • Integer:对应 int
    • Long:对应 long
    • Float:对应 float
    • Double:对应 double
    • Character:对应 char

    通过使用包装类,可以在需要对象的情况下使用基本数据类型,也可以在集合类中存储基本数据类型,因为集合类通常只能存储对象。

  3. 为什么要有包装类?:

    • 对象化: 在需要对象而基本数据类型不够时,可以使用包装类将其转化为对象。
    • 集合框架: 集合类(如 ListSetMap 等)只能存储对象,因此需要包装类来存储基本数据类型的值。
    • 泛型: 泛型也要求使用对象,而不是基本数据类型。

    包装类提供了一种将基本数据类型转换为对象的方式,使得在某些情况下,可以方便地在面向对象的环境中使用基本数据类型。同时,自动装箱和拆箱的特性使得在基本数据类型和其对应的包装类之间进行转换更加方便。

 

 

4. 位运算有哪几种?

位运算是一种对二进制位进行操作的运算,Java 提供了几种常见的位运算操作符:

  1. 按位与(&):

    • 两个相应的位都为1时,结果为1;否则,结果为0。
  2. 按位或(|):

    • 两个相应的位只要有一个为1,结果就为1;否则,结果为0。
  3. 按位异或(^):

    • 两个相应的位不同,结果为1;相同,结果为0。
  4. 取反(~):

    • 每个位上的0变成1,1变成0。
  5. 左移(<<):

    • 将操作数的所有位向左移动指定的次数,右侧空出的位用0填充。
  6. 右移(>>):

    • 将操作数的所有位向右移动指定的次数,左侧空出的位根据符号位(正数补0,负数补1)或者补0进行填充。
  7. 无符号右移(>>>):

    • 将操作数的所有位向右移动指定的次数,左侧空出的位总是用0填充。

这些位运算操作符可以用于执行一些底层的位级操作,如掩码、权限控制、压缩存储等。在一些特定的场景中,位运算可以提高程序的执行效率。

5. “>>”和”>>>”的区别是什么?

>>>>> 都是右移操作符,但它们在处理带符号整数和无符号整数时有一些区别。

  1. >> 右移操作符:

    int x = -8;
    System.out.println(x >> 1);  // 结果为 -4
    
    • 对于正数,>>>>> 的效果相同,都是将所有位右移,左侧空出的位用0填充。
    • 对于负数,>> 采用“算术右移”,即将所有位右移,左侧空出的位用符号位填充(即保持符号位不变)。

>>> 无符号右移操作符:

>>> 无符号右移操作符:

无论正数还是负数,>>> 都是采用“逻辑右移”,即将所有位右移,左侧空出的位总是用0填充。
  • 无论正数还是负数,>>> 都是采用“逻辑右移”,即将所有位右移,左侧空出的位总是用0填充。

6. String类的常用函数有哪些?列举十种。

String 类是 Java 中用来表示字符串的类,它提供了许多常用的方法来操作字符串。以下是 String 类的一些常用方法,其中列举了十种:

length() 方法:

  • 返回字符串的长度,即包含的字符数。

charAt(int index) 方法:

  • 返回字符串中指定索引位置的字符。

substring(int beginIndex)substring(int beginIndex, int endIndex) 方法:

  • substring(int beginIndex) 返回从指定索引开始到字符串末尾的子字符串。
  • substring(int beginIndex, int endIndex) 返回从指定索引开始到指定索引结束之前的子字符串。

concat(String str) 方法:

  • 将指定字符串连接到该字符串的末尾。

indexOf(String str)indexOf(String str, int fromIndex) 方法:

  • indexOf(String str) 返回指定子字符串在该字符串中第一次出现的索引。
  • indexOf(String str, int fromIndex) 从指定的索引位置开始,返回指定子字符串在该字符串中第一次出现的索引

toUpperCase()toLowerCase() 方法:

  • toUpperCase() 将字符串中的所有字符转换为大写。
  • toLowerCase() 将字符串中的所有字符转换为小写。

trim() 方法:

  • 返回一个字符串,删除了原字符串开头和末尾的所有空格。

startsWith(String prefix)endsWith(String suffix) 方法:

  • startsWith(String prefix) 判断字符串是否以指定的前缀开始。
  • endsWith(String suffix) 判断字符串是否以指定的后缀结束。

replace(char oldChar, char newChar)replace(CharSequence target, CharSequence replacement) 方法:

  • replace(char oldChar, char newChar) 替换字符串中的所有指定字符。
  • replace(CharSequence target, CharSequence replacement) 替换字符串中的所有指定字符序列。

split(String regex) 方法:

  • 使用给定的正则表达式拆分字符串,返回一个字符串数组。

7. String和StringBuffer,StringBuilder的区别有哪些?所有类名包含Buffer的类的内部实现原理是什么?有什么优势?

StringStringBufferStringBuilder 是 Java 中用于处理字符串的三个主要类,它们有一些关键的区别,主要体现在可变性、线程安全性和性能上。

String 类:

在选择使用 StringStringBufferStringBuilder 时,需要根据具体的需求来决定。如果在多线程环境下,需要线程安全性,则选择 StringBuffer;如果在单线程环境下,并且不需要线程安全性,则选择 StringBuilder,由于 StringBuilder 不进行同步,因此性能更好。如果字符串是常量,不需要修改,则选择 String

  • 不可变性: 字符串是不可变的,一旦创建,内容无法修改。
  • 线程安全: 由于字符串是不可变的,所以是线程安全的。
  • 性能: 由于不可变性,每次对字符串进行修改都会创建一个新的字符串对象,可能导致性能开销。

    StringBuffer 类:

  • 可变性: 字符串缓冲区,可以修改其中的内容。
  • 线程安全: StringBuffer 是线程安全的,各个方法都进行了同步处理。
  • 性能: 在多线程环境下使用时,相对于 StringBuilder,由于同步处理,性能稍逊一筹。

    StringBuilder 类:

  • 可变性: 字符串生成器,可以修改其中的内容。
  • 线程安全: StringBuilder 是非线程安全的,不进行同步处理。
  • 性能: 在单线程环境下,由于不进行同步处理,性能较好。

    关于所有类名包含 "Buffer" 的类的内部实现原理,通常这些类都是基于缓冲区(Buffer)实现的。缓冲区是一块临时存储区域,用于临时保存数据,提高读写的效率。这些类通常使用数组作为底层数据结构,通过对数组的操作来实现对字符串的修改。缓冲区的使用可以避免频繁的对象创建和销毁,从而提高字符串操作的效率。

    优势:

  • 性能: StringBufferStringBuilder 通过使用可变的缓冲区,避免了频繁的对象创建和销毁,提高了字符串操作的性能。
  • 灵活性: 可以方便地对字符串进行修改,而不需要创建新的字符串对象。

8. String字符串的不可变是指哪里不可变?

字符串的不可变性是指在创建之后,字符串对象的内容不可被修改。具体来说,不可变性表现在以下几个方面:

值不可变:

一旦字符串对象被创建,其中的字符序列不可更改。

长度不可变:

字符串的长度在创建后也是不可变的。无法通过直接修改字符串对象来改变其长度。

        不可变性的好处:

  • 线程安全性: 由于字符串是不可变的,多个线程可以安全地共享字符串对象,而无需担心修改冲突。

  • 安全性: 字符串不可变性提供了一定的安全性,因为它们无法在创建后被意外地修改。

  • 缓存: 由于字符串的不可变性,可以进行一些优化,例如字符串常量池的使用,以及缓存哈希码等。

 

9. 字符串常量池是什么?不同的JDK版本都分别位于哪个区域?

字符串常量池(String Constant Pool)是 Java 中用于存储字符串常量的一个特殊的内存区域。字符串常量池的目的是提高字符串的重用性,减少内存的占用。

在 Java 中,字符串常量池位于方法区(Method Area),这是一种线程共享的内存区域,存储了类的结构信息、静态变量、常量池等数据。

不同的 JDK 版本中,字符串常量池的具体位置可能有所变化:

  1. JDK 6 及之前:

    • 字符串常量池位于永久代(Permanent Generation)中。
  2. JDK 7 和 JDK 8:

    • JDK 7 中还是位于永久代。
    • JDK 8 引入了元空间(Metaspace),替代了永久代。字符串常量池被移至堆中,与堆共享内存。
  3. JDK 9 及之后:

    • JDK 9 进一步改进了内存模型,移除了永久代,完全采用元空间,字符串常量池仍然位于堆中。

在 JDK 7 和 JDK 8 中,字符串常量池的移动到堆中的改变,是为了解决永久代内存泄漏的问题。元空间的引入进一步改善了类的元信息存储机制,避免了永久代的一些限制和问题。

请注意,由于不同的 JDK 实现和配置可能有所不同,具体的内存区域分配情况可能会有一些变化。上述描述主要是针对 Oracle JDK 和 OpenJDK 的情况。

10. Java异常类有哪些?分别管理什么异常?

Java 中的异常分为两大类:检查异常(Checked Exception)和非检查异常(Unchecked Exception)。

检查异常(Checked Exception):

  1. IOException:

    • 用于处理输入输出操作中可能发生的异常,如文件读写等。
  2. FileNotFoundException:

    • 继承自 IOException,表示尝试打开一个不存在的文件时抛出的异常。
  3. ParseException:

    • 通常用于处理字符串解析为日期等格式时可能发生的异常。
  4. SQLException:

    • 用于处理与数据库相关的异常。
  5. ClassNotFoundException:

    • 在使用 Class 类的 forName 方法时,如果指定的类不存在,会抛出此异常。

非检查异常(Unchecked Exception):

  1. RuntimeException:

    • 这是一个非常常见的非检查异常的父类,包括以下几种:
      • ArithmeticException: 用于处理算术运算中可能发生的异常,如除以零。
      • NullPointerException: 表示对一个对象调用方法、访问字段或数组元素时,对象引用为 null。
      • ArrayIndexOutOfBoundsException: 表示数组下标越界。
      • IndexOutOfBoundsException: 表示索引越界,通常由于集合操作中的错误使用引起。
      • IllegalArgumentException: 表示传递给方法的参数值不合法。
      • IllegalStateException: 表示对象的状态不合法。
      • NumberFormatException: 表示字符串转换为数字时的格式错误。
      • ConcurrentModificationException: 在使用迭代器遍历集合的过程中,如果集合的结构发生变化,会抛出此异常。
  2. NullPointerException:

    • 虽然 NullPointerException 属于 RuntimeException 的子类,但由于其普遍性,特别列出。
    • 表示对一个对象调用方法、访问字段或数组元素时,对象引用为 null。
  3. ArrayIndexOutOfBoundsException:

    • 同样属于 RuntimeException 的子类,表示数组下标越界。

这些异常类用于处理在程序运行期间可能出现的各种错误状况。检查异常在编译期强制处理,程序员必须捕获或声明抛出,而非检查异常通常是运行时异常,程序员可以选择捕获和处理,也可以不处理。

我的其他博客

简单介绍一些其他的树-CSDN博客

认识二叉树(详细介绍)-CSDN博客

正则表达式详细讲解-CSDN博客

低代码开发:创新之道还是软件开发的捷径?-CSDN博客

HTTP与HTTTPS的区别-CSDN博客

什么情况下会产生StackOverflowError(栈溢出)和OutOfMemoryError(堆溢出)怎么排查-CSDN博客

在多线程中sleep()和wait()的区别(详细)-CSDN博客

谈谈我对HashMap扩容机制的理解及底层实现-CSDN博客

堆排序详细讲解(一文足矣JAVA)-CSDN博客

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Unity中Batching优化的GPU实例化(4)

文章目录 前言一、构建需要实例化的额外数据二、在顶点着色器&#xff0c;将实例化 ID 从 appdata 存入 v2f 传给片元着色器三、在片断着色器中访问具体的实例化变量三、使用代码修改Shader材质属性&#xff0c;实现GPU实例化后不同对象颜色不同的效果1、在C#测试脚本生成小板凳…

Redis 环境搭建2

文章目录 第2关&#xff1a;使用 Redis 第2关&#xff1a;使用 Redis 本文是接着上篇文章写的第二关代码&#xff0c;部分人再进入第二关时不会保留第一关的配置的环境&#xff0c;可以通过下面一句代码进行检验。 redis-cli -p 7001 -c如果进入到了redis界面就是有环境&…

Android 分享小结

关于作者&#xff1a;CSDN内容合伙人、技术专家&#xff0c; 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 &#xff0c;擅长java后端、移动开发、商业变现、人工智能等&#xff0c;希望大家多多支持。 目录 一、导读二、微信 分享 三、 QQ 、QQ空间&#xff08;Qz…

2024 年顶级的 Android 系统修复软件与方法

您是否正在寻找可以修复 PC 上 Android 操作系统的工具&#xff1f;这是我们精选的最好的 Android 系统修复软件&#xff01; Android 是世界著名的智能手机操作系统。全世界有数百万人使用这个操作系统&#xff0c;这使得它安全可靠。然而&#xff0c;这仍然不能使它完美无缺…

STM32之SPI总线

一、SPI总线概述 1、SPI总线介绍 SPI是一种通信协议&#xff0c;它是摩托罗拉公司研发出来的一种通信协议&#xff0c;就有自己的特点&#xff08;串行&#xff0c;并行&#xff0c;单工&#xff0c;半双工&#xff0c;全双工&#xff0c;同步异步&#xff09;。它主要应用于音…

Kotlin Flow 操作符

前言 Kotlin 拥有函数式编程的能力&#xff0c;使用Kotlin开发&#xff0c;可以简化开发代码&#xff0c;层次清晰&#xff0c;利于阅读。 然而Kotlin拥有操作符很多&#xff0c;其中就包括了flow。Kotlin Flow 如此受欢迎大部分归功于其丰富、简洁的操作符&#xff0c;巧妙使…

【头歌系统数据库实验】实验8 SQL的复杂多表查询-2

目录 第1关&#xff1a;基于派生表查询每个队员解答中超过他平均memory的user_id及题目编号problem_id 第2关&#xff1a;用ANY/ALL实现查询2019级选手&#xff08;user_id前4位为2019&#xff09;满足比2020级其中一个选手注册时间早即可的选手 第3关&#xff1a;用聚集查询…

【MySQL】MySQL 在 Centos 7环境安装教程

文章目录 1.卸载不要的环境2.检查系统安装包3.获取mysql官方yum源4.安装mysql yum 源&#xff0c;对比前后yum源5.安装mysql服务6.查看配置文件和数据存储位置7.启动服务和查看启动服务8.登录9.配置my.cnf 1.卸载不要的环境 先检查是否有mariadb存在 ps ajx |grep mariadb如果…

【Linux】系统初识之冯诺依曼体系结构与操作系统

&#x1f440;樊梓慕&#xff1a;个人主页 &#x1f3a5;个人专栏&#xff1a;《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C》《Linux》 &#x1f31d;每一个不曾起舞的日子&#xff0c;都是对生命的辜负 目录 前言 1.冯诺依曼体系结构 2.操作…

文章解读与仿真程序复现思路——电力系统自动化EI\CSCD\北大核心《考虑电力-交通交互的配电网故障下电动汽车充电演化特性》

这个标题涉及到电力系统、交通系统和电动汽车充电的复杂主题。让我们逐步解读&#xff1a; 考虑电力-交通交互的配电网故障&#xff1a; 电力-交通交互&#xff1a; 指的是电力系统和交通系统之间相互影响、相互关联的关系。这可能涉及到电力需求对交通流量的影响&#xff0c;反…

爬虫解析-jsonpath (六)

jsonpath只能解析本地文件 jsonpath的使用&#xff1a; obj json.load(open(.json文件,r,encodingutf-8))place_name jsonpath.jsonpath(obj, json语法) 目录 1.安装jsonpath 2.Xpath和jsonpath的语法对比 练习&#xff1a;使用jsonpath解析JSON文件 3.使用jsonpath抓取…

C语言实现快速排序

完整代码&#xff1a; #include<stdio.h>//用第一个元素将待排序序列划分成左右两个部分&#xff0c;返回排序后low的位置&#xff0c;即枢轴的位置 int partition(int arr[],int low,int high){//让待排序序列中的第一个元素成为基准int pivotarr[low];//lowhigh代表一…

计算机科学与技术认识实习【报告】

一、实习目的 此次认识实习主要面对计算机科学与技术专业的同学&#xff0c;了解专业在未来的发展趋势&#xff0c;通过观看公司的介绍视频和技术发展情况招聘信息后的感想和学习体会等多种方式&#xff0c;使我们了解本专业相关领域的发展现状&#xff0c;让我们在校园内课堂上…

【动态规划】【广度优先】LeetCode2258:逃离火灾

作者推荐 本文涉及的基础知识点 二分查找算法合集 动态规划 二分查找 题目 给你一个下标从 0 开始大小为 m x n 的二维整数数组 grid &#xff0c;它表示一个网格图。每个格子为下面 3 个值之一&#xff1a; 0 表示草地。 1 表示着火的格子。 2 表示一座墙&#xff0c;你跟…

极智一周 | AI 算力国产化、通义开源、Gemini、鸿蒙、蔚来 And so on

欢迎关注我的公众号 [极智视界]&#xff0c;获取我的更多技术分享 大家好&#xff0c;我是极智视界&#xff0c;带来本周的 [极智一周]&#xff0c;关键词&#xff1a;AI 算力国产化、通义开源、Gemini、鸿蒙、蔚来 And so on。 邀您加入我的知识星球「极智视界」&#xff0c;…

【Linux】make/Makefile --- 自动化构建项目的工具

目录 一、make/Makefile的简单使用 二、Makefile 的语法规则 三、实现的原理 3.1 make/Makefile识别文件新旧 3.2 .PHONY修饰的伪目标总是被执行 3.3 make/Makefile是具有依赖性的推导能力的 四、语法技巧 五、注意事项 Linux中自动化构建项目最简单的方式&#xff1a;…

Linux系统---简易伙伴系统

顾得泉&#xff1a;个人主页 个人专栏&#xff1a;《Linux操作系统》 《C/C》 《LeedCode刷题》 键盘敲烂&#xff0c;年薪百万&#xff01; 一、题目要求 1.采用C语言实现 2.伙伴系统采用free_area[11]数组来组织。要求伙伴内存最小为一个页面&#xff0c;页面大小为4KB…

C语言习题

写一个函数&#xff0c;输入一个四位数字&#xff0c;要求输出这四个数字字符&#xff0c;但每两个数字间空一个空格。如输入1990&#xff0c;输出1 9 9 0 如下&#xff1a; #include<stdio.h> void Print(int n) { if(n>9) { Print(n/10); } printf("%d "…

ssm的健身房预约系统(有报告)。Javaee项目。ssm项目。

演示视频&#xff1a; ssm的健身房预约系统&#xff08;有报告&#xff09;。Javaee项目。ssm项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过Spring Spring…

【trino权威指南】使用trino详解:trino client安装、查询sql、DBeaver连接trino、java通过JDBC连接trino

文章目录 一. Trino CLI1. 安装client2. 使用client执行sql 二. JDBC driver 连接Trino1. 通过DBeaver用户界面连接2. JDBC Driver in java2.1. 环境配置2.2. 注册和配置driver2.3. 连接参数2.4. 查询例子 一. Trino CLI 1. 安装client Trino CLI提供了一个基于终端的交互式s…