Java面经(附源码分析)

String、StringBuffer和StringBuilder的区别:

首先String内部的字符数组是使用final修饰,无法修改,每次修改其实是创建一个新的String对象,为了高效字符串操作,引入了StringBuffer和StringBuilder。但StringBuffer的线程是安全的,适合多线程环境下使用,而StringBuilder速度快,但不安全,适合单线程环境下使用。

封装、继承、多态具体含义:

封装:将对象实现细节隐藏,只允许通过公共的接口与外部交互 (数据的安全性,代码可维护性)

继承:子类继承父类后,可获得父类公有的属性和方法(代码的复用性,扩展性)

多态:子类重写父类的方法,将子类对象赋给父类变量,但运行表现子类行为(代码可维护性,解耦合)

String

最多可以放多少个字符?

使用 char[]来维护字符序列的,而char[]的长度是 int类型,所以理论上 String的长度最大为2^31-1,不过根据实际JVM的堆内存限制,编译时,String长度最多可以是2的16次方减2。

源码分析:

substring(int beginIndex, int endIndex)int length = length();//获取当前字符串的长度
checkBoundsBeginEnd(beginIndex, endIndex, length);//判断传入的参数是否合法
/*if (begin < 0 || begin > end || end > length) {throw new StringIndexOutOfBoundsException("begin " + begin + ", end " + end + ", length " + length);
}*/
int subLen = endIndex - beginIndex;//获取截取字符长度
if (beginIndex == 0 && endIndex == length) {//如果起始点为0并且未位置等于当前字符串长度return this;//返回本字符串
}
//否则根据编码方式新建子字符串
return isLatin1() ? StringLatin1.newString(value, beginIndex, subLen): StringUTF16.newString(value, beginIndex, subLen);

public int indexOf(String str)//查找子串,返回第一个找到的索引位置,没找到返回-1

//首先根据编码方式进行判断if (str.length == 0) {//如果查找子串为空返回0return 0;}
if (length(value) < str.length) {//如果子串长度大于当前字符长度肯定找不到返回-1return -1;}
/*src:要搜索的源字节数组。
srcCount:源字节数组中的有效字节数。
tgt:要查找的目标字节数组。
tgtCount:目标字节数组中的有效字节数。
fromIndex:开始搜索的索引位置(包含)*/public static int indexOfLatin1Unsafe(byte[] src, int srcCount, byte[] tgt, int tgtCount, int fromIndex) {//确保数据合法assert fromIndex >= 0;assert tgtCount > 0;assert tgtCount <= tgt.length;assert srcCount >= tgtCount;//转换字符char first = (char)(tgt[0] & 0xff);int max = (srcCount - tgtCount);//获取遍历次数,因为次数大于该值后src子字符串长度小于查找字符串所有肯定不成立for (int i = fromIndex; i <= max; i++) {// 找第一个匹配的字符if (getChar(src, i) != first) {while (++i <= max && getChar(src, i) != first);}// 还在范围内进入ifif (i <= max) {int j = i + 1;int end = j + tgtCount - 1;//尾位置//遍历比对字符是否相同for (int k = 1;j < end && getChar(src, j) == (tgt[k] & 0xff);j++, k++);if (j == end) {// 到达末尾说明找到,直接返回return i;}}}return -1;}

public boolean equals(Object anObject) //与其他字符串比较,看内容是否相同

    public boolean equals(Object anObject) {//判断是否是同一个对象,是则内容肯定相同if (this == anObject) {return true;}//判断该对象是否是String类if (anObject instanceof String) {//根据字符串判断是否一样String aString = (String)anObject;//根据编码方式进行判断if (coder() == aString.coder()) {return isLatin1() ? StringLatin1.equals(value, aString.value): StringUTF16.equals(value, aString.value);}//上述equals方法内代码//如果长度不一样返回falseif (value.length == other.length) {//一个个比较是否相同for (int i = 0; i < value.length; i++) {//不同返回falseif (value[i] != other[i]) {return false;}}return true;}return false;}//不是字符串返回falsereturn false;}

 public int compareTo(String anotherString) //比较字符串大小

   //获取两个字符串长度int len1 = value.length;int len2 = other.length;return compareTo(value, other, len1, len2);public static int compareTo(byte[] value, byte[] other, int len1, int len2) {//获取最短数组长度int lim = Math.min(len1, len2);//遍历for (int k = 0; k < lim; k++) {//不相等即可退出if (value[k] != other[k]) {return getChar(value, k) - getChar(other, k);}}//返回长度差 0——相等 负数——本字符串小于比较的字符串 正数——本字符串大于比较的字符串return len1 - len2;}

public String concat(String str) //字符串连接,返回当前字符串和参数字符串合并结果

        //如果拼接的字符为空,直接退出if (str.isEmpty()) {return this;}//编码格式一样if (coder() == str.coder()) {//将两个字符串转数组byte[] val = this.value;byte[] oval = str.value;//求拼接后长度和int len = val.length + oval.length;//将第一数组copy进去byte[] buf = Arrays.copyOf(val, len);//将第二个数组copy进去System.arraycopy(oval, 0, buf, val.length, oval.length);//通过数组返回新的字符串return new String(buf, coder);}

谢谢观看!

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

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

相关文章

神经网络与深度学习——第6章 循环神经网络

本文讨论的内容参考自《神经网络与深度学习》https://nndl.github.io/ 第6章 循环神经网络 给网络增加记忆能力 延时神经网络 有外部输入的非线性自回归模型 循环神经网络 简单循环网络 循环神经网络的计算能力 循环神经网络的通用近似定理 图灵完备 应用到机器学习 序列到类…

python实现描述统计

数据基础情况 import numpy as np import pandas as pd import matplotlib.pyplot as pyplot pd.options.display.max_rows 10##最多输出10行数据 data_url https://cf-courses-data.s3.us.cloud-object-storage.appdomain.cloud/IBMDeveloperSkillsNetwork-ST0151EN-SkillsN…

[C/C++] -- Libcurl开发

libcurl 是一个功能强大的 C 语言库&#xff0c;用于实现各种网络传输协议的客户端功能。它是 Curl 工具的核心&#xff0c;并提供了一个简单、灵活、高效的 API&#xff0c;允许开发人员在他们的应用程序中轻松地执行网络操作。 以下是 libcurl 的一些主要特点和功能&#xf…

数据整理操作及众所周知【数据分析】

各位大佬好 &#xff0c;这里是阿川的博客&#xff0c;祝您变得更强 个人主页&#xff1a;在线OJ的阿川 大佬的支持和鼓励&#xff0c;将是我成长路上最大的动力 阿川水平有限&#xff0c;如有错误&#xff0c;欢迎大佬指正 Python 初阶 Python–语言基础与由来介绍 Python–…

计算机组成原理·存储系统疑点归纳

组原这门课有点学得不是很懂&#xff0c;现在快考试了&#xff0c;挑几个做错了的题分析、记录一下。 N o . 1 \mathit{No}.1 No.1  x x x、 y y y 为定点整数&#xff0c;其格式为 1 1 1 位符号位、 n n n 位数值位&#xff0c;若采用补码一位乘法实现乘法运算&#xff0c;则…

[AI OpenAI] 推出ChatGPT Edu

一种负担得起的解决方案&#xff0c;帮助大学将AI负责任地引入校园。 我们宣布推出ChatGPT Edu&#xff0c;这是一个专为大学设计的ChatGPT版本&#xff0c;旨在负责任地向学生、教职员工、研究人员和校园运营部署AI。ChatGPT Edu由GPT-4o提供支持&#xff0c;能够跨文本和视觉…

【5】MySQL数据库备份-XtraBackup - 全量备份

MySQL数据库备份-XtraBackup-全量备份 前言环境版本 安装部署下载RPM 包二进制包 安装卸载 场景分析全量备份 | 恢复备份恢复综合 增量备份 | 恢复部分备份 | 恢复 前言 关于数据库备份的一些常见术语、工具等&#xff0c;可见《MySQL数据库-备份》章节&#xff0c;当前不再重…

SpringBoot 单元测试 指定 环境

如上图所示&#xff0c;在配置窗口中添加--spring.profiles.activedev&#xff0c;就可以了。

面试题:SpringBoot启动流程

具体步骤 新建一个Spring应用程序 (new springApplication())&#xff1a; 确认web应用的类型加载ApplicationContextInitializer加载ApplicationListener记录主启动类 运行应用程序&#xff08;.run&#xff09;&#xff1a; 准备环境对象Environment&#xff0c;用于加载…

自监督表示学习和神经音频合成实现语音修复

关键词&#xff1a;语音修复、自监督模型、语音合成、语音增强、神经声码器 语音和/或音频修复的目标是增强局部受损的语音和/或音频信号。早期的工作基于信号处理技术&#xff0c;例如线性预测编码、正弦波建模或图模型。最近&#xff0c;语音/音频修复开始使用深度神经网络&a…

react antd table表格如何获取当前行id

组件库上都有详细的介绍&#xff0c;有自带的一些属性&#xff01;

【EFK日志系统】docker一键部署filebeat、metricbeat

docker一键部署filebeat、metricbeat filebeat部署创建配置文件一键启动修改配置文件查验信息 metricbeat部署创建配置文件一键启动修改配置文件查验信息 上两篇文章写了搭建部署es集群和部署kibana 这篇写一键部署filebeat和metricbeat收集工具 规划服务器是 es01:172.23.16…

PyQt5创建与MySQL数据库集成的应用程序

最近&#xff0c;对之前的mysql管理系统进行了更新升级&#xff0c;制作了一版关于车牌的管理系统&#xff01; &#xff08;1&#xff09;实现了对车牌和用户基本信息的增删改查的功能 &#xff01; &#xff08;2&#xff09;加入了对数据库的刷新和状态显示功能 &#xff…

反向传播算法的详细推导

反向传播算法的详细推导

2024年江苏省大学生程序设计竞赛

Problem I. 整数反应 题意&#xff1a; 有n个整数&#xff0c;从左到右编号1到n&#xff0c;他们有0和1两种颜色&#xff0c;每个整数有且只有一种颜色&#xff0c;将它们按照编号从1到n的顺序依次放入S1&#xff0c;每当一个新整数x放入S1&#xff0c;必须选择与其不同颜色的…

R19 NR移动性增强概况

随着5G/5G-A技术不断发展和业务需求的持续增强&#xff0c;未来网络的部署将不断向高频演进。高频小区的覆盖范围小&#xff0c;用户将面临更为频繁的小区选择、重选、切换等移动性过程。 为了提升网络移动性能和保障用户体验&#xff0c;移动性增强一直是3GPP的热点课题。从NR…

短链接虚拟机环境配置

先进行通用配置 VMware虚拟机中Centos最小化安装后的常用配置 配置MySQL 5.7.x 启动 MySQL 实例,复制对应的配置文件。 docker run --name mysql \ -p 3306:3306 \ -e MYSQL_ROOT_PASSWORD=root \ -d mysql:5.7.36# ~/docker/software/mysql/conf 是本地目录,没有的话需要…

部署Envoy

Envoy常用术语 envoy文档官网 Life of a Request — envoy 1.31.0-dev-e543e1 documentationhttps://www.envoyproxy.io/docs/envoy/latest/intro/life_of_a_request#terminology 基础总结 &#xff08;1&#xff09;Envoy Envoy自己本身是工作在L7层的一个proxy&#xff…

ABP框架+Mysql(一)

生成项目 通过用官网的来生成 Get Started | ABP.IO 配上官网地址&#xff0c;需要注意的是&#xff0c;数据库选择Mysql 选择完成后&#xff0c;执行页面上的两条命令 dotnet tool install -g Volo.Abp.Cli abp new Acme.BookStore -dbms MySQL -csf 生成结束后的内容 单击打…

Windows 安装虚拟机(VMware+Ubuntu18.04)

Windows下虚拟机安装 一、资源下载1.1 VMware安装包下载1.2 Ubuntu镜像下载二、电脑分区三、Vmware安装四、Vmware检查4.1 注册信息查看4.2 检查网络适配器五、Ubuntu安装5.1 创建新的虚拟机5.2 打开虚拟机这是一篇介绍在Windows系统上安装Ubuntu虚拟机的操作教程。 一、资源下…