从源码分析String类中的常用方法,2024年最新java软件开发面试题目

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024b (备注Java)
img

正文

public String(byte bytes[]) {

this(bytes, 0, bytes.length);

}

复制代码

  • String(byte[] bytes, Charset charset):构造一个新的String由指定用指定的字节的数组解码charset 。

public String(byte bytes[], Charset charset) {

this(bytes, 0, bytes.length, charset);

}

复制代码

  • String(char value[]):分配一个新的 String ,以便它表示当前包含在字符数组参数中的字符序列。

public String(char value[]) {

this.value = Arrays.copyOf(value, value.length);

}

复制代码

  • String(StringBuffer buffer):分配一个新的字符串,其中包含当前包含在buffer参数中的字符序列。

public String(StringBuffer buffer) {

synchronized(buffer) {

this.value = Arrays.copyOf(buffer.getValue(), buffer.length());

}

}

复制代码

  • String(StringBuilder builder):分配一个新的字符串,其中包含当前包含在builder参数中的字符序列。

public String(StringBuilder builder) {

this.value = Arrays.copyOf(builder.getValue(), builder.length());

}

复制代码

1.char charAt(int index)

========================

返回字符串中指定索引index处的字符。

public char charAt(int index) {

if ((index < 0) || (index >= value.length)) {

throw new StringIndexOutOfBoundsException(index);

}

return value[index];

}

复制代码

其中value的定义如下:

/** The value is used for character storage. */

private final char value[];

复制代码

String类的一个构造方法为:

public String(String original) {

this.value = original.value;

this.hash = original.hash;

}

复制代码

可见,String在底层实际上是由一个用final关键字修饰的不可变的字符数组存储的。 String.charAt(index)就是返回value[index]。

2.int compareTo(String anotherString)

=====================================

逐个字符比较两个字符串,如果第一个字符和参数的第一个字符相等,则以第二个字符和参数的第二个字符做比较,以此类推,直至不等为止,返回该字符的ASCII码差值。 如果两个字符串不一样长,可对应字符又完全一样,则返回两个字符串的长度差值。

  • @param anotherString the {@code String} to be compared.

  • @return the value {@code 0} if the argument string is equal to

  •      this string; a value less than {@code 0} if this string
    
  •      is lexicographically less than the string argument; and a
    
  •      value greater than {@code 0} if this string is
    
  •      lexicographically greater than the string argument.
    

*/

public int compareTo(String anotherString) {

int len1 = value.length;

int len2 = anotherString.value.length;

int lim = Math.min(len1, len2);

char v1[] = value;

char v2[] = anotherString.value;

int k = 0;

while (k < lim) { //逐个字符比较

char c1 = v1[k];

char c2 = v2[k];

if (c1 != c2) {

return c1 - c2; //同位置的字符不相等,返回该字符的ASCII码差值

}

k++;

}

return len1 - len2; //两个字符串不一样长,可对应字符又完全一样,则返回两个字符串的长度差值

}

复制代码

3.String concat(String str)

===========================

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

  • @param str the {@code String} that is concatenated to the end

  •            of this {@code String}.
    
  • @return a string that represents the concatenation of this object’s

  •      characters followed by the string argument's characters.
    

*/

public String concat(String str) {

if (str.isEmpty()) {

return this;

}

int len = value.length;

int otherLen = str.length();

char buf[] = Arrays.copyOf(value, len + otherLen);

str.getChars(buf, len);

return new String(buf, true);

}

复制代码

4.boolean contains(CharSequence s)

==================================

当且仅当此字符串中包含指定的CharSequence 时才返回true。

  • @param s the sequence to search for

  • @return true if this string contains {@code s}, false otherwise

  • @since 1.5

*/

public boolean contains(CharSequence s) {

return indexOf(s.toString()) > -1;

}

复制代码

其中CharSequence是一个描述字符串结构的接口,像String、StringBuilder、StringBuffer都是它的子接口。

5.boolean startsWith(String prefix, int toffset)

================================================

测试在指定索引处开始的此字符串的子字符串是否以指定的前缀开头。 toffset为指定开始索引

public boolean startsWith(String prefix, int toffset) {

char ta[] = value;

int to = toffset;

char pa[] = prefix.value;

int po = 0;

int pc = prefix.value.length;

// Note: toffset might be near -1>>>1.

if ((toffset < 0) || (toffset > value.length - pc)) {

return false;

}

while (–pc >= 0) {

if (ta[to++] != pa[po++]) {

return false;

}

}

return true;

}

复制代码

6.boolean endsWith(String suffix)

=================================

测试此字符串是否以指定的后缀结尾。

public boolean endsWith(String suffix) {

//调用startsWith方法,相当从value.length - suffix.value.length索引处比较

return startsWith(suffix, value.length - suffix.value.length);

}

复制代码

7.boolean equals(Object anObject)

=================================

将此字符串与指定对象进行比较。

public boolean equals(Object anObject) {

if (this == anObject) {

return true;

}

if (anObject instanceof String) {

String anotherString = (String)anObject;

int n = value.length;

if (n == anotherString.value.length) {

char v1[] = value;

char v2[] = anotherString.value;

int i = 0;

while (n-- != 0) {

if (v1[i] != v2[i])

return false;

i++;

}

return true;

}

}

return false;

}

复制代码

8.String format(String format, Object… args)

==============================================

使用指定的格式字符串和参数返回格式化的字符串。

9.byte[] getBytes()

=====================

使用平台的默认字符集将此 String编码为字节序列,将结果存储到新的字节数组中。

public byte[] getBytes() {

return StringCoding.encode(value, 0, value.length);

}

复制代码

10.int hashCode()

=================

返回此字符串的哈希码。

public int hashCode() {

int h = hash;

if (h == 0 && value.length > 0) {

char val[] = value;

for (int i = 0; i < value.length; i++) {

h = 31 * h + val[i];

}

hash = h;

}

return h;

}

复制代码

11.int indexOf(int ch)

======================

返回指定字符第一次出现的字符串内的索引。

12.int lastIndexOf(int ch)

==========================

返回指定字符的最后一次出现的字符串中的索引。

13.boolean isEmpty()

====================

当且仅当length()为0时返回true。

public boolean isEmpty() {

return value.length == 0;

}

复制代码

14.int length()

===============

返回此字符串的长度。

public int length() {

return value.length;

}

复制代码

15.boolean matches(String regex)

================================

告诉这个字符串是否匹配给定的 regular expression (正则表达式)。

public boolean matches(String regex) {

return Pattern.matches(regex, this);

}

复制代码

16.String replaceAll(String regex, String replacement)

======================================================

用给定的字符串替换与给定的 regular expression匹配此字符串的每个子字符串。

17.String replaceFirst(String regex, String replacement)

========================================================

言尽于此,完结

无论是一个初级的 coder,高级的程序员,还是顶级的系统架构师,应该都有深刻的领会到设计模式的重要性。

  • 第一,设计模式能让专业人之间交流方便,如下:

程序员A:这里我用了XXX设计模式

程序员B:那我大致了解你程序的设计思路了

  • 第二,易维护

项目经理:今天客户有这样一个需求…

程序员:明白了,这里我使用了XXX设计模式,所以改起来很快

  • 第三,设计模式是编程经验的总结

程序员A:B,你怎么想到要这样去构建你的代码

程序员B:在我学习了XXX设计模式之后,好像自然而然就感觉这样写能避免一些问题

  • 第四,学习设计模式并不是必须的

程序员A:B,你这段代码使用的是XXX设计模式对吗?

程序员B:不好意思,我没有学习过设计模式,但是我的经验告诉我是这样写的

image

从设计思想解读开源框架,一步一步到Spring、Spring5、SpringMVC、MyBatis等源码解读,我都已收集整理全套,篇幅有限,这块只是详细的解说了23种设计模式,整理的文件如下图一览无余!

image

搜集费时费力,能看到此处的都是真爱!

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

:今天客户有这样一个需求…

程序员:明白了,这里我使用了XXX设计模式,所以改起来很快

  • 第三,设计模式是编程经验的总结

程序员A:B,你怎么想到要这样去构建你的代码

程序员B:在我学习了XXX设计模式之后,好像自然而然就感觉这样写能避免一些问题

  • 第四,学习设计模式并不是必须的

程序员A:B,你这段代码使用的是XXX设计模式对吗?

程序员B:不好意思,我没有学习过设计模式,但是我的经验告诉我是这样写的

[外链图片转存中…(img-wvtvEEbX-1713679450008)]

从设计思想解读开源框架,一步一步到Spring、Spring5、SpringMVC、MyBatis等源码解读,我都已收集整理全套,篇幅有限,这块只是详细的解说了23种设计模式,整理的文件如下图一览无余!

[外链图片转存中…(img-VTrRPgPQ-1713679450009)]

搜集费时费力,能看到此处的都是真爱!

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-VCOhw8Ug-1713679450009)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值