Java基础面试题(二)

1、hashCode()相同,equals()也一定相同么

不一定,同时反过来equals()为true,hashCode()也不一定相同。

hashCode()返回该对象的哈希码值,equals()返回两个对象是否相等。

关于 hashCode() 和 equals() 是方法是有一些 常规协定:

1、两个对象用 equals() 比较返回true,那么两个对象的hashCode()方法必须返回相同的结果。

2、两个对象用 equals() 比较返回false,不要求hashCode()方法也一定返回不同的值,但是最好返回不同值,以提高哈希表性能。

3、重写 equals() 方法,必须重写 hashCode() 方法,以保证 equals() 方法相等时两个对象 hashcode() 返回相同的值。

2、finally和finalize

异常处理的一部分,它只能用在try/catch语句中,表示希望finally语句块中的代码最后一定被执行(存在一些情况导致finally语句块不会被执行,如JVM结束)

finalize()是在java.lang.Object里定义的,Object的finalize()方法什么都不做,对象被回收时finalize()方法会被调用。Java技术允许使用finalize()方法在垃圾收集器将对象从内存中清除出去之前做必要清理工作,在垃圾收集器删除对象之前被调用的。一般情况下,此方法由JVM调用。特殊情况下,可重写finalize()方法,当对象被回收的时候释放一些资源,需要调用super.finalize()。

3、finally语句块一定执行么

1)直接返回未执行到try-finally语句块

2)抛出异常为执行到try-finally语句块

3)系统退出未执行到finally语句块

4、return和finally的执行顺序对返回值的影响

对于try和finally至少一个语句包含return语句的情况:

1)finally语句块会执行

2)finally没有return,finally对return变量的 重新赋值修改无效

3)try和finally都包含return,return值会以finally语句块值为准

5、Java.lang.Math类

(1)ceil():向上取整,返回类型是double,如-1.5返回-1.0

(2)floor():向下取整,返回类型是double,如-1.5返回-2.0

(3)round():向正无穷大方向返回参数最接近的整数,返回类型是int或long,如-1.5返回-1

6、String类常用方法

  • equals:字符串是否相同

  • equalsIgnoreCase:忽略大小写后字符串是否相同

  • compareTo:根据字符串中每个字符的Unicode编码进行比较

  • compareToIgnoreCase:根据字符串中每个字符的Unicode编码进行忽略大小写比较

  • indexOf:目标字符或字符串在源字符串中位置下标

  • lastIndexOf:目标字符或字符串在源字符串中最后一次出现的位置下标

  • valueOf:其他类型转字符串

  • charAt:获取指定下标位置的字符

  • codePointAt:指定下标的字符的Unicode编码

  • concat:追加字符串到当前字符串

  • isEmpty:字符串长度是否为0

  • contains:是否包含目标字符串

  • startsWith:是否以目标字符串开头

  • endsWith:是否以目标字符串结束

  • format:格式化字符串

  • getBytes:获取字符串的字节数组

  • getChars:获取字符串的指定长度字符数组

  • toCharArray:获取字符串的字符数组

  • join:以某字符串,连接某字符串数组

  • length:字符串字符数

  • matches:字符串是否匹配正则表达式

  • replace:字符串替换

  • replaceAll:带正则字符串替换

  • replaceFirst:替换第一个出现的目标字符串

  • split:以某正则表达式分割字符串

  • substring:截取字符串

  • toLowerCase:字符串转小写

  • toUpperCase:字符串转大写

  • trim:去字符串首尾空格

7、接口和抽象类的区别

  • 抽象类可以有构造方法;接口中不能有构造方法。

  • 抽象类中可以有普通成员变量;接口中没有普通成员变量。

  • 抽象类中可以包含非抽象普通方法;JDK1.8 以前接口中的所有方法默认都是抽象的,JDK1.8 开始方法可以有 default 实现和 static 方法。

  • 抽象类中的抽象方法的访问权限可以是 public、protected 和 default;接口中的抽象方法只能是 public 类型的,并且默认即为 public abstract 类型。

  • 抽象类中可以包含静态方法;JDK1.8 前接口中不能包含静态方法,JDK1.8 及以后可以包含已实现的静态方法。

  • 抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量可以是任意访问权限;接口中变量默认且只能是 public static final 类型。

  • 一个类可以实现多个接口,用逗号隔开,但只能继承一个抽象类。

  • 接口不可以实现接口,但可以继承接口,并且可以继承多个接口,用逗号隔开。

8、访问权限修饰符

 当前类同一package子孙类其他package的类
public T T T T
protected T T T F
默认的(友好的) T T F F
private T F F F

9、Java中<< >> >>>

<< 表示左移,不分正负数,低位补0

>> 表示右移,正数则高位补0,负数则高位补1

>>> 表示无符号右移,也叫逻辑右移,正数负数右移后均高位补0

10、Javap的作用

 1 javap -help
 2 用法: javap <options> <classes>
 3 其中, 可能的选项包括:
 4   -help  --help  -?        输出此用法消息
 5   -version                 版本信息
 6   -v  -verbose             输出附加信息
 7   -l                       输出行号和本地变量表
 8   -public                  仅显示公共类和成员
 9   -protected               显示受保护的/公共类和成员
10   -package                 显示程序包/受保护的/公共类
11                            和成员 (默认)
12   -p  -private             显示所有类和成员
13   -c                       对代码进行反汇编
14   -s                       输出内部类型签名
15   -sysinfo                 显示正在处理的类的
16                            系统信息 (路径, 大小, 日期, MD5 散列)
17   -constants               显示静态最终常量
18   -classpath <path>        指定查找用户类文件的位置
19   -bootclasspath <path>    覆盖引导类文件的位置

 

写一个测试类:

1 public class TestSynchronized {
2 3     public void sync() {
4         synchronized (this) {
5             System.out.println("sync");
6         }
7     }
8 }

 

使用命令进行反汇编 javap -c TestSynchronized

 1 警告: 二进制文件TestSynchronized包含constxiong.interview.TestSynchronized
 2 Compiled from "TestSynchronized.java"
 3 public class constxiong.interview.TestSynchronized {
 4   public constxiong.interview.TestSynchronized();
 5     Code:
 6        0: aload_0
 7        1: invokespecial #8                  // Method java/lang/Object."<init>":()V
 8        4: return
 9  
10   public void sync();
11     Code:
12        0: aload_0
13        1: dup
14        2: astore_1
15        3: monitorenter
16        4: getstatic     #15                 // Field java/lang/System.out:Ljava/io/PrintStream;
17        7: ldc           #21                 // String sync
18        9: invokevirtual #22                 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
19       12: aload_1
20       13: monitorexit
21       14: goto          20
22       17: aload_1
23       18: monitorexit
24       19: athrow
25       20: return
26     Exception table:
27        from    to  target type
28            4    14    17   any
29           17    19    17   any
30 }

11、throw和throws的区别

throw:

1)表示方法内抛出某种异常对象(只能是一个);

2)用于程序员自行抛出异常;

3)位于方法体内,可以作为单独语句使用;

4)如果异常对象是非RuntimeException则需要在方法申明时加上该异常的抛出,即需要加上throws语句或者在方法体内try catch处理该异常,否则编译报错;

5)执行到throw语句则后面的语句块不再执行。

throws:

1)方法的定义使用throws表示这个方法可能抛出了异常(可以有多个);

2)用于声明该方法内抛出了异常;

3)必须跟在方法参数列表的后面,不能单独使用;

4)需要由方法的调用者进行异常处理。

12、常见异常结构

Throwable |  ├ Error

|  │ ├ IOError

|  │ ├ LinkageError

|  │ ├ ReflectionError

|  │ ├ ThreadDeath

|  │ └ VirtualMachineError

|  │

|  ├ Exception

|  │ ├ CloneNotSupportedException

|  │ ├ DataFormatException

|  │ ├ InterruptedException

|  │ ├ IOException

|  │ ├ ReflectiveOperationException

|  │ ├ RuntimeException

|  │  ├ ArithmeticException

|  │  ├ ClassCastException

|  │  ├ ConcurrentModificationException

|  │  ├ IllegalArgumentException

|  │  ├ IndexOutOfBoundsException

|  │  ├ NoSuchElementException

|  │  ├ NullPointerException

|  │  └ SecurityException

|  │ └ SQLException

13、nio中的Files类常用方法、

  • isExecutable:文件是否可以执行

  • isSameFile:是否同一个文件或目录

  • isReadable:是否可读

  • isDirectory:是否为目录

  • isHidden:是否隐藏

  • isWritable:是否可写

  • isRegularFile:是否为普通文件

  • getPosixFilePermissions:获取POSIX文件权限,windows系统调用此方法会报错

  • setPosixFilePermissions:设置POSIX文件权限

  • getOwner:获取文件所属人

  • setOwner:设置文件所属人

  • createFile:创建文件

  • newInputStream:打开新的输入流

  • newOutputStream:打开新的输出流

  • createDirectory:创建目录,当父目录不存在会报错

  • createDirectories:创建目录,当父目录不存在会自动创建

  • createTempFile:创建临时文件

  • newBufferedReader:打开或创建一个带缓存的字符输入流

  • probeContentType:探测文件的内容类型

  • list:目录中的文件、文件夹列表

  • find:查找文件

  • size:文件字节数

  • copy:文件复制

  • lines:读出文件中的所有行

  • move:移动文件位置

  • exists:文件是否存在

  • walk:遍历所有目录和文件

  • write:向一个文件写入字节

  • delete:删除文件

  • getFileStore:返回文件存储区

  • newByteChannel:打开或创建文件,返回一个字节通道来访问文件

  • readAllLines:从一个文件读取所有行字符串

  • setAttribute:设置文件属性的值

  • getAttribute:获取文件属性的值

  • newBufferedWriter:打开或创建一个带缓存的字符输出流

  • readAllBytes:从一个文件中读取所有字节

  • createTempDirectory:在特殊的目录中创建临时目录

  • deleteIfExists:如果文件存在删除文件

  • notExists:判断文件不存在

  • getLastModifiedTime:获取文件最后修改时间属性

  • setLastModifiedTime:更新文件最后修改时间属性

  • newDirectoryStream:打开目录,返回可迭代该目录下的目录流

  • walkFileTree:遍历文件树,可用来递归删除文件等操作

14、动态代理是什么以及应用场景

1)动态代理:在运行时,创建目标类,可以调用和扩展目标类的方法。

2)Java中实现动态的方式:

JDK中的动态代理

Java类库CGLib动态代理

使用Spring AOP模块完成动态代理功能

3)应用场景:

统计每个api的请求耗时

统一的日志输出

校验被调用的api是否已经登录和权限鉴定

String的AOP功能模块就是采用动态代理的机制来实现切面编程

15、什么是Java序列化,什么情况需要序列化

1)序列化:将Java对象转换成字节流的过程

2)反序列化:将字节流转换成Java对象的过程

当Java对象需要在网络上传输或者持久化存储到文件中时,就需要对Java对象进行序列化处理。

3)序列化的实现:类实现Serializable接口,这个接口没有需要实现的方法,实现这个接口就是为了告诉JVM这个类对象可以被序列化。

注意:

某个类可以被序列化,则其子类也可以被序列化

对象中的某个属性是对象类型,需要序列化也必须实现Serializable接口

声明为static和transient的成员变量,不能被序列化。static成员变量是描述类级别的属性,transient表示临时数据

反序列化读取序列化对象的顺序要保持一致

16、什么情景需要clone克隆

方法需要return引用类型,但又不希望自己持有引用类型的对象被修改;

程序之间方法的调用时参数的传递,有时为了保证引用数据类型的参数不被其他方法修改,可以使用克隆后的值作为参数传递。

17、Java跨平台运行原理

1).java源文件要先编译成与操作系统无关的.class字节码文件,然后字节码文件再通过Java虚拟机解释成机器码运行

2).class字节码文件面向虚拟机,不免向任何具体操作系统

3)不同平台的虚拟机是不同的,但他们给JDK提供了相同的接口

4)Java的跨平台依赖于不同系统的Java虚拟机

18、Java安全性的体现

1、使用引用取代了指针,指针的功能强大,但是也容易造成错误,如数组越界问题。

2、拥有一套异常处理机制,使用关键字 throw、throws、try、catch、finally

3、强制类型转换需要符合一定规则

4、字节码传输使用了加密机制

5、运行环境提供保障机制:字节码校验器->类装载器->运行时内存布局->文件访问限制

6、不用程序员显示控制内存释放,JVM 有垃圾回收机制

19、JVM

1、Java Virtual Machine(Java虚拟机)的缩写

2、实现跨平台的最核心的部分

3、.class 文件会在 JVM 上执行,JVM 会解释给操作系统执行

4、有自己的指令集,解释自己的指令集到 CPU 指令集和系统资源的调用

5、JVM 只关注被编译的 .class 文件,不关心 .java 源文件

20、JDK

1、Java Development Kit(Java 开发工具包)的缩写。用于 java 程序的开发,提供给程序员使用 2、使用 Java 语言编程都需要在计算机上安装一个 JDK 3、JDK 的安装目录 5 个文件夹、一个 src 类库源码压缩包和一些说明文件

  • bin:各种命令工具, java 源码的编译器 javac、监控工具 jconsole、分析工具 jvisualvm 等

  • include:与 JVM 交互C语言用的头文件

  • lib:类库

  • jre:Java 运行环境

  • db:安装 Java DB 的路径

  • src.zip:Java 所有核心类库的源代码

  • jdk1.8 新加了 javafx-src.zip 文件,存放 JavaFX 脚本,JavaFX 是一种声明式、静态类型编程语言

21、JRE

  • Java Runtime Environment(Java运行环境)的缩写

  • 包含 JVM 标准实现及 Java 核心类库,这些是运行 Java 程序的必要组件

  • 是 Java 程序的运行环境,并不是一个开发环境,没有包含任何开发工具(如编译器和调试器)

  • 是运行基于 Java 语言编写的程序所不可缺少的运行环境,通过它,Java 程序才能正常运行

22、JDK、JRE、JVM之间的关系

  • JDK 是 JAVA 程序开发时用的开发工具包,包含 Java 运行环境 JRE

  • JDk、JRE 内部都包含 JAVA虚拟机 JVM

  • JVM 包含 Java 应用程序的类的解释器和类加载器等

posted on 2023-01-07 15:49  ”懒羊羊“学Java  阅读(34)  评论(0编辑  收藏  举报