java面试题(持续完善)

基础篇

jdk和jre有什么区别?

回答问题:
JDK:java开发工具集 java development kit JRE:java运行环境 java runtime environment 简单来说:如果只要运行Java程序,只需要安装JRE就可以了,如果需要编写java程序,编译程序(javac),那就需要JDK了
JDK=JRE+java开发工具集(比如 javac 编译器等)
JRE=JVM+Java SE标准类库

帮助理解:
程序运行的过程:
在这里插入图片描述
计算机语言分为三种:机器语言、汇编语言和高级语言,各自的概念是什么呢?

从电脑jdk的文件位置分析:
在这里插入图片描述
为什么不安装公共的jre系统呢?
在这里插入图片描述

还可以深入研究的问题(有空再一起探讨)
编译后的字节码文件格式主要分为两部分:常量池和方法字节码。(这两部分怎么理解?)
java类运行的过程大概可分为两个过程:1、类的加载 2、类的执行。
(类加载器怎么理解)
需要深入了解JVM的机制,先保留在这里

Java中有哪些数据类型?

回答问题:
Java数据类型分为基本数据类型和引用数据类型2种:
基本类型:byte(默认值0,占1字节)、short(默认值0,占2字节)、int(默认值0,占4字节)、long(默认值0,占8字节)、float(默认值0.0占4字节)、double(默认值0.0,占8字节)、char(默认值**\u0000**,占2字节)、boolean(默认值false)

引用类型:类(默认值null)、接口(默认值null)、数组(默认值null)

帮助理解:
在这里插入图片描述

== 和 equals 的区别是什么?

回答问题:
== 对于基本类型比较的是值,对于引用类型比较的是引用;而 equals 默认情况下是引用比较,只是很多类重写了 equals 方法,比如 String、Integer 等把它变成了值比较,所以一般情况下 equals 比较的是值是否相等。
帮助理解:
基本类型和引用类型比较,== 的作用效果是不同的。
基本类型:比较的是是否相同
引用类型:比较的是引用是否相同

    int x = 10;
	int y = 10;
	String a = "panda";
	String b = "panda";
	String c = new String("panda");
	// true 基本类型比较值是否相同
	System.out.println(x == y);
	// true 引用类型比较引用是否相同,这里引用相同
	System.out.println(a == b);
	// false 引用不同
	System.out.println(a == c);
    // true 引用不同,String重写了equals,使其用值比较
    System.out.println(a.equals(c));

equals 本质上就是 ==,Object类中定义的 equals 方法如下

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

但是很多类String、Integer等都重写了equals方法,所以一般情况下都是值比较

-----String.java
    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;
    }

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

回答问题:
不正确,两个对象的 hashCode() 相同,equals() 不一定 true。比如在 map 中,hashCode() 相等,只能说明这两个键值对的哈希值相同,不代表这两个键值对相等。

	String str1 = "通话";
	String str2 = "重地";
	// str1: 1179395 | str2: 1179395
	System.out.println(String.format("str1: %d | str2: %d",str1.hashCode(),str2.hashCode()));
	// false
	System.out.println(str1.equals(str2));

帮助理解:
JAVA中String.format的用法
补充:
%[index$][标识][最小宽度][转换方式]

%[index$]------------------对第index个参数进行格式化
标识 ‘,’ 只适用于10进制,每3位数字之间用“,”分隔

public class format方法的补充 {
    public static void main(String[] args) {
    //   34,412
    System.out.println(String.format("%2$,9d", 3123,34412,43242));
    
    //00224,412 第二个参数,每三个数字分隔符',',这里是六位整数,补两个零
    System.out.println(String.format("%2$,09d", 3123, 224412, 432342242));
    //2,742,412 有七个整数的时候,就可以分开了,和上面的类比
    System.out.println(String.format("%2$,09d", 3123, 2742412, 432342242));
    
    //432,342,242
    System.out.println(String.format("%3$,09d", 3123,34442,432342242));
    }
}

Java 中 final 关键字的作用是什么?

回答问题:

  • final修饰的类叫做最终类,它不能有子类,也就是不能被继承
  • final修饰的方法叫做最终方法,不能被重写,但是可以被继承
  • final修饰的成员变量叫做常量,必须初始化,初始化后不能被修改

帮助理解:
术语关键字和修饰符之间有什么关系呢?
关键字包含修饰符,修饰符包含权限修饰符,定义类、变量的修饰符等
请添加图片描述请添加图片描述

方法的声明:
           权限修饰符  返回值类型  方法名(形参列表){
				             方法体
  			  }

String、StringBuffer、StringBuilder 的区别是什么?

回答问题:
String是字符串常量,每次操作都会产生新的对象,适用于少量字符串操作的情况;
StringBuffer,StringBuilder 是字符串变量,StringBuffer是线程安全的,StringBuilder 是非线程安全的,但性能StringBuilder的性能比StringBuffer好,所以在单线程的时候推荐用StringBuilder ,多线程的时候推荐使用StringBuffer。

帮助理解:
线程安全度:
StringBuffer > StringBuilder
性能:
StringBuilder >StringBuffer

可以继续研究的问题:
代码理解线程安全,性能,
为什么单线程、和多线程推荐的类使用不一样,代码解释一下?

String str=“donkey” 与 String str=new String(“donkey”) 一样吗?

回答问题:
不一样,因为内存的分配方式不一样。String str=“donkey”,java 虚拟机会将其分配到常量池中;而 String str=new String(“donkey”) 则会被分到堆内存中。

可以继续研究的问题:
常量池、堆是什么?怎么理解?

字符串如何反转?

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

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

可以继续研究的问题:
append方法有什么用?
JAVA中的append()方法

什么是面向对象?谈谈对面向对象的理解。

回答问题:
处理事情的角度来看:
对比于面向过程更容易阐述,面向过程更注重事情的每个步骤及顺序,面向对象更注重处理事情的参与者(对象),每个对象需要做什么。

举个例子:
比如洗衣服的过程:
面向过程(函数实现):1.打开洗衣机2.放衣服3.开洗衣机程序4.洗衣机清洗5.洗衣机烘干
面向对象:
分为两个对象完成1.人(打开洗衣机–>放衣服–>开洗衣机程序)2.洗衣机(洗衣机清洗–>洗衣机烘干)

功能来说:
面向过程更直接,高效;面向对象更容易维护、复用、扩展

可以继续研究的问题:
代码体现:更容易维护、复用、扩展
如果洗衣服的时候,等一下放衣服 放在洗衣机清洗 后面 对于面向对象怎么处理呢?这样子岂不是面向对象没有那么方便了?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值