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博客

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

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

相关文章

(六)五种最新算法(SWO、COA、LSO、GRO、LO)求解无人机路径规划MATLAB

一、五种算法&#xff08;SWO、COA、LSO、GRO、LO&#xff09;简介 1、蜘蛛蜂优化算法SWO 蜘蛛蜂优化算法&#xff08;Spider wasp optimizer&#xff0c;SWO&#xff09;由Mohamed Abdel-Basset等人于2023年提出&#xff0c;该算法模型雌性蜘蛛蜂的狩猎、筑巢和交配行为&…

【完整项目】双模式答题卡识别软件中YOLO模式的训练部分详解,包括训练填涂区域和手写准考证号,手把手详细教学,可延申拓展训练其他图像数据

目录 前言1. 数据准备2. 数据标注3. 先跑起来Windows下用本地的CPU或GPU训练本地Windows系统连接服务器训练前言 前文:【完整项目】基于Python+Tkinter+OpenCV+Yolo+手写OCR的双模式答题卡识别软件的设计与实现 如果你需要训练自己的答题卡模型,那么请先看上面的文章链接。…

Flutter自定义下拉选择框dropDownMenu

利用PopupMenuButton和PopupMenuItem写了个下拉选择框&#xff0c;之所以不采用系统的&#xff0c;是因为自定义的更能适配项目需求&#xff0c;话不多说&#xff0c;直接看效果 下面直接贴出代码、代码中注释写的都很清楚&#xff0c;使用起来应该很方便&#xff0c;如果有任何…

OpenSSL 编程指南

目录 前言初始化SSL库创建SSL 上下文接口(SSL_CTX)安装证书和私钥加载证书(客户端/服务端证书)加载私钥/公钥加载CA证书设置对端证书验证例1 SSL服务端安装证书例2 客户端安装证书创建和安装SSL结构建立TCP/IP连接客户端创建socket服务端创建连接创建SSL结构中的BIOSSL握手服务…

Scrum

Scrum是一个用于开发和维持复杂产品的框架&#xff0c;是一个增量的、迭代的开发过程。在这个框架中&#xff0c;整个开发过程由若干个短的迭代周期组成&#xff0c;一个短的迭代周期称为一个Sprint&#xff0c;每个Sprint的建议长度是2到4周(互联网产品研发可以使用1周的Sprin…

【Linux】输出缓冲区和fflush刷新缓冲区

目录 一、输出缓冲区 1.1 输出缓冲区的使用 1.2 缓冲区的刷新 1.3 输出缓冲区的作用 二、回车换行 一、输出缓冲区 C/C语言&#xff0c;当调用输出函数&#xff08;如printf()、puts()、fwrite()等&#xff09;时&#xff0c;会给我们提供默认的缓冲区。这些数据先存…

虚拟机安装 hyper—v 沙盒

一、下载系统镜像 1、确认电脑内存在8G及以上并提前准备完整的系统镜像 安装Hyper-V并重启电脑后打开程序选择虚拟机 选择安装位置并设置保留第一代的虚拟参数即可开始分配内存&#xff0c;根据自己的需求进行设置 右键虚拟机启动并开始运行&#xff0c;进行镜像系统的安装便完…

牛客算法心得——环形数组的连续子数组最大和(dp)

大家好&#xff0c;我是晴天学长&#xff0c; 一个找连续子数组最大和的变形题&#xff0c;需要的小伙伴可以关注支持一下哦&#xff01;后续会继续更新的。&#x1f4aa;&#x1f4aa;&#x1f4aa; 1) .环形数组的连续子数组的最大和 描述 给定一个长度为 nn 的环形整数数组&…

『 MySQL数据库 』聚合统计

文章目录 前言 &#x1f951;&#x1f95d; 聚合函数&#x1f353; COUNT( ) 查询数据数量&#x1f353; SUM( ) 查询数据总和&#x1f353; AVG( ) 查询数据平均值&#x1f353; MAX( ) 查询数据最大值&#x1f353; MIN( ) 查询数据最小值 &#x1f95d; 数据分组GROUP BY子句…

湖科大计网:计算机网络概述

一、计算机网络的性能指标 一、速率 有时候数据量也认为是以10为底的&#xff0c;看怎么好算。&#xff08;具体吉大考试用什么待商榷&#xff09; 二、带宽 在模拟信号系统中带宽的含义&#xff0c;本课程中用到的地方是&#xff1a;香农定理和奈奎斯特定理公式的应用之中。 …

全面高压化与全面超快充,破解新能源汽车的时代难题

是什么让新能源车主感到疲惫与焦虑&#xff1f;是什么阻挡更多消费者选择新能源汽车&#xff1f;我们在身边进行一个简单的调查就会发现&#xff0c;问题的答案非常一致&#xff1a;充电。 充电难&#xff0c;充电慢的难题&#xff0c;始终是困扰新能源汽车产业发展&#xff0c…

每日一练【四数之和】

一、题目描述 18. 四数之和 给你一个由 n 个整数组成的数组 nums &#xff0c;和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] &#xff08;若两个四元组元素一一对应&#xff0c;则认为两个四元组重复&#x…

基于ssm社区管理与服务的设计与实现论文

目录 摘 要 1 Abstract 2 第一章 绪论 3 1.1研究背景 3 1.2 研究现状 3 1.3 研究内容 4 第二章 系统关键技术 5 2.1 Java简介 5 2.2 MySql数据库 5 2.3 B/S结构 6 2.4 Tomcat服务器 6 第三章 系统分析 7 3.1可行性分析 7 3.1.1技术可行性 7 3.1.2经济可行性 7 3.1.3运行可行性…

uniapp自定义的日历(纯手写)

效果图&#xff1a; html&#xff1a; <!-- 年月 --><view class"box"><view class"box_time"><view class"time"><image click"lefts" :src"url/uploads/20231206/9d1fb520b12383960dca3c214d84fa0…

LLM之Agent(五)| AgentTuning:清华大学与智谱AI提出AgentTuning提高大语言模型Agent能力

​论文地址&#xff1a;https://arxiv.org/pdf/2310.12823.pdf Github地址&#xff1a;https://github.com/THUDM/AgentTuning 在ChatGPT带来了大模型的蓬勃发展&#xff0c;开源LLM层出不穷&#xff0c;虽然这些开源的LLM在各自任务中表现出色&#xff0c;但是在真实环境下作…

编写Yaml文件当Poc,利用Nuclei扫描器去扫描漏洞

编写Yaml文件当Poc,利用Nuclei扫描器去扫描漏洞 YAML是一种数据序列化语言&#xff0c;它的基本语法规则注意如下&#xff1a; -大小写敏感 -使用缩进表示层级关系 -缩进时不允许使用Tab键&#xff0c;只允许使用空格。 -缩进的空格数目不重要&#xff0c;只要相同层级的元…

VSCode如何设置Vue前端的debug调试

vscode在调试vue.代码时&#xff0c;如何进行debug? 1.安装Chrome Debug插件。 2.在launch.json中&#xff0c;将url修改成你前端项目的路径&#xff1a; 1 {2 // Use IntelliSense to learn about possible attributes.3 // Hover to view descriptions of existing att…

redis 三主三从高可用集群docker swarm

由于数据量过大&#xff0c;单个Master复制集难以承担&#xff0c;因此需要对多个复制集进行集群&#xff0c;形成水平扩展每个复制集只负责存储整个数据集的一部分&#xff0c;这就是Redis的集群&#xff0c;其作用是提供在多个Redis节点间共享数据的程序集。 官网介绍地址 re…

Elasticsearch:向量数据库的真相

通过工作示例了解什么是向量数据库、它们如何实现 “相似性” 搜索以及它们可以在明显的 LLM 空间之外的哪些地方使用。除非你一直生活在岩石下&#xff0c;否则你可能听说过诸如生成式人工智能和大型语言模型&#xff08;LLM&#xff09;之类的术语。 除此之外&#xff0c;你很…

如何利用Axure制作移动端产品原型

Axure是一款专业的快速原型设计工具&#xff0c;作为专业的原型设计工具&#xff0c;Axure 能够快速、高效地创建原型&#xff0c;同时支持多人协作设计和版本控制管理。它已经得到了许多大公司的采用&#xff0c;如IBM、微软、思科、eBay等&#xff0c;这些公司都利用Axure 进…