说说JVM、JRE和JDK的关系?
JVM、JRE 和 JDK 是 Java 生态系统中的三个核心组件,它们在 Java 开发和运行时环境中扮演着不同的角色。
JVM虚拟机 Java虚拟机是一种抽象计算机,它为 Java 程序提供了运行环境。JVM 的主要职责是执行 Java 字节码,并将其转换为机器代码,以便在特定平台上运行。JVM 是实现 Java 跨平台的关键组件。 JRE运行环境 Java 运行时环境是一个软件包,它提供了运行 Java 应用程序所需的所有组件。JRE 包含 JVM 以及 Java 类库和其他支持文件。JRE 是运行Java 应用程序的最低要求。JRE包含JVM,用于执行Java字节码。JRE包含Java标准类库,这些类库为 Java 应用提供基础功能。 JDK开发工具包 Java 开发工具包是为 Java 开发者提供的完整开发环境。JDK 包含 JRE 以及开发 Java 应用程序所需的工具和库。JDK 是开发和编译 Java 程序的必备工具。JDK 包含一个完整的 JRE 环境。
java三大特性是什么?
封装 封装是将对象的属性和方法封装在一起,并对外隐藏对象的内部细节,只暴露必要的接口。通过封装,可以保护对象的状态不被外部直接修改,增强了代码的安全性和可维护性。 继承 继承是面向对象编程中的一个机制,通过继承,一个类可以继承另一个类的属性和方法,从而实现代码的重用。主要使用extends关键字来声明继承 多态 多态是指同一个方法在不同对象中具有不同的实现方式。多态可以通过方法重载(Overloading)和方法重写(Overriding)来实现。 方法重载:在同一个类中,方法名相同但参数列表不同。 方法重写:在子类中重新定义父类中的方法。
构造器是否可被重写?
可以被重载:在同一个类中,可以定义多个构造器,只要它们的参数列表不同。 不能被重写:因为构造器不属于类的继承成员,并且它们的名称必须与类名相同。
String、StringBuffer 和 StringBuilder 的区别是什么?
String:不可变,线程安全 StringBuffer:可变性,线程安全性能比builder高,适用多线程 StringBuilder:可变性,线程不安全,性能高,适用单线程
抽象类能使用final修饰吗?
不能,final修饰符用于表示类不能被继承,而抽象类的主要用途就是被继承以提供基础实现或定义抽象方法供子类实现。
静态变量和实例变量的区别?
静态变量用static关键字定义,通过类名或对象实例访问,而实例变量必须通过对象实例访问。
final finally finalize区别?
final:用于声明常量、不可重写的方法和不可继承的类。 finally:用于异常处理,确保某些代码总是会执行。 finalize:用于对象被垃圾回收之前的清理操作,但由于不确定性,不推荐依赖。
父类的静态方法能否被子类重写?
不能,父类的静态方法不能被子类重写。静态方法是通过类名调用的,而不是通过实例调用的,所以它们不能表现出多态性。不过,子类可以定义一个与父类静态方法同名的方法,这种情况称为方法隐藏,而不是方法重写。
Java有哪些数据类型?
整数类型 byte、short、int、long 浮点类型 float、double 布尔类型 boolean 引用数据类型 类、接口、数组
short s1 = 1; s1 = s1 + 1;有错吗?short s1 = 1; s1 += 1;有错吗?
short s1 = 1; s1 = s1 + 1;会导致编译错误,因为s1 + 1的结果是int类型,不能直接赋值给short类型的变量。 short s1 = 1; s1 += 1;是正确的,因为复合赋值运算符+=会隐式地进行类型转换。
final有什么用?
声明变量时:值不能被改变 声明方法时:不能被子类重写 声明类时:不能被继承
this与super的区别?
this: 引用当前对象的实例变量 super: 调用父类的构造函数、调用父类的方法
==和equals的区别是什么?
== 是一个比较操作符,用于比较两个操作数的内存地址(引用)是否相同。它可以用于比较基本数据类型和对象引用。 用于基本数据类 许多类重写了equals()方法,用于比较对象的内容。例如,String类重写了equals()方法,用于比较字符串的内容。
JDK中常用的包有哪些?
java.lang、java.util、java.io、java.sql、java.net
什么是字符串常量池?
字符串常量池是Java中用于优化字符串存储和管理的一种机制。它是Java运行时环境的一部分,专门用于存储字符串字面量和某些字符串对象,以减少内存消耗和提高性能。 字符串字面量的存储 当你在代码中使用字符串字面量(例如"hello")时,Java会首先检查字符串常量池中是否已经存在一个相同的字符串。如果存在,Java会直接引用该字符串,而不会创建新的字符串对象。如果不存在,Java会将该字符串添加到常量池中,然后引用它。 字符串对象的存储 使用new关键字创建的字符串对象,不会自动进入字符串常量池。它们在堆内存中创建,且每次都会创建一个新的对象。可以使用String类的intern()方法将字符串对象添加到常量池中。例如,调用str.intern()会将字符串str添加到常量池中,如果常量池中已经存在相同内容的字符串,则返回该字符串的引用。
instanceof关键字的作用?
主要作用 类型检查:确定对象是否是某个类的实例或是该类的子类的实例。 避免类型转换异常:在进行类型转换之前,使用instanceof可以防止ClassCastException异常。
什么是泛型?
泛型(Generics)是Java中的一种机制,本质是参数化类型,就是说所操作的数据类型被指定为一个参数。泛型提供了一种类型安全的方式来定义数据结构和算法,使代码更加通用和灵活,同时减少了类型转换和类型检查的错误。 泛型的限制 1、 基本类型:泛型不支持基本数据类型(如int、char等),只能使用其对应的包装类(如Integer、Character等)。 2、 类型擦除:Java的泛型是通过类型擦除实现的,这意味着在运行时,泛型类型信息会被移除,所有泛型类型都被替换为其原始类型(通常是Object)。这限制了某些操作,如创建泛型数组。 3、 静态上下文中使用泛型:不能在静态字段或静态方法中使用类型参数,因为类型参数是在实例化时才指定的,而静态成员与具体实例无关。
泛型擦除是什么?
泛型擦除是Java编译器在编译泛型代码时的一种机制。它的目的是确保泛型能够与Java的旧版本(即不支持泛型的版本)兼容。 在Java中,泛型信息只存在于源代码和编译时,在运行时,所有的泛型类型信息都会被擦除。这意味着在运行时,所有的泛型类型都被替换为它们的上限类型(如果没有显式指定上限,则默认为Object)。
深拷贝和浅拷贝的区别是什么?
浅拷贝:仅复制对象的值类型属性,对于引用类型属性,只复制引用,即新旧对象共享同一个引用类型的实例。修改新对象的引用类型属性会影响原对象。 深拷贝:不仅复制对象的值类型属性,还递归地复制引用类型属性,即新旧对象的引用类型属性指向不同的实例。修改新对象的引用类型属性不会影响原对象。
Java序列化中如果有些字段不想进行序列化如何处理?
使用transient关键字 如果有些字段不想进行序列化,可以使用transient关键字来标记这些字段。被标记为transient的字段在序列化过程中会被忽略,不会被写入到序列化流中。 自定义序列化方法 通过实现Serializable接口的自定义序列化方法来控制序列化过程。这些方法是writeObject和readObject。
jdk8 有哪些新特性?
Lambda表达式、Stream流、函数式接口、默认方法和静态方法
介绍一下Java的数据结构
基本数据结构 数组 (Array):固定大小的容器,用于存储相同类型的元素。数组在内存中是连续存储的,支持通过索引快速访问元素。 集合框架 (JCF)List 接口:有序集合,允许重复元素。ArrayList:基于动态数组实现,支持快速随机访问和遍历。LinkedList:基于双向链表实现,适合频繁的插入和删除操作。Vector:类似于ArrayList,但线程安全。Set 接口:无序集合,不允许重复元素。HashSet:基于哈希表实现,提供快速的插入、删除和查找操作。LinkedHashSet:保持插入顺序的HashSet。TreeSet:基于红黑树实现,元素按自然顺序排序。Map 接口:键值对映射,不允许重复键。HashMap:基于哈希表实现,提供快速的键值对存取。LinkedHashMap:保持插入顺序的HashMap。TreeMap:基于红黑树实现,键按自然顺序排序。
运行时异常和非运行时异常的区别是什么?
运行时异常运行时异常是指在程序运行期间可能会发生的异常。这类异常是 RuntimeException 类及其子类的实例。1、 无需显式捕获或声明:方法中不需要显式地捕获或声明可能抛出的运行时异常。编译器不会强制要求你处理这些异常。2、通常是编程错误:运行时异常通常是由于编程错误引起的,例如访问空指针、数组越界、类型转换错误等。3、常见的运行时异常:● NullPointerException● ArrayIndexOutOfBoundsException● ClassCastException● IllegalArgumentException非运行时异常非运行时异常是指在编译时必须处理的异常。这类异常是 Exception 类及其子类的实例。1、 需要显式捕获或声明:方法中必须显式地捕获或声明可能抛出的非运行时异常。编译器会强制要求你处理这些异常。2、 通常是可预见的异常情况:非运行时异常通常是由于合理的、可以预见的异常情况引起的,例如文件未找到、网络连接失败等。3、 常见的非运行时异常:● IOException● SQLException● FileNotFoundException● ClassNotFoundException
装箱和拆箱的原理和作用?
装箱和拆箱是指基本类型与其对应的包装类之间的相互转换。装箱和拆箱的引入简化了基本类型与对象类型之间的转换操作,靠构造器自动转换
java函数参数是值拷贝还是引用拷贝?
基本类型参数传递 对于基本类型,传递的是值的拷贝。在函数内部对参数的任何修改都不会影响到原始变量。 引用类型参数传递 对于引用类型,传递的也是值的拷贝,但这个值是对象的引用。这意味着在函数内部可以通过引用修改对象的内容,但不能改变引用本身指向的对象。