今天来聊聊Java基础(二)面试题

1,Java特点

并发性的: 你可以在其中执行许多语句,而不必一次执行它。

面向对象的:基于类和面向对象的编程语言。

独立性的: 支持一次编写,到处运行的独立编程语言,即编译后的代码可以在支持 Java 的所有平台上运行。

2,Java 特征

  • 简单,Java 会让你的工作变得更加轻松,使你把关注点放在主要业务逻辑上,而不必关心指针、运算符重载、内存回收等与主要业务无关的功能。
  • 便携性,Java 是平台无关性的,这意味着在一个平台上编写的任何应用程序都可以轻松移植到另一个平台上。
  • 安全性, 编译后会将所有的代码转换为字节码,人类无法读取。它使开发无病毒,无篡改的系统/应用成为可能。

字节码是指的java程序编译后的结果。是一组8位字节为基础单位的二进制流

  • 动态性,它具有适应不断变化的环境的能力,它能够支持动态内存分配,从而减少了内存浪费,提高了应用程序的性能。
  • 分布式,Java 提供的功能有助于创建分布式应用。使用远程方法调用(RMI),程序可以通过网络调用另一个程序的方法并获取输出。您可以通过从互联网上的任何计算机上调用方法来访问文件。这是革命性的一个特点,对于当今的互联网来说太重要了。
  • 健壮性,Java 有强大的内存管理功能,在编译和运行时检查代码,它有助于消除错误。
  • 高性能,Java 最黑的科技就是字节码编程,Java 代码编译成的字节码可以轻松转换为本地机器代码。通过 JIT 即时编译器来实现高性能。
  • 解释性,Java 被编译成字节码,由 Java 运行时环境解释。
  • 多线程性,Java支持多个执行线程(也称为轻量级进程),包括一组同步原语。这使得使用线程编程更加容易,Java 通过管程模型来实现线程安全性。

3,面向对象特征

  • 封装:封装是面向对象的特征之一,是对象和类概念的主要特性。封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。
  • 继承:继承指的是使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。
  • 多态:多态是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。

4,值传递和引用传递的区别

值传递 是指在调用函数时将实际参数复制一份到函数中,这样的话如果函数对其传递过来的形式参数进行修改,将不会影响到实际参数。

引用传递 是指在调用函数时将对象的地址直接传递到函数中,如果在对形式参数进行修改,将影响到实际参数的值。

下面是简单程度的理解

java实际只有值传递,并非是引用传递,非基础类型传递应当是地址作为值。

总结: 除了基本类型之外的,所有类型,包括数组的赋值,都是引用传递,这一句话就可以搞定了。

(不确定,后续修改)

5,==和equal的区别 (后续应该补充hashcode)

== 和 equals 区别是什么

== 是 Java 中一种操作符,它有两种比较方式

  • 对于基本数据类型来说, == 判断的是两边的值是否相等
public class DoubleCompareAndEquals {
Person person1 = new Person(24,"boy");
 Person person2 = new Person(24,"girl");
 int c = 10;
private void doubleCompare(){
int a = 10;
 int b = 10;
System.out.println(a == b);
 System.out.println(a == c);
 System.out.println(person1.getId() == person2.getId());
 }
 }

  • 对于引用类型来说, == 判断的是两边的引用是否相等,也就是判断两个对象是否指向了同一块内存区域。

private void equals(){
 System.out.println(person1.getName().equals(person2.getName()));
 }

equals 是 Java 中所有对象的父类,即 Object 类定义的一个方法。它只能比较对象,它表示的是引用双方的值是否相等。所以记住,并不是说 == 比较的就是引用是否相等,equals 比较的就是值,这需要区分来说的。

equals 用作对象之间的比较具有如下特性

  • 自反性:对于任何非空引用 x 来说,x.equals(x) 应该返回 true。
  • 对称性:对于任何非空引用 x 和 y 来说,若x.equals(y)为 true,则y.equals(x)也为 true。
  • 传递性:对于任何非空引用的值来说,有三个值,x、y 和 z,如果x.equals(y) 返回true,y.equals(z) 返回true,那么x.equals(z) 也应该返回true。
  • 一致性:对于任何非空引用 x 和 y 来说,如果 x.equals(y) 相等的话,那么它们必须始终相等。
  • 非空性:对于任何非空引用的值 x 来说,x.equals(null) 必须返回 false。

6,数据类型(重点)

在 Java 中,数据类型只有四类八种

  • 整数型:byte、short、int、long

byte 也就是字节,1 byte = 8 bits,byte 的默认值是 0 ;

short 占用两个字节,也就是 16 位,1 short = 16 bits,它的默认值也是 0 ;

int 占用四个字节,也就是 32 位,1 int = 32 bits,默认值是 0 ;

long 占用八个字节,也就是 64 位,1 long = 64 bits,默认值是 0L;

所以整数型的占用字节大小空间为 long > int > short > byte

  • 浮点型

浮点型有两种数据类型:float 和 double

float 是单精度浮点型,占用 4 位,1 float = 32 bits,默认值是 0.0f;

double 是双精度浮点型,占用 8 位,1 double = 64 bits,默认值是 0.0d;

  • 字符型

字符型就是 char,char 类型是一个单一的 16 位 Unicode 字符,最小值是 \u0000 (也就是 0 ),最大值是 \uffff (即为 65535),char 数据类型可以存储任何字符,例如 char a = ‘A’。

  • 布尔型

布尔型指的就是 boolean,boolean 只有两种值,true 或者是 false,只表示 1 位,默认值是 false。

以上 x 位都指的是在内存中的占用。

7,String 中的 equals 是如何重写的

看文档。

8,为什么重写 equals 方法必须重写 hashcode 方法

看文档。

9,两个对象的 hashcode 相同,那么 equals 是否也一定为 true(错误)

这个肯定是不一定的,举个非常简单的例子,你重写了 hashcode 方法,来算取余数,那么两个对象的 hashcode 很可能重复,但是两个对象的 equals 却不一定相同。

就算你不重写 hashcode 方法,我给你一段代码示例

String str1 = “通话”;
String str2 = “重地”;
System. out. println(String. format(“str1:%d | str2:%d”, str1. hashCode(),str2. hashCode()));
System. out. println(str1. equals(str2));

上面两段代码的输出结果是

str1:1179395 | str2:1179395

false

这两个字符串的 equals 并不相同。也就是说,就算是 hashcode 相同的字符串,equals 也有可能不同。

10,String s1 = new String(“abc”) 在内存中创建了几个对象

一个或者两个,String s1 是声明了一个 String 类型的 s1 变量,它不是对象。使用 new 关键字会在堆中创建一个对象,另外一个对象是 abc ,它会在常量池中创建,所以一共创建了两个对象;如果 abc 在常量池中已经存在的话,那么就会创建一个对象。

正文完