经常被问道的这些类,佬们能够吊打面试官嘛(适合秋招和小白系列)?

news2024/9/29 11:37:04

前言:
本篇文章主要讲解Java中的几个类常被问到的面试题相关知识。该专栏比较适合刚入坑Java的小白以及准备秋招的大佬阅读。

如果文章有什么需要改进的地方欢迎大佬提出,对大佬有帮助希望可以支持下哦~

小威在此先感谢各位小伙伴儿了😁

在这里插入图片描述

以下正文开始

文章目录

  • Java中的String类
    • String类的特点
    • String类创建对象方式
    • String类常用方法
  • Java中的StringBuffer类
    • StringBuffer类的特点
    • StringBuffer类的方法
  • Java中的StringBuilder类
    • StringBuilder类特点
    • StringBuilder类方法
  • String,StringBuffer,StringBuilder三者之间的区别
  • Java中的包装类
  • 书籍推荐

Java中的String类

首先我们介绍下Java中的String类,它是被final关键字修饰的类,因此不可被继承。String类在Java中是特别常用的类,它提供了许多便捷操作字符串的方法,如字符串拼接、分割、替换、截取、大小写转换等等。

String类的特点

Java中的String类具有以下特点:

  • 不可变性:String类一旦被创建,其内容不可变,任何对String对象的修改都将返回一个新的String对象,原对象的内容不会改变。
  • 线程安全:String类是线程安全的,可以被多个线程共享访问
  • 字符串常量池:String类在内存中维护了一个字符串常量池,使得相同内容的字符串只会在常量池中创建一次,减少了内存的消耗。

String类创建对象方式

在面试的时候面试官经常问到这个问题。下面我们详细介绍下:

Java中创建字符串对象有两种方式

  1. 直接使用双引号创建字符串对象。例如:String str = "Hello, world!";
    这种方式会先检查字符串常量池中是否存在该字符串,如果存在则直接返回该字符串的引用;如果不存在,则在常量池中创建一个新的字符串对象,并返回其引用。

  2. 使用new关键字创建字符串对象。例如:String str = new String("Hello, world!");
    这种方式会在堆上创建一个新的字符串对象,并将指向该对象的引用返回。与第一种方式不同,使用new关键字创建的字符串对象不会进入字符串常量池中,而是直接存储在堆中。

而字符串常量池具有缓存的作用,因此当我们需要频繁创建字符串对象时,可以优先考虑使用直接双引号方式来创建,以提高效率和减少内存占用

String类常用方法

下面是String类的常用方法:

length():返回此字符串的长度。
charAt(int index):返回指定索引处的字符。
substring(intbeginIndex, int endIndex):返回一个新字符串,它是此字符串的子字符串。
equals(Object obj):将此字符串与指定对象进行比较。如果相等,则返回 true;否则返回 false。 indexOf(Stringstr):返回指定子字符串在此字符串中第一次出现的索引。如果没有找到,则返回 -1。 replace(char oldChar, charnewChar):返回一个新的字符串,它是通过用 newChar 替换此字符串中出现的所有 oldChar 得到的。
toLowerCase():使用默认语言环境的规则将此 String 中的所有字符都转换为小写。
toUpperCase():使用默认语言环境的规则将此 String 中的所有字符都转换为大写。

要注意的一点是:由于String对象是不可变的,因此每当我们对一个String对象进行操作时,都会创建一个新的字符串对象。因此,在进行字符串拼接时,建议使用StringBuilder或StringBuffer类来提高效率。

Java中的StringBuffer类

接下来介绍一下StringBuffer类,它是一个可变字符串序列,也就是说,我们可以对它进行添加、插入、删除、修改等操作,使得其内容可以动态地变化。

StringBuffer类的特点

StringBuffer的主要特点如下:

  • 可变性:StringBuffer对象的长度和内容都可以随时改变

  • 线程安全:StringBuffer的方法是同步的,因此在多线程环境下使用时,不用担心出现线程安全问题。

  • 效率较低:由于StringBuffer是一个线程安全的类,因此它的执行效率要比非线程安全的StringBuilder类略低。

  • 支持链式调用:StringBuffer类的方法支持链式调用,这样可以让代码更加简洁易读。

其方法被synchronized关键字修饰:
在这里插入图片描述

StringBuffer类的方法

StringBuffer类提供了一系列的方法,用于对字符串进行操作。其中一些常用的方法如下:

append()方法:用于在字符串末尾添加指定的内容。

insert()方法:用于在字符串的指定位置插入指定的内容。

delete()方法:用于删除字符串中的指定字符序列。

replace()方法:用于替换字符串中的指定字符序列。

reverse()方法:用于将字符串反转。

capacity()方法:用于获取当前对象的容量。

length()方法:用于获取当前对象的长度。

简单介绍下如何使用StringBuffer类拼接字符串:

StringBuffer sb = new StringBuffer();
sb.append("Hello");
sb.append(" ");
sb.append("World!");
System.out.println(sb.toString());

上面的代码结果会输出:Hello World!

Java中的StringBuilder类

StringBuilder也是Java中一个可变的字符串类,可以动态地修改字符串内容而无需像普通String类一样创建新的字符串对象。它的主要作用是在字符串操作的过程中,能够更高效地添加、删除和修改字符串内容,特别是在字符串内容经常改变的情况下比String类更加高效。

StringBuilder类特点

StringBuilder具有以下特点:

  • 可变性:StringBuilder的长度和内容都可变,可以进行动态修改。
  • 线程非安全:由于StringBuilder不是线程安全的,同一时间只能由一个线程访问。
  • 高效性:由于StringBuilder的可变性和具有缓存功能,可以有效地减少内存消耗和执行时间。

调用父类的方法,没有被synchronized关键字修饰,多线程下线程不安全:

在这里插入图片描述

StringBuilder类方法

StringBuilder提供了一些常见的方法,如append、insert、delete、replace等,可以用于字符串的增、删、改、查等操作。它的方法和StringBuffer类的基本一致,这里就不重复介绍啦。

String,StringBuffer,StringBuilder三者之间的区别

String,StringBuilder和StringBuffer都是Java中用来操作字符串的类,它们之间的主要区别如下:

不可变性方面:

String是不可变的,即一旦创建就不能修改它的值,任何对String对象的修改都将返回一个新的String对象,原有的String对象不会改变。

StringBuilder和StringBuffer是可变的,即在操作时可以修改其实例中的值,而不需要创建新的实例对象。StringBuilder和StringBuffer的主要区别在于线程安全问题:StringBuffer是线程安全的,即多个线程同时操作同一个StringBuffer实例时,不会发生数据混乱的问题,而StringBuilder是非线程安全的,即多线程同时操作同一个StringBuilder实例时,可能会发生数据混乱的问题。

性能方面:

由于字符串是不可变的,每次修改都需要创建新的String对象,这样在频繁的字符串操作时就会导致内存占用大、性能下降等问题。

StringBuilder和StringBuffer在字符串拼接、插入、追加等操作时,都是直接对字符串缓冲区进行修改,所以性能要比String好,而StringBuilder又比StringBuffer性能更优。

线程安全方面:

String是线程安全的,即多个线程可以共享同一个String对象,而不会出现数据冲突的问题。

StringBuilder是非线程安全的,在多线程环境下如果不加锁或者其他同步机制会出现数据混乱问题。

StringBuffer是线程安全的,因为它的所有方法都是synchronized的,所以它在多线程环境下是同步的,不会出现数据冲突问题,但是这也导致StringBuffer的性能相对StringBuilder要差。

Java中的包装类

首先可以思考一个问题,Java中为什么会有包装类?

答案是我们都知道,Java是一门面向对象的语言,Java提供的八种基本数据类型不具备对象的特性(基本数据类型是一种特殊的数据类型,它们存储的是值本身,而不是对象。基本数据类型的变量只能存储一个值。我们不能将基本数据类型的变量作为参数传递给方法或者集合。)因此Java为每个基本数据类型都定义了一个引用类型,即包装类。其对应的关系如下:

Integer:用于表示整数值,对应int
Double:用于表示浮点数值,对应double
Boolean:用于表示布尔值,对应boolean
Character:用于表示字符,对应char
Byte:用于表示字节,对应byte
Short:用于表示短整型数值,对应short
Long:用于表示长整型数值,对应long
Float: 用于表示浮点数,对应float

包装类提供了一些常用的方法,方便我们对基本数据类型进行操作。

例如,Integer类提供了parseInt(String s)方法,可以将一个字符串转换成一个整数;Boolean类提供了valueOf(String s)方法,可以将一个字符串转换成一个布尔值。使用包装类可以使我们的程序更加方便和灵活。

更重要的是,包装类还提供了一个重要的特性,即自动装箱和拆箱

自动装箱指的是将基本数据类型自动转换成对应的包装类对象;拆箱则是将包装类对象转换成对应的基本数据类型。这样,我们可以直接使用基本数据类型进行运算,而无需手动转换为包装类对象。

//这些包装类可以通过构造函数或静态方法创建。
Integer i = new Integer(10);
Double d = Double.valueOf("3.14");

//我们也可以通过自动装箱和拆箱来实现将基本数据类型与其相应的包装类进行转换:

// 自动装箱
Integer i = 10;

// 自动拆箱
int j = i;

万事有利亦有弊,在使用包装类时,我们需要注意:

  1. 包装类是不可变的。
  2. 包装类对象之间的比较应该使用equals方法而不是==。
  3. 在将包装类转换为基本数据类型时,如果包装类对象为null,则会抛出NullPointerException异常。

书籍推荐

深入讲解微服务原理,详尽分析分布式原理,解析面试实战真题,助你快速上手微服务架构。
在这里插入图片描述
京东购买链接:点我购买

618,清华社 IT BOOK 多得图书活动开始啦!活动时间为 2023 年 6 月 7 日至 6 月 18 日,清华
社为您精选多款高分好书,涵盖了 C++、Java、Python、前端、后端、数据库、算法与机器学习等多 个 IT
开发领域,适合不同层次的读者。全场 5 折,扫码领券更有优惠哦!快来京东点击链接 IT BOOK
查看详情吧!

粉丝福利:点赞收藏文章,关注博主,任意评论(最多五条),即可参与抽奖。

获奖的欧皇可以49本书中任选一本!!!

文章到这里就先结束了,感兴趣的可以订阅专栏哈,后续会继续分享相关的知识点。

在这里插入图片描述

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

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

相关文章

宏病毒组研究大放异彩!| 凌恩生物1-5月高分宏病毒组文章大盘点!

凌恩生物现已在宏组学、基因组、表观遗传以及蛋白代谢等多组学及联合分析领域积累了深厚经验,打造出成熟的科研服务平台,以优质售前方案和优秀售后服务助力客户在Nature、Science、PNAS、ISME和MIcrobiome等高端国际期刊上发表了大量文章。 伴随着组学技…

【DevOps】Python+Golang(一)

Python is和的区别 is检查两个对象是否是同一个对象,即它们的内存地址是否相同。如果是同一个对象,则返回True,否则返回False。 检查两个对象是否相等,即它们的值是否相同。如果值相同,则返回True,否则返回…

Maven-基础

Maven Maven是专门用于管理和构建Java项目的工具,主要功能有: 提供了一套标准化的项目结构 Maven提供了一套标准化的项目结构,所有的IDE使用Maven构建的项目完全一样 提供了一套标准化的构建流程(编译,测试&#xff0c…

jmeter性能测试进阶使用纪要

目录 目录 随机变量:实现注册手机号不重复分配 正则表达式:token等变量提取 HTTP header manager:token传参Authorization使用 后置BeanShell PostProcessor设置prev.setDataEncoding(“utf-8”):响应中文乱码处理 同步定时…

与AI合作穿越剧 编剧徐婷:AI脑洞大,但无法替代人类的情感表达

热门喜剧秀《周六夜现场》本季提前结束,美剧《亿万》最新第七季的更新搁浅,漫威新电影《新刀锋战士》暂停拍摄……美国影视娱乐行业的编剧们以抵制AI为由的大罢工,开始影响诸多作品的产出,据说造成了100亿美元的损失。 这场罢工已…

深入理解Linux虚拟内存管理(八)

系列文章目录 Linux 内核设计与实现 深入理解 Linux 内核(一) 深入理解 Linux 内核(二) Linux 设备驱动程序(一) Linux 设备驱动程序(二) Linux 设备驱动程序(三&#xf…

Hive企业级调优

Hive企业级调优 调优原则已经在MR优化阶段已经有核心描述,优化Hive可以按照MR的优化思路来执行 优化的主要考虑方面: 环境方面:服务器的配置、容器的配置、环境搭建具体软件配置参数:代码级别的优化 调优的主要原则: ​ 20/80原则非常重要,简单的说80…

骨传导蓝牙耳机排行榜10强,介绍几款不错的户外骨传导耳机

随着骨传导技术的不断发展,骨传导耳机的性能也得到了很大的提升,特别是在音质和佩戴舒适性上,都有了很大的提升。很多人在听音乐的时候,都会佩戴骨传导耳机,因为骨传导耳机具有开放双耳的特点,长时间佩戴也…

Android Jetpack Compose 中的Tabs(TabLayout)

Android Jetpack Compose 中的Tabs(TabLayout) 添加依赖 我们需要依赖于2个 accompanist组件,你可以从下面链接中获取最新版本https://github.com/google/accompanist/tree/main/pager#pager-composable-for-jetpack-compose def accompan…

探索LowLatency的HLS低延迟直播协议

HLS全称为HTTP Live Streaming,其中m3u8作为描述协议,指向一系列切片文件。支持多码流与自适应码率,支持广告无缝播放,支持CMAF协议的低延时直播,也支持CDN动态选择。 我们先看下HLS整体架构,由三部分构成…

莫顿曲线映射 一维到二维的变换 MD(莫顿)码 反向变换 线性四叉树

函数声明&#xff1a; #include <stdio.h> #include <math.h>#define MAXSIZE 200 #define N 8typedef struct //栈的存储结构 {int data[MAXSIZE];int MD[MAXSIZE];int top; }stack1;void stackinitiate(stack1 *s); //初始化栈 void push (s…

【已解决】c++ 读入灰度图进行dft变换报错

报错原因&#xff1a; 1、imread函数读入默认参数为1&#xff0c;即彩色三通道图像&#xff0c;而我们要指定参数为0&#xff0c;读入灰度图像 2、在进行傅里叶变换前要将图像数据类型转为CV_32F&#xff0c;因为默认灰度图像类型为CV_8U 正确代码&#xff1a; #include <…

Vue中如何进行滚动加载与无限滚动?

Vue中如何进行滚动加载与无限滚动&#xff1f; 随着Web应用程序的复杂性和数据量的增加&#xff0c;滚动加载和无限滚动成为了Web开发中常见的需求。在Vue中&#xff0c;我们可以使用一些插件和技术来实现这些功能。 本文将介绍Vue中如何进行滚动加载和无限滚动&#xff0c;包…

内核实现信号捕捉的过程,以及要用到的函数sigaction

1.信号捕捉过程 1.在执行主控制流程的某条指令时因为中断、异常或系统调用进入内核。 2.内核处理完异常准备回用户模式之前先处理当前进程中可以递送的信号。 3.do_signal(); 如果信号的处理动作为自定义的信号处理函数&#xff0c;则回到用户模式执行信号处理函数&#xff08…

prometheus监控应用数据(一)

prometheus监控应用数据(一) 以下代码实现均使用go语言,至于其他语言请参照其他语言的prometheus api文档 获取go package: prometheus: go get -u github.com/prometheus/client_golang/prometheus搭建程序基本骨架 IP地址暂定为: localhost启用prometheus的监控端口是2112以…

互联网大厂Java面试题1500+附答案详解(2023版)

很多 Java 工程师的技术不错&#xff0c;但是一面试就头疼&#xff0c;10 次面试 9 次都是被刷&#xff0c;过的那次还是去了家不知名的小公司。 问题就在于&#xff1a;面试有技巧&#xff0c;而你不会把自己的能力表达给面试官。 应届生&#xff1a;你该如何准备简历&#…

2020310

Selenium: 基于WebDriver协议的 Web应用程序测试的工具 精简版&#xff1a; selenium脚本通过http请求发送命令和参数给httpserver httpserver通过json wire protocol格式转发命令和参数给webdriver webdriver通过原生API或者JavaScript代码执行操作给浏览器 浏览器通过json wi…

材料微观结构表征技术:电子背散射衍射EBSD

材料微观结构表征技术&#xff1a;电子背散射衍射EBSD 电子背散射衍射&#xff08;EBSD&#xff09;是一种材料表征技术&#xff0c;通过使用电子束对材料进行照射&#xff0c;并测量背向散射的电子的衍射模式&#xff0c;可以提供关于材料微观结构的详细信息。这项技术结合了…

DAY 75 【分布式应用】消息队列之卡夫卡 + EFLFK集群部署

pache公司的软件包官方下载地址&#xff1a;archive.apache.org/dist/ 注&#xff1a;kafka从3.0版本之后&#xff0c;不再依赖zookeeper Zookeeper 概述 官方下载地址&#xff1a;https://archive.apache.org/dist/zookeeper/ Zookeeper 定义 Zookeeper是一个开源的分布式…

【Linux脚本篇】循环语句-for

目录 &#x1f341;for的语法格式 &#x1f341;for循环案例 &#x1f343;案例一&#xff1a;循环创建文件 &#x1f343;案例二&#xff1a;应用引号或转义符 &#x1f343;案例三&#xff1a;从变量中取值 &#x1f343;案例四&#xff1a;从命令中取值 &#x1f343;案例五…