面试篇-java基础下

六、泛型

1. 什么是泛型?

泛型是Java编程语言中的一个重要特性,它允许类、接口和方法在定义时使用一个或多个类型参数,这些类型参数在使用时可以被指定为具体的类型。

泛型的主要目的是在编译时提供更强的类型检查,并且在编译后能够保留类型信息,避免在运行时出现类型转换异常。

2. 为什么需要泛型

适用于多种数据类型执行相同的代码

泛型中的类型在使用时指定,不需要强制类型转换

七、对象

1. Java创建对象有哪些方式?

  1. 使用new关键字:通过调用类的构造器来实例化对象

  2. 使用Class类的newInstance()方法

  3. 使用Constructor类的newInstance()方法

  4. 使用clone方法,实现Cloneable接口并重写clone()方法

  5. 使用反序列化

  6. 使用工厂模式,通过方法来返回对象实例

2. 如何获取私有对象?

  1. 通过类内部提供的get方法

  2. 通过反射

八、反射

1. 什么是反射?

Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类中的所有属性和方法,对于任意一个对象,都能够调用它的任意一个方法和属性。这种动态获取信息和动态调用对象的方法的功能就称为反射。

2.反射在你平时写代码或者框架中的应用场景有哪些?

  1. 加载数据库驱动

  2. 配置文件加载

    • Spring框架的IOC,Spring通过配置文件配置各种各样的bean,需要用到哪些bean就配置哪些,Spring容器会根据需求去动态加载

    • 过程:

      1. 将程序中所有xml或者properties配置文件加载进内存

      2. Java类里面解析配置文件内容,得到对应实体类字节码字符串和相关的属性信息

      3. 使用反射机制,根据字符串获得某个类的Class实例

      4. 动态配置实例的属性

九、Object

1. Object类有哪些方法?

equals方法

  • 重写equals方法必须重写hashCode方法,因为Java的约定是如果两个对象equals返回true,它们的hashCode必须相等;如果hashCode不相等,equals一定返回false

  • 如果只重写equals不重写hashCode,会导致对象在HashMap等集合中无法正确存储,比如两个id相同的User对象,equals返回true,但hashCode不同,会被当成两个不同元素存入集合

toString方法

  • 默认是返回类名加@加对象的哈希码十六进制表示

  • 一般重写来返回对象的具体信息

getClass方法

  • 返回对象运行时的实际类对象

clone方法

  • 用于创建对象的浅拷贝

notify和notifyAll

  • 用于多线程同步,和synchronized配合使用

  • 作用是唤醒当前对象锁的进程

wait方法有三个重载

  • 作用是让当前持有对象锁的线程释放锁并进入等待状态

  • 直到被notify/notifyAll唤醒或者等待时间到期

finalize方法

  • 对象被垃圾回收器回收前会调用的方法

  • 默认是空实现

2. 字符串常量池

当直接用双引号创建字符串的时候,JVM会把它扔到一个叫"字符串常量池"的地方。如果池子里已经有了这个字符串,那么新创建的字符串就会直接复用常量池中的字符串,所以他俩地址是一样的,==会返回true

3. String、StringBuffer、StringBuilder的区别和联系

可变性

  • String是不可变的,一旦创建,内容无法修改,每次修改都会生成一个新的对象

  • StringBuilderStringBuffer是可变的,可以直接对字符串内容进行修改而不会创建新对象

线程安全性

  • String因为不可变,天然线程安全

  • StringBuilder不是线程安全的,适用于单线程环境

  • StringBuffer是线程安全的,其方法通过synchronized关键字实现同步,适用于多线程环境

性能

  • String性能最低,尤其是在频繁修改字符串时会生成大量临时对象,增加内存开销和垃圾回收压力

  • StringBuilder性能最高,因为它没有线程安全的开销,适合单线程下的字符串操作

  • StringBuffer性能略低于StringBuilder,因为它的线程安全机制引入了同步开销

使用场景

  • 如果字符串内容固定或不常变化,优先使用String

  • 如果需要频繁修改字符串并且在单线程使用,用StringBuilder

  • 如果需要频繁修改字符串并且在多线程环境下,使用StringBuffer

十、序列化

1. 怎么把一个对象从一个JVM转移到另一个JVM?

  1. 使用序列化和反序列化

    • 将对象序列化为字节流,并将其发送给另一个JVM

    • 然后在另一个JVM中反序列化字节流恢复对象

  2. 使用消息传递机制

    • 利用消息传递机制,比如使用消息队列(RabbitMQ、Kafka)或者通过网络套接字进行通信

    • 将对象从一个JVM发送到另一个JVM

  3. 使用远程方法调用(RPC)

    • 可以使用远程方法调用框架,如gRPC,来实现对象在不同JVM之间的传输
  4. 使用共享数据库或缓存

    • 将对象存储在共享数据库(MySQL)或共享缓存(Redis)

    • 让不同的JVM可以访问这些共享数据

2. 序列化和反序列化让你自己实现你会怎么做?

考虑主流序列化框架,比如FastJson、Protobuf来替代Java序列化。

相关推荐
Flittly1 小时前
【SpringSecurity新手村系列】(5)RBAC角色权限与账户状态校验
java·spring boot·笔记·安全·spring·ai
wechatbot8882 小时前
企业微信 iPad 协议客服机器人自动化管理平台开发指南
java·运维·微信·自动化·企业微信·ipad
weisian1512 小时前
Java并发编程--46-热点Key与大Value:Redis集群中的“定时炸弹”
java·redis·热key·大key
Go away, devil2 小时前
Java——IO
java·开发语言
oscar9992 小时前
OpenCode Go :为开放编码模型准备的低价订阅方案
开发语言·后端·golang
hanbr2 小时前
Leetcode刷题总结(1)
算法·leetcode·职场和发展
所愿ღ2 小时前
SSM框架-Spring2
java·开发语言·笔记·spring
Flittly2 小时前
【SpringSecurity新手村系列】(6)基于角色的权限控制、权限拦截注解与自定义无权限页面
java·spring boot·安全·spring·安全架构
栗少2 小时前
Python 入门教程(面向有 Java 经验的开发者)
java·开发语言·python