Java基础

目录

      • Java基础
            • 1. JVM是什么?为什么Java被称作是“平台无关的编程语言”(Java跨平台性)?
            • 2. JDK/JRE/JVM是什么关系
            • 3. 面向过程和面向对象的区别?
            • 4. Java的基本数据类型有哪些?
            • 5. Java基本数据类型的位数和取值范围?
            • ==6. 抽象类和接口的区别?==
            • 7. 重写和重载有什么区别?
            • 8. Java多态的实现有几种方式?
            • 9. Java四种修饰符的访问权限
            • 10. 怎么一次break跳出多重循环
            • 11. 说一下final关键字的用法
            • 12. String为何会产生很多对象?
            • 13. JVM中String的机制?
            • 14. Java传入值和引用的区别(Java的参数传递机制)?
            • 15. String、StringBuffer、StringBuilder的区别
            • 16. == 和 equals 的区别
            • 17. Object的equals()和hashCode()方法
            • 18. 为什么要重写equals?
            • 19. 为什么重写equals()的同时要重写hashCode()?
            • 1. 为什么重写equals方法的同时要重写hashCode方法?
        • 11. String中hashCode的实现?为什么 String 中的 hashCode 方法选择数字31作为乘子
            • 20. 两个对象的 hashCode() 相同,则 equals() 也一定为 true,对吗?
            • 21. 怎么判断两个对象是否相等?
            • 22. int和Integer的区别?
            • 23. 什么是自动装箱和自动拆箱?
            • 24. 什么时候会自动装箱,什么时候自动拆箱,
            • 25. 什么情况下不能将Integer赋值给int类型,什么情况下只能用Integer
            • 26. Java中的Exception分为哪几种?列举几种常见的异常
            • 27. finally一定执行吗?什么时候不被执行?
            • 28. try catch中多层catch的作用
            • 29. system.out.println()打印的是什么
            • 30. 限流算法?
            • 31. Java8新特性了解哪些,lambda表达式的filter方法map方法 (待完善)
            • 32. 是否可以在static环境中访问非static变量?
            • 33. ”static”关键字是什么意思?Java中是否可以覆盖(override)一个private或者是static的方法?
            • 34. 有无static的区别?
            • 35. Java 中的 Math. round(-1. 5) 等于多少?
            • 36. Java中,什么是构造方法?什么是构造方法重载?

Java基础

1. JVM是什么?为什么Java被称作是“平台无关的编程语言”(Java跨平台性)?
  • JVM(Java Virtual Machine)是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。 JVM屏蔽了与具体操作系统平台相关的信息,使Java程序只需生成在Java虚拟机上运行的字节码,就可以在多种平台上不加修改地运行。JVM在执行字节码时,实际上是把字节码解释成具体平台上的机器指令执行。
  • Java虚拟机(jvm)是可以执行java字节码的虚拟进程。 准确的来说,Java的跨平台指的是java源文件经过javac编译器编译成的二进制.class字节码的跨平台性。各个平台装有不同的jvm,而jvm能将相同的字节码翻译成平台相关的机器码,进而执行。
2. JDK/JRE/JVM是什么关系
  • JDK(Java Development Kit)是java语言开发工具包。包含了JRE,编译器和其他的工具(比如:JavaDoc,Java调试器),可以让开发者开发、编译、执行Java应用程序。
  • JRE(JavaRuntimeEnvironment)是Java运行环境。它包括JVM、Java核心类库等。
  • JVM(JavaVirtualMachine)是java虚拟机。是JRE的一部分。它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。JVM有自己完善的硬件架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。
3. 面向过程和面向对象的区别?
  • 面向过程就是先分析出解决问题需要的步骤,然后用函数把这些步骤一个个实现,使用的时候依次调用,面向过程的核心是过程。
  • 面向对象就是把构成问题的事物分解成一个个对象,建立对象不是为了实现一个步骤,而是为了描述某个事物在解决问题中的行为,面向对象的核心是对象。
4. Java的基本数据类型有哪些?
数据类型 默认值
byte,short,int,long 0
float,double 0.0
boolean false
char \u0000
引用数据类型 null
5. Java基本数据类型的位数和取值范围?

Java基础_第1张图片

6. 抽象类和接口的区别?

相同点:都不可以被实例化,都可以被继承,都可以有抽象方法
区别:

  • 接口中所有的方法都是抽象的,而抽象类则可以同时包含抽象和非抽象的方法。
  • 类可以实现多个接口,但是只能继承一个抽象类,接口之间可以多继承。
  • 接口中声明的变量默认都是static final的。抽象类可以包含非final非static的变量。
  • 接口中的抽象方法默认是public的。抽象类的抽象方法可以是public,protected或者是default的。抽象方法就是为了被重写所以不能使用private关键字修饰。
  • 从设计层面来说,抽象是对类的抽象,是一种模板设计,而接口是对行为的抽象,是一种行为的规范。
7. 重写和重载有什么区别?
  • 方法重载是指在同一个类里,两个或者多个方法具有相同的方法名,但是参数列表不同(个数、类型、顺序)。
  • 方法重写是指子类继承父类,重写父类的方法,要求方法名相同,参数列表相同,返回类型也要相同或者是其子类。访问权限>=父类,抛出异常必须<=父类

方法重载是编译时期的多态,而方法重写是运行时期的多态。

8. Java多态的实现有几种方式?

子类继承父类,子类重写父类的方法,父类型的引用指向子类型的对象。

9. Java四种修饰符的访问权限

Java基础_第2张图片

10. 怎么一次break跳出多重循环

可以在循环体开头设置一个标签,后面紧跟一个冒号,然后使用带此标签的break语句跳出多重循环

11. 说一下final关键字的用法
  1. final 表示最终的,不可变的。
  2. final修饰的类无法被继承,final修饰的方法无法被覆盖,final修饰的方法参数不能被修改,final修饰的变量一旦被赋值之后,不可再重新赋值。
  3. final修饰的类变量,必须在声明时初始化。
  4. final修饰的实例变量,必须在声明时或者构造方法中对它赋值。
12. String为何会产生很多对象?

String类的value域是被final修饰的,String对象在创建完成后value值就已经无法再修改了,所以每次对String进行操作产生的字符串都是新的String对象。

13. JVM中String的机制?
  • 当你new 一个String时,就会在堆中新建一个对象,String 引用指向这个对象,然后检查String pool(字符串池)中有没有和这个字符串内容一样的字符串,没有的话,将此字符串加入String pool。
  • 当使用String a = “abc”; 形式声明一个字符串时,jvm先检查字符串池里有没有 abc 这个字符串,有的话直接指向此字符串,没有的话在串池中增加这个字符串,然后指向它。
14. Java传入值和引用的区别(Java的参数传递机制)?
  • 如果传递的参数是基本数据类型,那么传入的是这个参数的一个副本,这个副本保存的就是原变量的值,改变副本不影响原变量。
  • 如果传递的参数是引用数据类型,那么传递的也是这个参数的一个副本,但是副本的值是一个对象的内存地址,如果对这个内存地址中的对象进行修改,就会影响原变量。如果改变了这个副本的值,也就是将副本的值修改为另一个对象的内存地址,这时不会影响原变量。
15. String、StringBuffer、StringBuilder的区别
  • String是不可变字符串对象,StringBuffer、StringBuilder是可变字符串对象。
  • String和StringBuffer是线程安全的,StringBuilder不是线程安全的。
  • 在字符串操作较少情况下,就用String,在字符串操作较多情况下,单线程用StringBuilder,多线程用StringBuffer。
16. == 和 equals 的区别
  • == 对于基本类型,比较的是值是否相同;对于引用类型,比较的是引用保存的对象的地址是否相同
  • Object 默认提供的 equals 方法比较的是对象的地址,但是很多类重写了 equals 方法,比如String、Integer 等 把引用比较改成了内容比较,所以一般情况下 equals 比较的是值。
17. Object的equals()和hashCode()方法

Object的hashCode值是根据对象的内存地址换算出来的一个值。
Object的equals方法是使用==,也就是判断内存地址是否相等。

18. 为什么要重写equals?

因为在实际的业务中可能不需要严格意义上的相等,只需要业务上的相等,这时就要重写equals()方法来满足业务需求

19. 为什么重写equals()的同时要重写hashCode()?

因为java关于hashCode有约定,如果两个对象根据equals(Object)方法是相等的,那么这两个对象的hashCode必须相等。
如果重写equals()却不重写hashCode(),就会违反这个约定。

1. 为什么重写equals方法的同时要重写hashCode方法?

  HashMap在进行put操作时,是通过hashCode计算对应桶的位置的,如果重写了equals方法,没重写hashCode方法,那么key相同的两个元素就有可能会分到不同的桶中,即使分到了一个桶中,后一个元素也不会覆盖掉前一个元素,hashMap判断两个对象是否相等会判断hash值和equals都相等才行。当我们进行get(key)操作时,也是要判断hash值和equals都相等才行,重写 hashCode 就是为了保证相同的对象返回相同的 hash 值,不同的对象返回不同的 hash 值,这样才能让我们准确的判断出要查找的值。

11. String中hashCode的实现?为什么 String 中的 hashCode 方法选择数字31作为乘子

  String类中hashCode的计算方法:它以31为权,用 自然溢出 来等效取模。哈希具体计算公式为:val[0] * 31 ^ (n-1) + val[1] * 31 ^ (n-2) + … + val[n-1] ,n 是 String 中 value 数组的长度,31 ^ 0 等于 1。之所以选择31是因为它是一个奇质数,它的乘法运算可以被位运算和减法运算取代,从而获取更好的性能:31 * i == (i << 5) - i 。

20. 两个对象的 hashCode() 相同,则 equals() 也一定为 true,对吗?

不一定。
两个String的HashCode()相同,但是equals()不一定相同。

21. 怎么判断两个对象是否相等?
  • 如果是判断两个对象是不是同一个对象,就用==判断;
  • 如果是判断两个对象的内容是否相等,就重写equals和hashCode方法,再用equals方法判断是否相等
22. int和Integer的区别?

区别:

  1. int则是java的一种基本数据类型,Integer是int的包装类,是引用数据类型。
  2. int变量直接存储数据值,Integer必须实例化后才能使用,存储的是对象的地址。
  3. int的默认值是0,Integer的默认值是null。
  4. java是面向对象的语言,都是基于对象操作的,比如集合,基本数据类型是放不进去的,包装类型才能放进去。
23. 什么是自动装箱和自动拆箱?

jdk1.5后可以自动实现装箱和拆箱。装箱是指,将基本数据转化成对象。转化为对象就可以利用对象的方法更方便的实现对数据的操作,也更符合面向对象编程的思想。拆箱就是装箱的逆过程,就是将对象转化为基本数据类型。

24. 什么时候会自动装箱,什么时候自动拆箱,
  • 在将基本类型的值赋值给包装类型时会自动装箱。例如:Integer a = 1;
  • 在将包装类型赋值给基本类型时会自动拆箱。例如:Integer a = 1;int b = a;
  • 包装类型和基本数据类型进行比较时,java会将包装类型自动拆箱为基本数据类型,然后进行比较
  • 包装类型在用运算符运算时,会自动拆箱
25. 什么情况下不能将Integer赋值给int类型,什么情况下只能用Integer
  • Integer为null时不可以,因为如果Integer赋值为null,然后再赋值给int类型,会出现空指针异常。
  • 如果需要区分未赋值和0的区别,就只能用Integer。因为int的默认值为0,而Integer的默认值为null。
  • 当需要往ArrayList,HashMap等集合中放东西时,int基本数据类型是放不进去的,因为容器都是装 object的,这时就需要包装类型Integer了。
26. Java中的Exception分为哪几种?列举几种常见的异常

编译时异常和运行时异常
NullPointerException
ClassCastException
ArrayIndexOutOfBoundsException
IllegalArgumentException

27. finally一定执行吗?什么时候不被执行?

不一定

  • 当程序进入try块之前就出现异常时,会直接结束,不会执行finally块中的代码
  • 当程序在try块中强制退出时也不会去执行finally块中的代码,比如在try块中有System.exit(0)语句。
  • 当程序意外中断,比如断电,使用stop结束线程,finally不会被执行
28. try catch中多层catch的作用

可以捕获多个异常类型,并对不同类型的异常做不同的处理
从上到下,从小到大捕捉

29. system.out.println()打印的是什么

打印的是对象的toString()方法,Objectl默认的toString()方法输出的是类名+@+哈希值的16进制形式,我们可以自己根据需要重写toString()方法。

30. 限流算法?

令牌桶算法和漏桶算法

31. Java8新特性了解哪些,lambda表达式的filter方法map方法 (待完善)

Lambda 表达式、方法引用、默认方法

32. 是否可以在static环境中访问非static变量?

不可以直接访问,需要通过创建对象访问。因为静态的成员会随着类的加载而加载到静态方法区内存,java虚拟机会对类的静态变量,静态方法进行初始化,此时如果静态方法中有非静态变量,由于非静态变量是随着实例的创建而创建的,此时还没有实例创建,所以非静态变量还没有创建,就会出现编译错误。所以不能直接访问,需要通过创建对象去访问。

33. ”static”关键字是什么意思?Java中是否可以覆盖(override)一个private或者是static的方法?
  • Static表示静态的意思。它可以修饰一个变量,一个方法,被其修饰的变量被称为类变量,被其修饰的方法称为类方法,随着类的加载而被加载。
  • 无法重写被private修饰的方法,因为被private修饰的父类方法在子类中是不可见的。
  • 静态方法形式上可以被重写,即子类中可以重写父类中静态的方法,但是在通过父类引用调用子类的这个已经重写的静态方法时,执行的还是父类的静态方法,子类的静态方法被隐藏了。
34. 有无static的区别?
  1. static 修饰的成员变量和成员方法在类加载的时候被加载到方法区。非static修饰的成员变量是要创建变量才被加载在堆内存中的。
  2. 引用static 修饰的成员变量和成员方法时 通过类名.调用,引用非static 修饰的成员变量和成员方法时只能通过对象名.或者this.调用。
35. Java 中的 Math. round(-1. 5) 等于多少?

Math.round 表示四舍五入
-1.4 ——》-1
-1.5 ——》-1
-1.6 ——》-2
1.4 ——》1
1.5 ——》2
1.6 ——》2

36. Java中,什么是构造方法?什么是构造方法重载?
  • 构造方法是类的对象在创建的时候会调用的方法。如果程序员没有设置构造方法,系统也会为该对象提供一个默认的构造方法。构造方法的方法名和类名一致,没有返回值。
  • 构造方法重载就是根据传入的参数不同设置多个构造方法,来供实例化时调用 。

NIO原理,怎么实现非阻塞IO(待整理)
2.Java NIO 讲一下(待整理)
2.1 NIO selector,epoll的区别(待整理)

你可能感兴趣的:(Java基础)