Java面试题大全(持续更新中)

本文讨论了Java中的类继承、方法重写示例,展示了如何在类中使用`show()`和`show2()`方法,以及Docker的基础概念、安装和使用。文章还涉及线程状态、内存管理和网络配置,同时提供了Java面试题的解答和学习资源推荐。
摘要由CSDN通过智能技术生成

class A {

public void show() {

show2();

}

public void show2() {

System.out.println(“我”);

}

}

class B extends A {

public void show2() {

System.out.println(“爱”);

}

}

class C extends B {

public void show() {

super.show();

}

public void show2() {

System.out.println(“你”);

}

}

public class Test2DuoTai {

public static void main(String[] args) {

A a = new B();

a.show();

B b = new C();

b.show();

}

}

//爱

//你

20.package,import,class有没有顺序关系

package放在有效代码的第一行,import放在中间,class放在三者最后。

21.要求:使用已知的变量,在控制台输出30,20,10。

class Outer {

public int num = 10;

class Inner {

public int num = 20;

public void show() {

int num = 30;

System.out.println(?); //num

System.out.println(??); //this.num

System.out.println(???);//Outer.this.num

}

}

}

class InnerClassTest {

public static void main(String[] args) {

Outer.Inner oi = new Outer().new Inner();

oi.show();

}

}

22.按照要求,补齐代码

interface Inter { void show(); }

class Outer { //补齐代码 }

class OuterDemo {

public static void main(String[] args) {

Outer.method().show();

}

}

要求在控制台输出”HelloWorld”

//需要补齐代码内容

public static Inter method() {

return new Inter() {

public void show() {

System.out.println(“HelloWorld”);

}

};

}

23.==号和equals方法的区别

相同点:都是作比较的,返回的都是布尔类型。

不同点:

(1)==:

* 是一个比较运算符号,既可以比较基本数据类型,也可以比较引用数据类型,

基本数据类型比较的是值, 引用数据类型比较的是地址值

(2)equals:

* equals方法是一个方法,只能比较引用数据类型,所有的对象都会继承Object类中的方法,

如果没有重写Object类中的equals方法,equals方法和号比较引用数据类型无区别,

重写后的equals方法比较的是对象中的属性。

24.判断定义为String类型的s1和s2是否相等

  • String s1 = “abc”;

  • String s2 = “abc”;

  • System.out.println(s1 == s2); //true

  • System.out.println(s1.equals(s2)); //true

//常量池中没有这个字符串对象,就创建一个,如果有直接用即可

25.下面这句话在内存中创建了几个对象?

  • String s1 = new String(“abc”);

//创建几个对象

//创建两个对象,一个在常量池中,一个在堆内存中

26.判断定义为String类型的s1和s2是否相等

  • String s1 = new String(“abc”); //记录的是堆内存对象的地址值

  • String s2 = “abc”; //记录的是常量池中的地址值

  • System.out.println(s1 == s2); ? //false

  • System.out.println(s1.equals(s2)); ? //true

27.判断定义为String类型的s1和s2是否相等

  • String s1 = “a” + “b” + “c”;

  • String s2 = “abc”;

  • System.out.println(s1 == s2); ? //true,java中有常量优化机制

  • System.out.println(s1.equals(s2)); ? //true

28.判断定义为String类型的s1和s2是否相等

  • String s1 = “ab”;

  • String s2 = “abc”;

  • String s3 = s1 + “c”;

  • System.out.println(s3 == s2); //false

  • System.out.println(s3.equals(s2)); ? //true

29.null与""的区别?

""是字符串常量,同时也是一个String类的对象,既然是对象当然可以调用String类中的方法

null是空常量,不能调用任何的方法,否则会出现空指针异常,null常量可以给任意的引用数据类型赋值

30.String,StringBuffer,StringBuilder的区别

(1)String:是一个不可变的字符序列

(2)StringBuffer:是一个可变的字符序列。是jdk1.0版本的,是线程安全的,效率低

(3) StringBuilder:是一个可变的字符序列。是jdk1.5版本的,是线程不安全的,效率高

31.Integer的面试题

看程序写结果

Integer i1 = new Integer(97);

Integer i2 = new Integer(97);

System.out.println(i1 == i2); //false

System.out.println(i1.equals(i2)); //true

System.out.println(“-----------”);

Integer i3 = new Integer(197);

Integer i4 = new Integer(197);

System.out.println(i3 == i4); //false

System.out.println(i3.equals(i4)); //true

System.out.println(“-----------”);

Integer i5 = 97;

Integer i6 = 97;

System.out.println(i5 == i6); //true

System.out.println(i5.equals(i6)); //true

System.out.println(“-----------”);

Integer i7 = 197;

Integer i8 = 197;

System.out.println(i7 == i8); //false

System.out.println(i7.equals(i8)); //true

-128到127是byte的取值范围,在这个取值范围内,自动装箱

就不会新创建对象,而是从常量池中获取,如果超出了byte取值

范围就会重新创建对象

32.注意:String和StringBuffer分别作为参数传递

  • A:形式参数问题

  • String作为参数传递

  • StringBuffer作为参数传递

基本数据类型的值传递,不改变其值。引用数据类型的值传递,改变其值。

String类虽然是引用数据类型,但当它当做参数传递时和基本数据类型一样。

33.JDK1.5新特性:

泛型,枚举,增强for,自动拆装箱,静态导入,可变参数

34.并发修改异常产生的原因及解决方案

产生原因:用迭代器遍历集合的时候又使用集合改变了集合的结构

解决方案:(1)用普通for循环

(2)用列表迭代器ListIterator

35.HashMap和Hashtable的区别

  • 共同点:

底层都是哈希算法,都是双列集合

  • HashMap:

线程不安全,效率高,JDK1.2版本

可以存储null键和null值

  • Hashtable:

线程安全,效率低,JDK1.0版本

不可以存储null键

36.Collection和Collections的区别:

Collection是单列集合的顶层接口,里面定义了单列集合的共性内容。

Collections是操作集合的工具类,里面提供了一些查找、排序等常用集合功能。

37.final,finally和finalize的区别

  • final

修饰类,不能被继承

修饰方法,不能被重写

修饰变量,只能赋值一次

  • finally

是try语句中的一个语句体,不能单独使用,用来释放资源

  • finalize

是一个方法,当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。

38.如果catch里面有return语句,请问finally的代码还会执行吗?

如果会,请问是在return前还是return后?

return 会先建立返回路径,然后执行finally内的语句,然后再由return返回

会执行,在return后(return – finally – return)

39.throws和throw的区别

  • a:throws

  • 用在方法声明后面,跟的是异常类名

  • 可以跟多个异常类名,用逗号隔开

  • 表示抛出异常,由该方法的调用者来处理

  • b:throw

  • 用在方法体内,跟的是异常对象名

  • 只能抛出一个异常对象名

  • 表示抛出异常,由方法体内的语句处理

40.内存输出流面试题

  • 定义一个文件输入流,调用read(byte[] b)方法,将a.txt文件中的内容打印出来(byte数组大小限制为5)

//创建字节输入流,关联a.txt

FileInputStream fis = new FileInputStream(“a.txt”);

//创建内存输出流

ByteArrayOutputStream baos = new ByteArrayOutputStream();

//创建字节数组,大小为5

byte[] arr = new byte[5];

int len;

//将文件上的数据读到字节数组中

while((len = fis.read(arr)) != -1) {

//将字节数组的数据写到内存缓冲区中

baos.write(arr, 0, len);

}

//将内存缓冲区的内容转换为字符串打印

System.out.println(baos);

fis.close();

41.实现多线程两种方式的区别

  • 查看源码的区别:

  • a.继承Thread : 由于子类重写了Thread类的run(), 当调用start()时, 直接找子类的run()方法

  • b.实现Runnable : 构造函数中传入了Runnable的引用, 成员变量记住了它, start()调用run()方法时内部判断成员变量Runnable的引用是否为空, 不为空编译时看的是Runnable的run(),运行时执行的是子类的run()方法

  • 继承Thread

  • 好处是:可以直接使用Thread类中的方法,代码简单

  • 弊端是:如果已经有了父类,就不能用这种方法

  • 实现Runnable接口

  • 好处是:即使自己定义的线程类有了父类也没关系,因为有了父类也可以实现接口,而且接口是可以多实现的

  • 弊端是:不能直接使用Thread中的方法需要先获取到线程对象后,才能得到Thread的方法,代码复杂

42.面试题

  • 在同步代码块中,用哪个对象锁,就用哪个对象调用wait()方法

  • 为什么wait()方法和notify()方法定义在Object类中

  • 因为锁对象可以使任意对象,而Object是所有类的超类,所以wait()方法和notify()方法需要定义在Object类中

  • sleep方法和wait方法的区别

  • a.sleep方法必须传入参数,参数就是时间,时间到了自动醒来

  • wait方法可以传入参数也可以不传入参数,传入参数就是在参数的时间结束后等待,不传入参数就是直接等待

  • b.sleep方法在同步函数或者同步代码块中,不释放锁。睡着了也抱着锁睡。

  • wait方法在同步函数或者同步代码块中,释放锁。

参考:

sleep方法和wait方法的区别?

sleep是Thread里面的方法,而wait是Object类里面的方法。

sleep方法让线程在指定时间内处于休眠状态,时间到了后继续向下执行

wait 方法让线程处于阻塞状态,必须在得到notify或者notifyAll的通知后才能继续向下执行

sleep方法没有释放锁,其他线程不能进入同步代码块或者同步方法

wait 方法释放了锁,使得其他线程可以进入同步代码块或者同步方法。

43.线程的五种状态

  • 新建,就绪,运行,阻塞,死亡
    这里写图片描述

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

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

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

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

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

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

Docker步步实践

目录文档:

①Docker简介

②基本概念

③安装Docker

④使用镜像:

⑤操作容器:

⑥访问仓库:

⑦数据管理:

⑧使用网络:

⑨高级网络配置:

⑩安全:

⑪底层实现:

⑫其他项目:

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!
BDZl-1712035151840)]

[外链图片转存中…(img-PZn9G4F4-1712035151840)]

①Docker简介

②基本概念

③安装Docker

[外链图片转存中…(img-AyymkAGL-1712035151841)]

④使用镜像:

[外链图片转存中…(img-9RI8AWpD-1712035151841)]

⑤操作容器:

[外链图片转存中…(img-QgycI8aD-1712035151842)]

⑥访问仓库:

[外链图片转存中…(img-r3kiBcol-1712035151842)]

⑦数据管理:

[外链图片转存中…(img-MEBxwVf0-1712035151842)]

⑧使用网络:

[外链图片转存中…(img-9wa9AGGB-1712035151842)]

⑨高级网络配置:

[外链图片转存中…(img-JklbLSxS-1712035151843)]

⑩安全:

[外链图片转存中…(img-h0zm8TUH-1712035151843)]

⑪底层实现:

[外链图片转存中…(img-DcP0QE1U-1712035151843)]

⑫其他项目:

[外链图片转存中…(img-hJY53xPH-1712035151843)]

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值