初级java程序员面试题及答案,面试Java岗-Integer和String必问知识点,Java开发进阶吃透这一篇必拿60W年薪

这里涉及到了JVM内存模型基础,栈、堆、运行时常量池。大致来说,

  • 平时运行的函数就是在(虚拟机**)栈**内的,符合栈的特性,先入后出;

  • new的类是运行在上的,是Java虚拟机所管理的内存中最大一块,用来存放对象的实例;

  • 运行时常量池是在方法区(永久代、元空间)里的,用于存储已被虚拟机加载的类信息、常量、静态变量等数据。

说明:以下几个点和图片皆是引用了参考中的String类型内存原理文章

"双引号"创建

对于:String str = “abc”; 这句话,会不会好奇底层原理?

咱们先进行分析,左边是一个String类声明,右边又没有new关键字,说明是什么?说明不是构造对象,故"abc",不应该存放在堆上,实际上也是如此。那它在哪?答案是在运行常量池中。

[

那使用new是怎么样的?

new String()创建

对于: String str = new String(“abcd”);

咱们还是先分析一波,经过上面也大致猜到是存放在堆上的,那和栈又有什么联系?

直接上图:

可以看出对象确实是存储在堆上,但是底层存储的还是在常量池对应的内容。

+号机制

分两种情况

第一种:

String s = “旭”+“java”;
// 编译后的文件是String s = “旭java”

第二种:

//.java文件
String s1 = new String(“a”);
String s2 = “cd”;
String s3 = s1 + s2;
String s4 = s1 + “cd”;
String s5 = new String(“a”) + new String(“cd”);

//.编译后的文件(.class反编译为.java的显示结果)
String s1 = new String(“a”);
String s2 = “cd”;
String s3 = (new StringBuilder()).append(s1).append(s2).toString();
String s4 = (new StringBuilder()).append(s1).append(“cd”).toString();
String s5 = (new StringBuilder()).append(new String(“a”)).append(new String(“cd”)).toString();

由这里可以看出是借助了StringBuilder进行增加,为了减少频繁进行new String(),最后再转回String,(频繁进行new对象是很浪费性能的)

查看toString的源代码可以知道,底层其实是new String(c1,c2,c3); 这的结果是取String,底层是一个copyOfRange(),

将新的数组的地址给到了String类中的value中

,并进行返回

concat方法

作用是合并多个字符串

public String concat(String str) {
// 待新增长度
int otherLen = str.length();
if (otherLen == 0) {
return this;
}
// 原有长度
int len = value.length;
// 输入value数组,以及新的长度,返回一个新数组给我。
char buf[] = Arrays.copyOf(value, len + otherLen);
// 底层是调用了System中的arraycopy,总结将会说到这个函数;这里是进行增加的操作。
str.getChars(buf, len);
return new String(buf, true);
}

可以发现,本质是字符数组的扩容和复制操作,最后新建一个String类对象返回,内存机制与“+”类似,新建的字符串对象实例在堆,但是比 + 操作省去了一个新建对象步骤。

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

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

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

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

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
img

总结

就写到这了,也算是给这段时间的面试做一个总结,查漏补缺,祝自己好运吧,也希望正在求职或者打算跳槽的 程序员看到这个文章能有一点点帮助或收获,我就心满意足了。多思考,多问为什么。希望小伙伴们早点收到满意的offer! 越努力越幸运!

金九银十已经过了,就目前国内的面试模式来讲,在面试前积极的准备面试,复习整个 Java 知识体系将变得非常重要,可以很负责任的说一句,复习准备的是否充分,将直接影响你入职的成功率。但很多小伙伴却苦于没有合适的资料来回顾整个 Java 知识体系,或者有的小伙伴可能都不知道该从哪里开始复习。我偶然得到一份整理的资料,不论是从整个 Java 知识体系,还是从面试的角度来看,都是一份含技术量很高的资料。

三面蚂蚁核心金融部,Java开发岗(缓存+一致性哈希+分布式)

一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!

AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算

算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算**

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值