阿里Java研发面试题『八部曲』——基础必备

阿里架构师的架构设计——详解高可用架构设计 推荐阅读 阿里Java研发面试题『八部曲』——从第一步开始 阿里Java研发面试题『八部曲』——基础必备 未完待续… 前言:海恩法则和墨菲定律 海恩法则 事故的发生是量的积累的结果。 再好的技术、再完美的规章 , 在实际操作层面也无法取代人自身的素质和责任心 。 墨菲定律 任何事情都没有表面看起来那么简单 。 所有事情的发展都会比你预计的时间长 。 会出错的事总会出错。 如果你担心某种... 阅读详情

在这里插入图片描述

1、List遍历时删除的几种方式比较

1.1、会报错的删除方式:

(1)在Iterator遍历时使用list删除

Iterator<String> it = list.iterator();
while(it.hasNext()){
	String item = it.next();
	list.remove(item);
	//报错!!!
}

(2)foreach遍历方式中删除

for (String s : list){
	list.remove(s);
	//报错!!!
}

以上都是报java.util.ConcurrentModificationException,某个线程在 Collection 上进行迭代时,通常不允许另一个线性修改该 Collection,因为在这些情况下,迭代的结果是不确定的。

而对于foreach实际上使用的是iterator进行处理的,而iterator是不允许集合在iterator使用期间通过list删除的,也就是第一种方式,也就是说上面两种方式相当于是同一种。

1.2、不会报错,但是有可能漏删或不能完全的删除方式:

(1)漏删的情况(通过索引下标的方式)

List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(2);
list.add(3);
list.add(4);
System.out.println("----------list大小1:--"+list.size());
for (int i = 0; i < list.size(); i++) {
	if (2 == list.get(i)) {
		list.remove(i);
	}
	System.out.println(list.get(i));
}
System.out.println("最后输出=" + list.toString());

输出的结果如下:

----------list大小1:--5
1
2
3
4

最后输出=[1, 2, 3, 4]

可以看到,只删除了一个2,还有一个没有完全删除,原因是:删除了第一个2后,集合里的元素个数减1,后面的元素往前移了1位,此时,第二个2已经移到了索引index=1的位置,而此时i马上i++了,list.get(i)获得的是数据3。

(2)不能完全删除的情况

List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(2);
list.add(3);
list.add(4);
System.out.println("----------list大小1:--"+list.size());
for (int i = 0; i < list.size(); i++) {
	list.remove(i);
}
System.out.println("最后输出=" + list.toString());

输出的结果如下:

----------list大小1:--5

最后输出=[2, 3]

可以看到,结果并没有按照我们的想法,把所有数据都删除干净。原因是:在list.remove之后,list的大小发生了变化,也就是list.size()一直在变小,而 i 却一直在加大,当 i =3时,list.size()=2,此时循环的判断条件不满足,退出了程序。

以上两种情况通过for循环遍历删除,都没有正确达到目的,都是因为在remove后list.size()发生了变化(一直在减少),同时后面的元素会往前移动,导致list中的索引index指向的数据有变化。同时我们的for中的i是一直在加大的!

1.3 List遍历过程中删除元素的推荐做法

还是使用Iterator遍历,但是不用list来remove。如下代码:

List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(2);
list.add(3);
list.add(4);
System.out.println("----------list大小1:--"+list.size());
Iterator<Integer> it = list.iterator();
while(it.hasNext()){
	Integer item = it.next();
	if (2 == item) {
		it.remove();
	}
	System.out.println(item);
}
System.out.println("最后输出=" + list.toString());

输出结果:

----------list大小1:--5
1
2
2
3
4

最后输出=[1, 3, 4]

此时,两个2被全部删除了。

对于iterator的remove()方法,也有需要我们注意的地方:

  1. 每调用一次iterator.next()方法,只能调用一次remove()方法。
  2. 调用remove()方法前,必须调用过一次next()方法。

2、Java基本数据类型及包装类

byte(字节) 8 位 Byte
shot(短整型) 16位 Short
int(整型) 32 位 Integer
long(长整型) 64 位 Long
float(浮点型) 32 位 Float
double(双精度) 64 位 Double
char(字符型) 16 位 Character
boolean(布尔型) 1 位 Boolean

各数据类型按容量大小(表数范围大小)由小到大排列为:

byte <—— short, char <——int <——long <——float <——double

基本类型之间的转换原则:

1)运算时,容量小的类型自动转换为容量大的类型;

2)容量大的类型转换为容量小的类型时,要加强制转换符,且精度可能丢失;
如:
float f = 1.2f;
int ff = (int) f;
System.out.println(ff);
//输出为1,丢掉了小数部分

3)short,char之间不会互相转换(需要强制转换),byte、short、char并且三者在计算时首先转换为int类型;

4)实数常量默认为double类型, 整数常量默认为int类型;

3、switch中的参数类型

在jdk1.7 之前switch 只能支持 byte、short、char、int或者其对应的封装类以及 Enum 类型。
如:

enum EnumTest {
	LEFT,
		RIGHT
}
EnumTest e = EnumTest.LEFT;
switch (e) {
	case LEFT:
		System.out.println("----left-----");
	break;
	default:
		break;
}

在jdk1.7 及1.7以后,switch也支持了String类型,如下:

String str = "abc";
switch (str) {
	case "abc":
		System.out.println("-----abc-----");
	break;
	case "aaa":
		System.out.println("-----aaa-----");
	break;
}

4、equals与==的区别

(1)==是一个运算符,它比较的是值

对于基本数据类型,直接比较其数据值是否相等。如果是不同的基本数据类型之间进行比较,则遵循基本数据类型间运算的转换原则(见上面总结的第二条)。如下:

if(12 == 12.0){
	System.out.println("-----12 == 12.0-------");
}

此时打印了-----12 == 12.0-------,因为低一级的int类型的12自动转换为高一级的float类型

对于引用类型,比较的还是值,只不过此时比较的是两个对象变量的内存地址。所以,用来比较对象,实际上是判断这两个对象是否是同一个new出来的对象,或者是否是一个对象赋值给另一个对象的情况。如:String s1 = new String(“abc”);

String s2 = s1;
//将s1对的内存地址赋给了s2,此时s1==s2返回true;

(2)equals
equals方法是属于Object类的一个方法,其实现源码如下:

public Boolean equals(Object obj) {
	return (this == obj);
}

可以看到,其实equals方法里面用的还是==运算符,所以对于那些没有重写过Object类的equals方法来说,==和equals方法是等价的!

然而,很多类都自己去重写了equals方法,比如String类、所有基本数据类型的包装类等

String类的equals源码如下:

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;
}

首先判断是否是同一个new出来的对象,即判断内存地址是否相同;如果不同则判断对象中的内容是否相同。

Integer类的equals方法如下:

public Boolean equals(Object obj) {
	if (obj instanceof Integer) {
		return value == ((Integer)obj).intValue();
	}
	return false;
}

直接转成判断值是否相等了。

因此,对于String类和所有基本数据类型的包装类来说,equals方法就是判断其内容是否相等。对于其他类来说,要具体看其是否重写了equals方法及具体业务实现。

另:对于基本数据类型来说,使用equals方法,需要用该基本类型对应的包装类,因为equals是针对对象来使用的!

5、Object有哪些公用方法

Object类中的所有方法如下:

public Boolean equals(Object obj) {
	//判断是否同一个对象,具体见上一点总结
	return (this == obj);
}
public String toString(){
	return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
//返回该对象的哈希码值,重写了equals方法一般都要重写hashCode方法
public native int hashCode();
/**
*wait方法就是使当前线程等待该对象的锁,当前线程必须是该对象的拥有者,也就是具有该对象的锁。wait()方法一直等待,直到获得锁或者被中断。wait(long timeout)设定一个超时间隔,如果在规定时间内没有获得锁就返回。
*调用该方法后当前线程进入睡眠状态,直到以下事件发生。
*(1)其他线程调用了该对象的notify方法。
*(2)其他线程调用了该对象的notifyAll方法。
*(3)其他线程调用了interrupt中断该线程。
*(4)时间间隔到了。
*此时该线程就可以被调度了,如果是被中断的话就抛出一个InterruptedException异常。
*如:Person p = new Person();
*p.wait()//使用Person p对象作为对象锁。
*/
public final void wait() throws InterruptedException {
	...
}
public final native void wait(long timeout) throws InterruptedException;
public final void wait(long timeout, int nanos) throws InterruptedException {
	...
}
//该方法唤醒在该对象上等待的某个线程。如p.notify();
public final native void notify();
//该方法唤醒在该对象上等待的所有线程。
public final native void notifyAll();
public final native Class<?> getClass();
//获得运行时类型
//创建并返回此对象的一个副本。只有实现了Cloneable接口才可以调用该方法,否则抛出CloneNotSupportedException异常。
protected native Object clone() throws CloneNotSupportedException;
//用于释放资源。当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。也可手动调用,自己实现一些资源的释放。
protected void finalize() throws Throwable {
}

6、Java中的四种引用:强引用、软引用、弱引用、虚引用

四种级别由高到低依次为:强引用 > 软引用 > 弱引用 > 虚引用

6.1 强引用(StrongReference)

强引用是使用最普遍的引用。如果一个对象具有强引用,那垃圾回收器绝不会回收它。当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足的问题。如下的定义方式:

String str = new String("abc");
//强引用,在堆中创建了String这个对象,通过栈中的变量str引用这个对象
String str2 = str; 
//强引用,str2也指向了堆中创建的String对象

这两个引用都是强引用.只要存在对堆中String对象的引用,gc就不会回收该对象,如果通过下面代码:str = null; str2 = null;显示的设置引用str和str2为null,则gc就会认为堆中的String对象已经不存在其他引用了,此时该对象处于可回收的状态,但是到底什么时候回收该对象,取决于gc的算法。

6.2 软引用(SoftReference)

如果一个对象只具有软引用,则内存空间足够,垃圾回收器就不会回收它;如果内存空间不足了,就会回收这些对象的内存。只要垃圾回收器没有回收它,该对象就可以被程序使用。软引用可用来实现内存敏感的高速缓存。如下使用代码:

String str= new String("abc");
//强引用   
Refenrence sr = new SoftReference(str);
//软引用    
//引用时    
if(sr!=null){
	str= sr.get();
} else{
	str= new String("abc");
	sr = new SoftReference(str);
}

可以看到不论是强引用、软引用、弱引用或者虚引用都是针对某个对象来说的,当我们某个对象需要设置为软引用时,只需要给该对象套入到软引用对象中即可,如上面的代码SoftReference sr = new SoftReference(str);

由于软引用在内存不足时可以被回收,在内存充足时不会被回收,所以软引用经常被用来作为缓存使用。比如在Android中经常把Bitmap作为软引用来缓存图片,如HashMap<String, SoftReference> imageCache;的方式。

软引用可以和一个引用队列(ReferenceQueue)联合使用,如果软引用所引用的对象被垃圾回收器回收,Java虚拟机就会把这个软引用加入到与之关联的引用队列中。

6.3 弱引用(WeakReference)

弱引用与软引用的区别在于:只具有弱引用的对象拥有更短暂的生命周期。在垃圾回收器线程扫描它所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。不过,由于垃圾回收器是一个优先级很低的线程,因此不一定会很快发现那些只具有弱引用的对象。

弱引用可以和一个引用队列(ReferenceQueue)联合使用,如果弱引用所引用的对象被垃圾回收,Java虚拟机就会把这个弱引用加入到与之关联的引用队列中。

对于软引用或者弱引用来说,gc回收软引用或弱引用对象的过程是一样的,其执行过程如下:

String str= new String("abc"); 
//强引用
Refenrence sr = new SoftReference(str);
//软引用
  1. 首先将软引用或弱引用的referent设置为null(即置str = null;),不再引用堆中的对象;
  2. 将堆中的对象new String(“abc”);设置为可结束的(finalizable)。
  3. 当heap中的new String(“abc”)对象的finalize()方法被运行而且该对象占用的内存被释放, sr被添加到它的ReferenceQueue中。

可以用如下代码来说明过程:

String str = new String("abc");
        SoftReference<String> soft = new SoftReference<String>(str);    //软引用
        str = null;
        System.out.println("before gc:" + soft.get());
        System.gc();
        System.out.println("after gc:" + soft.get());

输出结果:

before gc: abc
after gc: abc

对于弱引用:

 String str = new String("abc");
        WeakReference<String> soft = new WeakReference<String>(str);    //弱引用
        str = null;
        System.out.println("before gc:" + soft.get());
        System.gc();
        System.out.println("after gc:" + soft.get());

输出结果:

before gc :abc
after gc: null

因此可以看出,软引用和弱引用被gc回收的过程是一致的,但是最后到底会不会回收掉该对象,要分情况。对于软引用来说,如果内存不足的情况下才会回收掉;对于弱引用来说,只要gc准备回收该弱引用对象,就会被立即释放掉。

6.4 虚引用(PhantomReference)

"虚引用"顾名思义,就是形同虚设,与其他几种引用都不同,虚引用并不会决定对象的生命周期。如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收。虚引用主要用来跟踪对象被垃圾回收的活动。

虚引用与软引用和弱引用的一个区别在于:虚引用必须和引用队列(ReferenceQueue)联合使用。当垃 圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到与之关联的引用队列中。程序可以通过判断引用队列中是 否已经加入了虚引用,来了解被引用的对象是否将要被垃圾回收。程序如果发现某个虚引用已经被加入到引用队列,那么就可以在所引用的对象的内存被回收之前采取必要的行动。 建立虚引用之后通过get方法返回结果始终为null。

四种引用类型的声明周期如下:

Java_supermanNO1

  • 每天花十分钟提升自己

推荐阅读

《Java面试宝典17章204题》

Mybatis 和 Hibernate 持久层框架之间的区别是啥? 推荐阅读 阿里Java研发面试题『八部曲』——从第一步开始 阿里Java研发面试题『八部曲』——基础必备 未完待续… 首先,Mybatis 和 Hibernate 都是 ORM 持久层框架,不同点在于,MyBatis 是半自动的,它需要开发人员自己手动编写 SQL 语句。 一、Mybatis MyBatis 支持通过 XML 或注解的方式来配置需要运行的 SQL 语句,并且,最终由框架本身将... 阅读详情

相关推荐

春招复盘,滴滴3.28一二三面,携程3.29二面,最后许愿offer

前言 首先非常感谢大平台,让我学到了很多东西,之前也许愿2面携程,果然有二面,也是来还愿的吧,大致说一下面试经历吧,大家可以互相学习学习,滴滴昨天下午123面,感觉人均123面,太难了。。。。。。携程今天2面,分享一下,也算是攒攒人品吧,许愿offer。。。。。。。。。 滴滴(1,2,3面)3/28 1面 1、自我介绍 2、项目 5、限流的原理 6、jre与jdk,有什么关系? 7、jre包含哪些组件 8、private修饰的字段或方法,子类可以重写么? 9、父类静态的方法,子类可以重写么? 不可以重写父类

weixin_53170315的博客 3609

三面滴滴失败,总结了Java面试题,有几个题还是一直搞不懂

最后。

the shy 794

滴滴Java开发面试题及参考答案 (上)

使用 @Component 及其衍生注解(如 @Service 用于标注业务逻辑层类、@Repository 用于标注数据访问层类、@Controller 用于标注 Web 层的控制器类等)来标记哪些类是需要被 Spring IOC 容器管理的 Bean,容器会自动扫描并创建它们的实例。

大模型大数据攻城狮的专栏 742

阿里巴巴java方向笔试题 带详细答案

阿里巴巴java方向笔试题 带详细答案 1,下列说法正确的是() A.一个文件里可以同时存在两个public修饰的类 B.构造函数可以被重写(override) C.子类不能访问父类非public和protected修饰的属性 D.final修饰的类可以被继承 答案:C 一个不是必须要放在public类中才能运行程序。 重写是子类继承父类后对父类的方法进行修改。方法名,参数,返回值必须一样。 不能重写被标示为final的方法。如果不能继承一个方法,则不能重写这个方法。 扩展:重写override,重载ove

m0_67394360的博客 801

浅显易懂地看LLC变换器(三)

第3期 谐振与增益的定性关系 由简单的谐振电路说起 我们将以电感和电容的基本电路的特性逐渐了解谐振电路的特性 与电阻不同,电感和电容都不是纯阻性线性器件,电感的感抗XL和电容的容抗Xc都与频率有关,当加在电感和电容上的频率发生变化时,它们的感抗XL和容抗Xc会发生变化。 1) 如下图RL电路,当输入源Vin的频率增加时,电感的感抗增大,输出电压减小,增益Gain=Vo/Vin随频率增加而减小。 2) 如下图RC电路,相反,当输入源Vin的频率增加时...

iFTrue电力电子专栏 6738

Python爬虫实战:5分钟搞定东方财富网股票数据抓取(附完整代码)

本文详细介绍了如何利用Python爬虫技术,快速抓取东方财富网的实时股票数据。通过逆向分析其JSONP数据接口,构建了包含请求处理、数据清洗、分页调度及多格式存储的完整自动化采集系统,并提供了应对反爬策略与生产部署的进阶优化思路,附有可直接运行的完整代码。

weixin_29084231的博客 875

2023年春招阿里巴巴全套1000道java面试笔试题及答案

zookeeper原理和适用场景* zookeeper watch机制* redis/zk节点宕机如何处理* 分布式集群下如何做到唯一序列号* 如何做一个分布式锁* 用过哪些MQ,怎么用的,和其他mq比较有什么优缺点,MQ的连接是线程安全的吗* MQ系统的数据如何保证不丢失* 列举出你能想到的数据库分库分表策略;回答面试题,切忌只是简单一句话回答,可以将你对概念的理解,特点等多个方面描述一下,哪怕你自己认为不完全切中题意的也可以说说,面试官不喜欢会打断你的,你的目的是让面试官认为你是好沟通的。

m0_73311735的博客 1767

基于Python API的ECMWF大气数据批量下载与自动化处理实践

本文详细介绍了如何利用Python API实现ECMWF大气数据的自动化批量下载与处理。针对遥感分析中手动下载ERA5等数据的痛点,文章提供了从API密钥配置、核心脚本编写到元数据解析、任务队列调度及数据质量检查的全流程实践指南,旨在帮助科研与工程人员高效获取并处理大规模气象数据。

u8v9w0x1y的博客 479

被面试官问的Java问题难倒了,2021阿里Java面试题目大汇总

25.写一个JAVA死锁的列子? 26.如何解决死锁? 27.GC回收算法,及实现原理? 28.HashMap数据存储结构? key重复了怎么办? 是如何解决的? 29.Spring AOP的实现原理,底层用什么实现的? 我把这些都整理成了一份文档,如下 阿里技术二面(技术原理、个人擅长的项目) ======================================================================================= 重点是面试技术原理,以及对技术的热情

m0_60452187的博客 384

LVGL 丝滑菜单3(Silk Menu)

h。

摸鱼专家 91

Python 爬虫实战:就业市场趋势数据抓取与行业洞察

在当今竞争激烈的就业市场中,了解行业趋势和就业形势对于求职者、学生以及人力资源专业人士来说至关重要。通过获取和分析就业市场数据,我们可以深入了解不同行业的招聘需求、薪资水平、技能要求等关键信息,从而为职业规划和人才发展提供有力支持。

yansideyucsdn的博客 1406

阿里架构师浅析经典多线程设计模式,你看懂了吗?

推荐阅读 阿里Java研发面试题『八部曲』——从第一步开始 阿里Java研发面试题『八部曲』——基础必备 未完待续… 一、Future模式 思想: 当service(Main方法模拟)请求一个数据的时候,可以先给他返回一个包装类(空壳,代理对象,未来data,FutureData);然后开一个线程去异步加载真实数据,这样当service收到FutrueData,就可以做其他业务逻辑,当要用...

Java_supermanNO1的博客 412

通过傅里叶变换进行音频变声变调

在游戏或者一些特殊场景下为了提高娱乐性或者保护声音的特征,我们会对音频进行变声变调处理。

yang1fei2的博客 1817

Python十一板块文档,百万字教程从零进阶拿高薪!

最近忙了很长一段时间,翻资料等等,终于根据自己的理解整理一份相对完整的python教程,以后也会不定期的更新内容,百万字文档,十一模块,互勉~

程序员小麦的博客 1746

使用 MATLAB/Simulink 构建一个 基于神经网络控制的单相并网逆变器系统

单相并网逆变器广泛应用于户用光伏小型储能和电动汽车V2G等场景。其核心控制目标是实现高质量的并网电流,即电流与电网电压同频同相(单位功率因数),且总谐波畸变率 (THD)极低。非线性因素:电力电子器件的开关死区非线性电感寄生参数。参数不确定性:滤波器元件(L, C)的老化温漂。电网扰动:电压谐波频率波动不平衡。模型依赖性:PI、PR等控制依赖于精确的系统模型,模型失配导致性能下降。动态响应:在光照突变(光伏)或负载突变(储能)下,需快速、无超调地响应。

xiaoheshang_123的博客 274

【NVIDIA】Jetson Orin Nano系列:编译外部驱动(交叉编译和板上编译)

Orin Nano外部驱动的开发入门,以hello world为例。使用交叉编译和板上编译两种方法

郭老二 1734

Python十一板块文档,百万字教程从零进阶拿高薪

最近忙了很长一段时间,翻资料等等,终于根据自己的理解整理一份相对完整的python教程,以后也会不定期的更新内容,百万字文档,十一模块,互勉~

2301_76161259的博客 1299

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

mybatis plus关联查询_Mybatis 和 Hibernate 持久层框架之间的区别是啥?

首先,Mybatis 和 Hibernate 都是 ORM 持久层框架,不同点在于,MyBatis 是半自动的,它需要开发人员自己手动编写 SQL 语句。一、MybatisMyBatis 支持通过 XML 或注解的方式来配置需要运行的 SQL 语句,并且,最终由框架本身将 Java 对象和 SQL 语句映射生成最终执行的 SQL ,执行后,再将结果映射成 Java 对象返回。相较于 Hiberna...

weixin_39692623的博客 603

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

详解Spring Boot页面中Thymeleaf的语法规则

推荐阅读 阿里Java研发面试题『八部曲』——从第一步开始 阿里Java研发面试题『八部曲』——基础必备 未完待续… 开发传统Java WEB工程时,我们可以使用JSP页面模板语言,但是在SpringBoot中已经不推荐使用了。SpringBoot支持如下页面模板语言 Thymeleaf FreeMarker Velocity Groovy JSP 上面并没有列举所有SpringBoot...

Java_supermanNO1的博客 656

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Java面试通关:阿里内部实战模拟面试精讲题库,竟被上传GitHub!

资料内容涵盖Java+大数据共30个知识点,包含Java基础、框架、多线程、并发编程、JVM、网络协议、MySQL、Redis、数据库、微服务、Spring、中间件、mybatis、分布式......不一定的,但是没办法,环境就是如此,能做的也就只有不断提升自己,去适应市场环境,提高自身技术水平!我的建议,不管自己现在是个什么境况,是躺平还是互卷,如果你想在这个动荡的市场中稳坐钓鱼台,光会刷题,只是记住了,却不会用,一紧张就忘,那我建议你不要光背了,做题才是你最好的选择。,如果把这套高质量的面试题集刷完,

m0_59595915的博客 167

2024阿里Java面试题目大汇总,看看你离阿里还有多远,附答案

既然是要面试,那么就少不了刷题,实际上春节回家后,哪儿也去不了,我自己是刷了不少面试题的,所以在面试过程中才能够做到心中有数,基本上会清楚面试过程中会问到哪些知识点,高频题又有哪些,所以刷题是面试前期准备过程中非常重要的一点。JVM(内存模型、GC垃圾回收,包括分代,GC算法,收集器、类加载和双亲委派、JVM调优,内存泄漏和内存溢出)数据库的锁(行锁,表锁,页级锁,意向锁,读锁,写锁,悲观锁,乐观锁,以及加锁的select sql方式)算法和数据结构数组、链表、二叉树、队列、栈的各种操作(性能,场景)

m0_58269520的博客 1040

滴滴(一面)java后端开发最新面试题

本文涵盖了计算机网络、数据库和Redis等核心知识点。TCP三次握手通过SYN/ACK确认双方通信能力建立连接,四次挥手则因全双工特性需独立关闭。HTTP状态码中304表示资源未修改,502/504分别表示网关错误和超时。Redis提供8种内存淘汰策略,包括默认的noeviction和基于LRU/LFU的算法。MySQL锁机制包含全局锁、表锁和行锁,事务隔离级别中RR通过间隙锁解决幻读。B+树作为MySQL索引结构,支持高效查询;聚簇索引将数据与索引存储结合而非聚簇索引需要回表操作。算法题考察链表操作,要求

风一样 714
上一篇: 阿里Java研发面试题『八部曲』——从第一步开始
下一篇: Spring Boot入门&整合常用框架整理丨深度好文
Java_supermanNO1
博客等级 码龄7年 1170粉丝 329原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值