基础篇
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.洗衣机(洗衣机清洗–>洗衣机烘干)
功能来说:
面向过程更直接,高效;面向对象更容易维护、复用、扩展
可以继续研究的问题:
代码体现:更容易维护、复用、扩展
如果洗衣服的时候,等一下放衣服 放在洗衣机清洗 后面 对于面向对象怎么处理呢?这样子岂不是面向对象没有那么方便了?