当前位置:网站首页 > Java基础 > 正文

java中基础题



目录

JAVA基础

JVM 知识

开源框架知识

操作系统

多线程

TCP 与 HTTP

架构设计与分布式

算法

MySQL

中间件


JAVA基础

1. JAVA 中的几种基本数据类型是什么,各自占用多少字节。

数据类型

关键字

内置类

内存占用字节数

布尔型

boolean

Boolean

1字节

字符型

char

Character

2字节

字节型

byte

Byte

1字节

短整型

short

Short

2字节

整形

int

Integer

4字节

长整型

long

Long

8字节

单精度型

float

Float

4字节

双精度型

double

Double

8字节

2. String类为什么是final的?

 

Java String类为什么是final的? - 简书

【漫画】腾讯面试,我竟然输给了final关键字

3. String,Stringbuffer,StringBuilder的区别。

 

4. ArrayList 和 LinkedList 有什么区别。

1. 是否保证线程安全: ArrayList 和 LinkedList 都是不同步的,也就是不保证线程安全;
2. 底层数据结构: Arraylist 底层使用的是Object数组;LinkedList 底层使用的是双向链表数据结构(注
意双向链表和双向循环链表的区别);
3. 插入和删除是否受元素位置的影响:① ArrayList 采用数组存储,② LinkedList 采用链表存储在这里插入图片描述
4. 是否支持快速随机访问: LinkedList 不支持高效的随机元素访问,而 ArrayList 支持。快速随机访问
就是通过元素的序号快速获取元素对象(对应于get(int index)方法)。
5. 内存空间占用: ArrayList的空 间浪费主要体现在在list列表的结尾会预留一定的容量空间,而
LinkedList的空间花费则体现在它的每一个元素都需要消耗比ArrayList更多的空间(因为要存放直接后继和
直接前驱以及数据)。

public interface RandomAccess{

}


ArraysList 实现了 RandomAccess 接口, 而 LinkedList 没有实现。为什么呢?我觉得还是和底层数据结
构有关!ArraysList 底层是数组,而 LinkedList 底层是链表。数组天然支持随机访问,时间复杂度为
O(1),所以称为快速随机访问。链表需要遍历到特定位置才能访问特定位置的元素,时间复杂度为 O(n),
所以不支持快速随机访问。ArraysList 实现了 RandomAccess 接口,就表明了他具有快速随机访问功能。
RandomAccess 接口只是标识,并不是说 ArraysList 实现 RandomAccess 接口才具有快速随机访问功能
的!


ArrayList:默认长度是10 每次扩容是原来的1.5倍。如果在添加的时候远数组是空的,就直接给一个10的长度,否则的话就加一,当需要的长度大于原来数组长度的时候就需要扩容了

下面再总结一下 list 的遍历方式选择:
实现了RadmoAcces接口的list,优先选择普通for循环 ,其次foreach,
未实现RadmoAcces接口的ist, 优先选择iterator遍历(foreach遍历底层也是通过iterator实现的),大
size的数据,千万不要使用普通for循环

5. 讲讲类的实例化顺序,比如父类静态数据,构造函数,字段,子类静态数据,构造函数,字段,当 new 的时候,他们的执行顺序。

 

测试代码可以见:

https://gitee.com/lzhcode/maven-parent/blob/master/lzh-technology/src/main/java/com/lzhsite/technology/grammar/initStatic/

6. 用过哪些 Map 类,都有什么区别,HashMap 是线程安全的吗,并发下使用的 Map 是什么,他们内部原理分别是什么,比如存储方式,hashcode,扩容,默认容量等。

 

7. JAVA8 的 ConcurrentHashMap为什么放弃了分段锁,有什么问题吗,如果你来设计,你如何设计。

 
 

9. 抽象类和接口的区别,类可以继承多个类么,接口可以继承多个接口么,类可以实现多个接口么。

  • 类不可以继承多个类,Java不支持多重继承。一个类只能继承一个父类(可以是具体java中基础题类或抽象类)。
  • 接口可以继承多个接口,使用extends关键字。
  • 类可以实现多个接口,使用implements关键字,用逗号分隔。

10.你能用Java覆盖静态方法吗?如果我在子类中创建相同的方法是否会编译时错误?

不能,但在子类中声明一个完全相同的方法不会编译错误,这称为隐藏在Java中的方法。

11. 讲讲你理解的 nio。他和 bio 的区别是啥,谈谈 reactor 模型。

Reactor模式详解 - 上善若水 - BlogJava

12. 反射的原理,反射创建类实例的三种方式是什么。

 

14. 描述动态代理的几种实现方式,分别说出相应的优缺点。

  • Jdk cglib jdk底层是利用反射机制,需要基于接口方式,这是由于 Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
  • Cglib则是基于asm框架,实现了无反射机制进行代理,利用空间来换取了时间,代理效率高于jdk

15. jdk代理与cglib 实现的区别。

  • JDK的动态代理机制只能代理实现了接口的类,而不能实现接口的类就不能实现JDK的动态代理
  • cglib是针对类来实现代理的,他的原理是对指定的目标类生成一个子类,并覆盖其中方法实现增强,但因为采用的是继承,所以不能对final修饰的类进行代理。 采用非常底层的字节码生成技术

16. 为什么CGlib 方式可以对接口实现代理。

可以,效率低

17. final的用途。

在Java中,`final` 关键字可以用在三个地方:类,方法和变量。

  • 如果一个类被声明为 `final`,意味着这个类不能被继承。这在你希望类的行为不被修改,或者出于安全考虑不希望类被继承时很有用。
  • 如果一个方法被声明为 `final`,意味着这个方法不能被子类覆盖(重写)。如果你希望类的某个行为是固定的,不允许任何修改,就可以使用 `final` 方法。
  • 如果一个变量被声明为 `final`,意味着这个变量的值一旦被初始化后,就不能再被改变。对于基本类型,这意味着变量的值不能改变;对于引用类型,这意味着引用不能改变,但引用的对象本身是可以被修改的。

`final` 的主要目的是定义不可改变的事物。这对于提高安全性和改善性能都有好处。

18. 写出三种单例模式实现。

饿汉单例

 

懒汉单例

 

双检锁单例

 

静态内部类模式

 

19. 如何在父类中为子类自动完成所有的 hashcode 和 equals 实现?这么做有何优劣。

反射:可以使用反射API在父类中访问子类的所有字段,然后基于这些字段来实现 和 。这种方法可以自动处理任何子类的字段,但有一些缺点。

尽管在父类中为所有子类实现 和 可以提高代码的重用性和一致性,但由于性能问题、正确性和维护难度等因素,这通常不是推荐的做法。在大多数情况下,最好在每个子类中单独实现这些方法。

20. 请结合 OO 设计理念,谈谈访问修饰符 public、private、protected、default 在应用设计中的作用。

21. 深拷贝和浅拷贝区别。

 

22.拦截器与过滤器的区别

  • 拦截器是基于java的反射机制的,而过滤器是基本函数回调。
  • 拦截器不依赖于servlet容器,过滤器依赖于servlet容器
  • 拦截器只能对action(action 通常是MVC框架中的控制器组件)请求起作用,过滤器可以对几乎所有的请求起作用
  • 拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问
  • 在action的生命周期中,拦截器可以被多次调用,而过滤器只能在容器初始化时被调用过一次。

23. error 和 exception 的区别,CheckedException,RuntimeException 的区别。

 

24. 请列出 5几个编译时异常,运行时异常。

​​​
Java的异常类层次结构

25. 在自己的代码中,如果创建一个 java.lang.String 对象,这个对象是否可以被类加载器加载?为什么。

类加载过程是先自顶向下尝试加载,然后再自底向上检查

尝试创建一个属于 java.lang 包的类(如自定义的 java.lang.String)不仅会违反Java的安全机制,而且由于双亲委派模型和类加载器的命名空间规则,这样做在技术上也是不可行的。这是Java设计中的一个重要特征,用于保护核心类库的完整性和安全性。

26. 说一说你对 java.lang.Object 对象中 hashCode 和 equals 方法的理解。在什么场景下需要重新实现这两个方法。

  1. 自定义“相等”逻辑:当你想要两个具有相同属性值的不同对象在逻辑上被视为相等时。例如,两个 对象,如果它们的 和 属性相同,你可能希望它们被视为相等。
  2. 使用在哈希表中:如果你打算将对象用作 、 或 等集合的键,就必须正确实现这些方法。这些集合使用对象的哈希码来快速定位键值对。
  3. 改善性能:在默认实现中,对象的哈希码是基于它们的地址的。如果你的类有更好的方式来计算哈希码,可以提高基于哈希的集合操作的性能。

27. 这样的 a.hashcode() 有什么用,与 a.equals(b)有什么关系。

 

详情原理请看

Java用自定义的类作为HashMap的key值情况的解析_击水三千里的专栏-CSDN博客

28. 有没有可能 2 个不相等的对象,有相同的 hashcode。

 

29. Java 中的 HashMap和 HashSet的区别,HashSet内部是如何工作的。

 

30. 什么是序列化,怎么序列化,为什么序列化,反序列化会遇到什么问题,如何解决。

序列化是将对象的状态转换为可存储或可传输的形式的过程。在Java中,这通常意味着将对象转换为字节流,以便可以将其写入磁盘、存储在数据库中或通过网络发送。

为什么序列化

  • 数据持久化:将对象的状态保存到硬盘,以便以后可以重新创建对象。
  • 跨时空通信:在网络中发送对象,或在分布式系统间共享。
  • 深拷贝:序列化可以用于快速创建对象的深拷贝。

反序列化会遇到的问题

  1. 类版本不一致:如果序列化的对象的类在反序列化时与原始版本不同(例如字段被添加或删除),会导致 。
  2. 安全性问题:反序列化未知或不受信任的数据可能导致安全漏洞,比如执行恶意代码。
  3. 性能问题:序列化和反序列化过程可能相对耗时。

31.Java中按值传递与按引用传递的区别

 

32创建String的特性

版权声明


相关文章:

  • java基础教程 pdf下载2025-04-11 11:34:04
  • java基础ppt演讲2025-04-11 11:34:04
  • java无基础2025-04-11 11:34:04
  • java简历基础2025-04-11 11:34:04
  • 张孝祥java基础2025-04-11 11:34:04
  • java基础知识深入2025-04-11 11:34:04
  • java基础数组练习2025-04-11 11:34:04
  • java基础系列八2025-04-11 11:34:04
  • java基础学习中心2025-04-11 11:34:04
  • java基础语法3152025-04-11 11:34:04