2021年最新Java面试题

先给大家复习一下基础题!!!

Java基础是java初学者的起点,是帮助你从小白入门到精通必学基础课程!

为初学者而著!

Java300集>>>适合准备入行开发的零基础员学习Java,基于最新JDK13、IDEA平台讲解的,视频中穿插多个实战项目。每一个知识点都讲解的通俗易懂,由浅入深。不仅适用于零基础的初学者,有经验的程序员也可做巩固学习。

配套学习:Java初学者入门教程>>>

一、 Java 基本概念

1、Java源程序的扩展名是什么?

.java

2、什么是标识符?

在java语言中能够我们自己起名的都叫标识符

3、标识符有哪些特点?

标识符是大小写字母、数字字符、$和_组成,不能以数字开头,也不能是java关键字,并且区分大小写

4、请说明环境变量Path 与 classpath 区别

path是系统用来指定可指定文件的完整路径。Path是用来搜索所执行的可执行文件路径的,如果执行的可执行文件不在当前目录下,那就会依次搜索path中设置的路径。

classpath是指定你在程序中所使用的类(.class)文件所在的位置。

 5、java程序经编译后产生的字节码文件扩展名是什么?

字节码文件扩展名是 .class

6、请说出常用的DOS命令并解释?

  • d: 回车
    盘符切换
  • dir (directory)
    列出当前目录下的文件以及文件夹
  • cd (change directory)
    改变指定目录(进入指定目录)
  • cd..
    退回到上一层目录
  • cd \
    退回到跟目录
  • md (make directory)
    创建目录
  • rd (remove directory)
    删除目录
  • del (delete)
    删除文件,删除一堆后缀名一样的文件*.txt
  • cls (clear screen)
    清屏
  • exit
    退出dos命令行

7、请解释Java语言的跨平台特性?

Java语言是跨平台运行的,其实就是不同的操作系统,使用不同的JVM映射规则,让其与操作系统无关,完成了跨平台性。JVM对上层的Java源文件是不关心的,它关注的只是由源文件生成的类文件(class file)。

8、请说明JDK、JRE、JVM的区别?

  • JDK
    Java Development Kit(Java开发工具包)。JDK是整个JAVA的核心,包括了Java运行环境(Java Runtime Environment),一堆Java工具(javac/java/javap等)
  • JRE
    Java Runtime Environment(java运行时环境)。也就是我们说的JAVA平台。所有的Java程序都要在JRE下才能运行。包括JVM和JAVA核心类库和支持文件。与JDK相比,它不包含开发工具(编译器、调试器和其他工具)。
  • JVM
    Java Virtual Mechinal(JAVA虚拟机)。JVM是JRE的一部分,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。

 

二、Java 基础

1、注释的分类及作用?

  • 单行注释
    注释单行代码或为单行代码添加描述的时候使用
  • 多行注释
    注释多行代码或为代码添加多行描述的时候使用
  • 文档注释
    生产java帮助文档的时候使用,开发中常用来描述类、描述方法

2、请说出Java中数据类型的分类?基本数据类型都有哪些?

  • 基本数据类型
    • byte
    • short
    • int
    • long
    • float
    • double
    • char
    • boolean
  • 引用数据类型
    • 数组
    • 接口

3、Java中数据的类型转换有几种?分别是什么?

  • 强制类型转换
    容量大的类型向容量小的类型转换时使用
  • 隐式类型转换
    容器小的类型向容量大的类型转换时使用

4、Java语言中的字符char可以存储一个中文汉字吗?为什么呢?

char型变量是用来存储Unicode编码的字符的,unicode编码字符集中包含了汉字,所以,char型变量中可以存储汉字。不过,如果某个特殊的汉字没有被包含在unicode编码字符集中,那么,这个char型变量中就不能存储这个特殊汉字。
补充说明:unicode编码占用两个字节,所以,char类型的变量也是占用两个字节。

5、请说明 && 和 & 的区别?

&和&&都可以用作逻辑与的运算符,表示逻辑与(and),当运算符两边的表达式的结果都为true时,整个运算结果才为true,否则,只要有一方为false,则结果为false。

&&还具有短路的功能,即如果第一个表达式为false,则不再计算第二个表达式

&还可以用作位运算符,当&操作符两边的表达式不是boolean类型时,&表示按位与操作。

6、请说明 == 与 = 的区别?

  • ==
    比较运算符,用来比较操作符两边的变量的值是否相等。
  • =
    赋值运算符,把操作符右边的值,赋值给左边的变量

7、三元运算符的基本格式是什么?

三元运算符的格式是: 条件表达式 ? 表达式1 : 表达式2

8、三元运算符的执行流程是什么?

三元运算符的执行流程: 首先计算条件表达式的值看其返回结果是true还是false,如果是true就执行表达式1,如果是false就执行表达式2

9、使用键盘录入数据的三个步骤是什么?

  • 第一步导包
    格式: import java.util.Scanner ;位置: 在class上边
  • 第二步创建Scanner对象
    格式: Scanner sc = new Scanner(System.in) ;
  • 第三步获取键盘录入数据
    格式: int x = sc.nextInt() ;

10、请说明for、while、do…while三种循环的格式以及执行流程,以及它们的区别。

  • for循环语句格式
    for(初始化语句;判断条件语句;控制条件语句) {
    循环体语句;
    }
    • 执行流程:
      1. 执行初始化语句
      2. 执行判断条件语句,看其结果是true还是false,如果是false,循环结束;如果是true,继续执行。
      3. 执行循环体语句
      4. 执行控制条件语句
      5. 回到b继续
  • while循环语句格式
    while(判断条件语句) {
    循环体语句;
    }
    • 执行流程:
      1. 执行判断条件语句,看其结果是true还是false
        如果是false,循环结束。
        如果是true,继续执行。
      2. 执行循环体语句
      3. 回到a继续
  • do…while循环语句格式
    do {
    循环体语句;
    }while((判断条件语句);
    • 执行流程:
      1. 执行循环体语句
      2. 执行判断条件语句,看其结果是true还是false,如果是false,循环结束;如果是true,继续执行。
      3. 回到a继续
  • 三种循环语句的区别
    • do…while循环至少会执行一次循环体
    • for循环和while循环只有在条件成立的时候才会去执行循环体

注意:写程序优先考虑for循环,再考虑while循环,最后考虑do…while循环

11、定义一个方法的格式是什么,以及方法的注意事项?

  • 格式
    修饰符 返回值类型 方法名(参数类型 参数名1, 参数类型 参数名2 ….){
    方法体 ;
    return 返回值 ;
    }
  • 注意事项
    A. 方法不调用不执行
    B. 方法与方法是平级关系,不能嵌套定义
    C. 方法定义的时候参数之间用逗号隔开
    D. 方法调用的时候不用在传递数据类型
    E. 如果方法有明确的返回值,一定要有return带回一个值

12、private 关键字在哪里使用? 被 private 修饰的成员有什么特点?

类中的成员需要私有的时候使用private关键字
特点:
是一个权限修饰符。
可以修饰成员(成员变量和成员方法)
被private修饰的成员只在本类中才能访问

13、为什么要有 this 关键字?this 关键字的含义?

this用来解决成员变量与局部变量重名问题
this关键字代表的是本类对象引用;谁调用我,this就代表谁.

14、final 关键字是什么意思,可以修饰那些成员?被修饰的成员有哪些特点?

final最终的意思。

  • 可修饰

    • 成员变量
    • 成员方法
  • 特点

    • final修饰类,此类不能被继承。
    • final修饰变量,变量就成了常量,只能被赋值一次
    • final修饰方法,方法不能被重写

15、形式参数是基本类型要的是什么?是类名、抽象类名、接口名时分别要的是什么?

形式参数是基本类型要的是一个基本类型的变量或者具体的常量值

  • 类名时
    要的是一个该类的对象
  • 抽象类名时
    要的是一个继承自该类的一个子类对象
  • 接口时
    要的是一个实现了该接口的子类对象

16、返回值类型是基本类型返回的是什么?是类名、抽象类名、接口名分别返回的是什么?

返回值是基本数据类型的时候返回的是一个具体的值

  • 类名时
    本质上返回的是一个该类对应的子类对象
  • 抽象类名时
    返回的应该是一个继承自该类的子类对象
  • 接口名的时
    返回的是一个实现了该接口的子类对象

17、package它有什么作用?

package,包的意思,其实就是文件夹,它可以对类进行分类管理

18、import的作用?

在不同包下的类之间相互访问的时候,发现,每次使用不同包下的类的时候,都需要加包的全路径。比较麻烦,这个时候,java就提供了( import )导包的功能。
使用import可以将包中的类导入进来,以后使用类的时候,不需导包,直接使用,简化了书写

19、请解释 ==与equals()方法的区别?

== 解读

对于基本类型和引用类型 == 的作用效果是不同的,如下所示:

  • 基本类型:比较的是值是否相同;
  • 引用类型:比较的是引用是否相同;

代码示例:

String x = "string";String y = "string";String z = new String("string");System.out.println(x==y); // trueSystem.out.println(x==z); // falseSystem.out.println(x.equals(y)); // trueSystem.out.println(x.equals(z)); // true

代码解读:因为 x 和 y 指向的是同一个引用,所以 == 也是 true,而 new String()方法则重写开辟了内存空间,所以 == 结果为 false,而 equals 比较的一直是值,所以结果都为 true。

equals 解读

equals 本质上就是 ==,只不过 String 和 Integer 等重写了 equals 方法,把它变成了值比较。看下面的代码就明白了。

首先来看默认情况下 equals 比较一个有相同值的对象,代码如下:

class Cat { public Cat(String name) { this.name = name; } private String name; public String getName() { return name; } public void setName(String name) { this.name = name; }}Cat c1 = new Cat("mbb");Cat c2 = new Cat("mbb");System.out.println(c1.equals(c2)); // false

输出结果出乎我们的意料,竟然是 false?这是怎么回事,看了 equals 源码就知道了,源码如下:

public boolean equals(Object obj) { return (this == obj);}

原来 equals 本质上就是 ==。

那问题来了,两个相同值的 String 对象,为什么返回的是 true?代码如下:

String s1 = new String("mbb");String s2 = new String("mbb");System.out.println(s1.equals(s2)); // true

同样的,当我们进入 String 的 equals 方法,找到了答案,代码如下:

public boolean equals(Object anObject) { if (this == anObject) { return true; } if (anObject instanceof String) { String anotherString = (String)anObject; int n = value.length; if (n == anotherString.value.length) {  char v1[] = value;  char v2[] = anotherString.value;  int i = 0;  while (n-- != 0) {  if (v1[i] != v2[i])   return false;  i++;  }  return true; } } return false;}

原来是 String 重写了 Object 的 equals 方法,把引用比较改成了值比较。

总结 :== 对于基本类型来说是值比较,对于引用类型来说是比较的是引用;而 equals 默认情况下是引用比较,只是很多类重新了 equals 方法,比如 String、Integer 等把它变成了值比较,所以一般情况下 equals 比较的是值是否相等。

20、请简述泛型是什么?有什么用?在哪里用?

  • 泛型是什么?
    泛型是一种特殊的类型,它把指定类型的工作推迟到客户端代码声明并实例化类或方法的使用进行。也被称为参数化类型,可以把类型当做参数一样传递过来,在传递过来之前我不明确,但是在使用的时候就就明确了。
  • 泛型的好处
    • 提高了程序的安全性
    • 将运行期遇到的问题转移到了编译期
    • 省去了类型强转的麻烦
  • 泛型的常见应用
    • 泛型类
    • 泛型方法
    • 泛型接口

21、如何编写一个泛型方法,让它能够接受泛型参数并返回泛型类型?并举例

泛型方法,指把泛型定义在方法上,使用泛型类型来替代原始类型

public static T[] sort(T[] t){ Arrays.sort(t); return t;}

22、请简述Java中如何使用泛型编写带有参数的类?并举例

泛型类,指把泛型定义在类上,使用泛型类型来替代原始类型

class GenericClass { private T t; public void setT(T t) { this.t = t; } public T getT() { return t; }}

23、请说说文件名称过滤器FilenameFilter的作用?

FilenameFilter是文件名过滤器,用来过滤不符合规则的文件名,并返回合格的文件。

24、请简述递归是什么?注意事项是什么?

所谓递归,是指程序调用自身
注意,递归不会无休止地调用下去,它必然有一个出口,当满足条件时程序也就结束了,不然的话,那就是死循环了。

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

不对,两个对象的 hashCode() 相同,equals() 不一定 true。

代码示例:

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:1179395false

代码解读:很显然“通话”和“重地”的 hashCode() 相同,然而 equals() 则为 false,因为在散列表中,hashCode() 相等即两个键值对的哈希值相等,然而哈希值相等,并不一定能得出键值对相等。

26、Java 中的 Math. round(-1. 5) 等于多少?

等于 -1,因为在数轴上取值时,中间值(0.5)向右取整,所以正 0.5 是往上取整,负 0.5 是直接舍弃。

三、Java 变量

1、请写出Java标识符的命名规则


  • 全部小写
  • 单层包
    小写,举例:itcast,com
  • 多层包
    小写,并用 . 隔开,举例:cn.itcast, com.baidu
  • 类或者接口:
    • 一个单词
      首字母大写,举例:Student,Demo
    • 多个单词
      每个单词首字母大写,举例:HelloWorld,StudentName
  • 方法或者变量:
    • 一个单词
      首字母小写,举例:name,main
    • 多个单词
      从第二个单词开始,每个单词首字母大写,举例:studentAge,showStudentNames()
  • 常量
    全部大写
    • 一个单词
      大写,举例:PI
    • 多个单词
      大写,并用 _ 隔开,举例:STUDENT_MAX_AGE

2、变量是什么?

变量,在程序运行时,值可以被修改的量。

3、变量的定义格式是什么?

数据类型 变量名 = 变量值

4、成员变量与局部变量的区别?

  • 在类中的位置不同
    成员变量:在类中方法外
    局部变量:在方法定义中或者方法声明上

  • 在内存中的位置不同
    成员变量:在堆内存
    局部变量:在栈内存

  • 生命周期不同
    成员变量:随着对象的创建而存在,随着对象的消失而消失
    局部变量:随着方法的调用而存在,随着方法的调用完毕而消失

  • 初始化值不同
    成员变量:有默认初始化值
    局部变量:没有默认初始化值,必须定义,赋值,然后才能使用。

5、静态变量与成员变量的区别?

  • 所属不同
    静态变量属于类,所以也称为为类变量
    成员变量属于对象,所以也称为实例变量(对象变量)

  • 内存中位置不同
    静态变量存储于方法区的静态区
    成员变量存储于堆内存

  • 内存出现时间不同
    静态变量随着类的加载而加载,随着类的消失而消失
    成员变量随着对象的创建而存在,随着对象的消失而消失

  • 调用不同
    静态变量可以通过类名调用,也可以通过对象调用
    成员变量只能通过对象名调用

四、Java String

1、String s = “a”+“b”+”c”; 创建了多少对象,分别是什么?

  • 5个对象
    • a
    • b
    • c
    • ab
    • abc

因为字符串的特点是一旦被创建就不能被改变,所有在使用常量进行相加的时候,都是在创建新的字符串对象,最后在把字符串"abc"这个常量值赋值给引用变量s

2、如何实现StringBuffer和String的相互转换?

  1. 通过String类的构造方法
  2. 通过StringBuffer类中的toString()方法
  3. 通过StringBuffer类中的substring()方法 (注:不常用)
    String 转换到 StringBuffer的方式:
  4. 通过StringBuffer类的构造方法
  5. 通过StringBuffer类的append()、insert()方法

3、如何实现String和int数据的相互转换

  1. String – Integer – int通过Integer类的intValue()方法
  2. 通过Integer类的parseInt(String s)方法
    Int 转换到 String的方式:
  3. Int – Integer – String Integer的toSting()
  4. 通过String类的valueOf()方法
  5. 通过Integer类的toSting(int i)方法
  6. 通过与字符串""相连接

4、如何实现【基本数据类型】与【基本数据封装类】之间的相互转换

  1. 通过包装类的构造方法
  2. 通过包装类的静态方法valueOf()
    包装类 转换到 基本数据类型的方式:
  3. 通过包装类的方法xxxValue()

5、请说明String与StringBuffer二者之间的区别?

String类表示内容不可以改变的字符串
StringBuffer类表示内容可以被修改的字符串

6、请说明StringBuffer与StringBilder二者之间的区别?

  • StringBilder
    是线程不安全的,运行效率高

    如果一个字符串变量是在方法里面定义,这种情况只可能有一个线程访问它,不存在不安全的因素了,则用StringBuilder。

  • StringBuffer
    是线程安全的,运行要低于StringBilder

    如果要在类里面定义成员变量,并且这个类的实例对象会在多线程环境下使用,那么最好用StringBuffer。

7、什么是正则表达式?

正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。在很多文本编辑器里,正则达表示通常被用来检索、替换那些符合某个模式的文本。

8、如何实现Date与long相互转换?

  • Date 转 long
    通过Date类的getTime()方法
  • long 转 Date
    通过Date类的构造方法

9、如何实现Date与String相互转换?

  • Date 转 String

    • Date类的toString()方法
    • DateFormat类的format()方法
  • String 转 Date

    • Date类的构造方法

      已过时,被DateFormat类的parse(String s)方法取代

    • DateFormat类的parse()方法

10、String 属于基础的数据类型吗?

String 不属于基础类型
基础类型有 8 种:

  • byte
  • boolean
  • char
  • short
  • int
  • float
  • long
  • double

而 String 属于对象

11、String str=“i” 与 String str=new String(“i”)一样吗?

不一样,因为内存的分配方式不一样。String str="i"的方式,Java 虚拟机会将其分配到常量池中;而 String str=new String(“i”) 则会被分到堆内存中。

12、如何将字符串反转?

使用 StringBuilder 或者 stringBuffer 的 reverse() 方法。

示例代码:

// StringBuffer reverseStringBuffer stringBuffer = new StringBuffer();stringBuffer.append("abcdefg");System.out.println(stringBuffer.reverse()); // gfedcba// StringBuilder reverseStringBuilder stringBuilder = new StringBuilder();stringBuilder.append("abcdefg");System. out. println(stringBuilder.reverse()); // gfedcba

13、String 类的常用方法都有那些?

  • indexOf():返回指定字符的索引。
  • charAt():返回指定索引处的字符。
  • replace():字符串替换。
  • trim():去除字符串两端空白。
  • split():分割字符串,返回一个分割后的字符串数组。
  • getBytes():返回字符串的 byte 类型数组。
  • length():返回字符串长度。
  • toLowerCase():将字符串转成小写字母。
  • toUpperCase():将字符串转成大写字符。
  • substring():截取字符串。
  • equals():字符串比较。

大伙伴们需要巩固Java基础的可以复习一下>>>

小伙伴如果想要学习更多的知识,学习材料可以,工众号:编程领域

Java初学者学习教程:Java初学者入门教程>>>

 

Guess you like

Origin blog.csdn.net/asdfdghjkl/article/details/121143287