Java基础问题

Java有哪些基础数据类型。

Java的基础数据类型(Primitive Data Types)包括以下几种:

  1. 整数类型(Integer Types):
    • byte:1字节,范围为-128到127。
    • short:2字节,范围为-32768到32767。
    • int:4字节,范围为-2147483648到2147483647。
    • long:8字节,范围为-9223372036854775808到9223372036854775807。
  2. 浮点类型(Floating-Point Types):
    • float:4字节,范围为1.4E-45到3.4028235E38,带有6-7位有效数字。
    • double:8字节,范围为4.9E-324到1.7976931348623157E308,带有15位有效数字。
  3. 字符类型(Character Type):
    • char:2字节,范围为0到65535,用于表示Unicode字符。
  4. 布尔类型(Boolean Type):
    • boolean:用于表示逻辑值,只有两个取值:true和false。

这些基础数据类型在Java中是直接支持的,它们具有固定的内存大小和取值范围,并且有对应的字面量表示方式。除了基础数据类型外,Java还提供了引用数据类型(Reference Types),如类、接口、数组等,这些类型可以通过关键字new来实例化。基础数据类型和引用数据类型之间有一些区别,例如基础数据类型存储的是值本身,而引用数据类型存储的是对象的引用。

JDK、JRE、JVM之间的区别。

String、StingBuffer、StringBuilder的区别。

==和equals的区别。

在Java中,”==”和”equals()”是用于比较对象的两个不同的操作符/方法,它们有以下区别:

  1. “==”操作符用于比较两个对象的引用是否相等。它比较的是对象的内存地址,即判断两个对象是否是同一个对象的引用。当使用”==”比较基本数据类型时,比较的是它们的值。
  2. “equals()”方法用于比较两个对象的内容是否相等。默认情况下,”equals()”方法比较的是两个对象的引用是否相等,与”==”操作符相同。但是,可以根据需要在类中重写”equals()”方法,以实现自定义的相等性比较逻辑。
  3. 通常情况下,”==”和”equals()”的行为是一致的,即当两个对象引用相等时,它们的内容一定相等。但是,当某个类重写了”equals()”方法时,它们的行为可能会有差异。
  4. 对于基本数据类型,”==”比较的是它们的值是否相等,而”equals()”方法不适用于基本数据类型,因为它是一个对象方法。
  5. 当比较引用数据类型时,需要注意”equals()”方法的重写,以确保比较的是对象的内容而不仅仅是引用。

总结起来,”==”操作符比较的是对象的引用是否相等,而”equals()”方法比较的是对象的内容是否相等。在比较引用数据类型时,通常应该使用”equals()”方法来确保正确的相等性比较。

hashCode()和equals()的关系。

hashCode()和equals()是Java中Object类的两个方法,它们在处理对象的相等性和集合操作中起着重要的作用。

equals()方法用于判断两个对象是否相等。它的默认实现是比较两个对象的引用是否相等(即比较内存地址),但可以根据需要进行重写。通常情况下,当我们希望比较对象的内容是否相等时,就需要重写equals()方法,并根据对象的特定属性进行比较。

hashCode()方法返回对象的哈希码(散列码)。哈希码是一个整数值,用于快速确定对象在哈希表等数据结构中的存储位置。hashCode()方法的默认实现使用对象的内存地址来计算哈希码,但也可以根据对象的内容计算哈希码。通常情况下,当我们重写equals()方法时,也需要同时重写hashCode()方法,以保证相等的对象具有相等的哈希码。

在Java中,hashCode()和equals()方法之间存在一个重要的约定,即如果两个对象相等(根据equals()方法的定义),则它们的哈希码必须相等。也就是说,如果两个对象通过equals()方法返回true,那么它们的hashCode()方法必须返回相同的值。这是为了保证对象在使用哈希表等数据结构时能够正确地工作。

需要注意的是,两个对象的哈希码相等,并不意味着它们一定相等。哈希码的计算可能存在冲突,不同的对象可能会生成相同的哈希码。因此,在进行哈希表等数据结构的操作时,仍然需要使用equals()方法进行详细的比较来确定对象的相等性。

总结起来,hashCode()和equals()方法在Java中是紧密相关的。重写equals()方法时,也应该同时重写hashCode()方法,以保持两者的一致性,从而正确地处理对象的相等性和集合操作。

泛型中extends和super的区别。

在Java泛型中,”extends”和”super”是用于限定泛型类型的关键字。它们的使用场景和含义有一些区别:

  1. “extends”关键字:
    • 在泛型类或泛型方法中使用时,用于限定类型参数必须是指定类型的子类(包括直接子类和间接子类)或者实现了指定接口的类。
    • 例如,class MyClass<T extends Number>表示泛型类型T必须是Number类或其子类。
    • 通过使用”extends”关键字,可以扩展泛型类型的范围,使其支持更多的具体类型。
  2. “super”关键字:
    • 在泛型类或泛型方法中使用时,用于限定类型参数必须是指定类型的父类(包括直接父类和间接父类)。
    • 例如,class MyClass<T super Number>表示泛型类型T必须是Number类或其父类。
    • 通过使用”super”关键字,可以实现对泛型类型的逆变,即可以接受指定类型及其父类型作为类型参数,从而更灵活地处理不同类型的数据。

总结起来,”extends”用于限定泛型类型必须是指定类型的子类或实现了指定接口的类,而”super”用于限定泛型类型必须是指定类型的父类。这两个关键字的使用使得泛型能够更加灵活地处理不同类型的数据,并增强了类型的安全性。