Java工程师学习路线(基础知识)(待完善)
Java基础
一、Java基本
1. Java基础概念和常识
java语言特点
- 简单易学
- 面向对象(封装,继承,多态)
- 平台无关性( Java 虚拟机实现平台无关性)
- 可靠性
- 安全性
- 支持多线程
- 支持网络编程
- 编译与解释并存
JVM JDK和JRE
(1)JVM
Java 虚拟机(JVM)是运行 Java 字节码的虚拟机。
在 Java 中,JVM 可以理解的代码就叫做字节码(即扩展名为 .class 的文件),它不面向任何特定的处理器,只面向虚拟机。
Java 程序从源代码到运行一般有下面 3 步:
.class->机器码: JVM 类加载器首先加载字节码文件,然后通过解释器逐行解释执行,这种方式的执行速度会相对比较慢。
字节码和不同系统的 JVM 实现是 Java 语言“一次编译,随处可以运行”的关键所在。
(2)JDK和JRE
JDK 是 Java Development Kit,它是功能齐全的 Java SDK。它拥有 JRE 所拥有的一切,还有编译器(javac)和工具(如 javadoc 和 jdb)。它能够创建和编译程序。
JRE 是 Java 运行时环境。它是运行已编译 Java 程序所需的所有内容的集合,包括 Java 虚拟机(JVM),Java 类库,java 命令和其他的一些基础构件。但是,它不能用于创建新程序。
Java和C++的区别
- 都是面向对象的语言,都支持封装、继承和多态
- Java 不提供指针来直接访问内存,程序内存更加安全
- Java 的类是单继承的,C++ 支持多重继承;虽然 Java 的类不可以多继承,但是接口可以多继承。
- Java 有自动内存管理机制,不需要程序员手动释放无用内存
- 在 C 语言中,字符串或字符数组最后都会有一个额外的字符‘\0’来表示结束。但是,Java 语言中没有结束符这一概念。
什么是 Java 程序的主类 应用程序和小程序的主类有何不同?
小程序 | 应用程序 |
---|---|
主类是一个继承自系统类 JApplet 或 Applet 的子类 | 主类是指包含 main()方法的类 |
必须要求是public | 不一定要求是public |
没有 main() 方法,主要是嵌在浏览器页面上运行(调用init()或者run()来启动) | 从主线程启动(也就是 main() 方法) |
为什么说java语言的“编译与解释并存”?
高级编程语言按照程序执行方式分为:
编译型语言 | 解释型语言 |
---|---|
编译器针对特定的操作系统将源代码一次性翻译成可被该平台执行的机器码 | 解释器对源程序逐行解释成特定平台的机器码并立即执行 |
java程序是先编译后解释的,先编译生成字节码文件(*.class文件),字节码文件必须由java解释器解释执行
2. Java语法
字符型常量和字符串常量
字符型常量 | 字符串常量 |
---|---|
形式上:单引号 | 形式上:双引号 |
含义上:整型值( ASCII 值) | 含义上:地址值(该字符串在内存中存放位置) |
内存大小上:2 个字节 | 内存大小上:若干个字节 |
泛型 类型擦除 通配符
-
泛型:
泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。泛型一般有三种使用方式:泛型类、泛型接口、泛型方法。
-
类型擦除:
类型擦除通常指的是java的泛型,也被称为伪泛型,因为在java编译期间,所有泛型信息都会被擦除 -
通配符: T,E,K,V,?
? 表示不确定的 java 类型
T (type) 表示具体的一个java类型
K V (key value) 分别代表java键值中的Key Value
E (element) 代表Element
== 和equals的区别
== | equals |
---|---|
比较是值是否相同 判断两个对象的地址是否相等,是否为同一对象 | 判断两个对象是否相等,它不能用于比较基本数据类型的变量 |
基本数据类型 | 引用数据类型 |
注:如果没有对equals方法进行重写,则比较的是引用类型的变量所指向的对象的地址;但是String、Date等类对equals方法进行了重写的话,比较的是所指向的对象的内容
hashCode()与 equals()
-
什么是hashCode()
hashCode() 的作用是获取哈希码,也称为散列码,实际返回一个int整数,作用是确定该对象在哈希表中的索引位置。
-
为什么要有 hashCode?
以HashSet为例,当你把对象加入 HashSet 时,HashSet 会先计算对象的 hashcode 值来判断对象加入的位置,同时也会与其他已经加入的对象的 hashcode 值作比较,如果没有相符的 hashcode,HashSet 会假设对象没有重复出现。但是如果发现有相同 hashcode 值的对象,这时会调用 equals()方法来检查 hashcode 相等的对象是否真的相同。如果两者相同,HashSet 就不会让其加入操作成功。如果不同的话,就会重新散列到其他位置。
这样我们就大大减少了 equals 的次数,相应就大大提高了执行速度。
-
为什么重写 equals 时必须重写 hashCode 方法?
如果两个对象相等,则 hashcode 一定也是相同的。两个对象相等,对两个对象分别调用 equals 方法都返回 true。但是,两个对象有相同的 hashcode 值,它们也不一定是相等的 。因此,equals 方法被覆盖过,则 hashCode 方法也必须被覆盖。
-
为什么两个对象有相同的 hashcode 值,它们也不一定是相等的?
同样的 hashcode 有多个对象,它会使用 equals() 来判断是否真的相同
Java hashCode() 和 equals()的若干问题解答
3. 基础数据类型
基本类型 | 包装类 | 字节 | 位数 | 字节 | 包装类的缓存数据 |
---|---|---|---|---|---|
byte | Byte | 1 | 8 | 0 | 缓存数值[-128,127] |
boolean | Boolean | 1或者4 | 1 | false | 直接返回True Or False |
char | Character | 2 | 16 | ‘u0000’ | [0,127]范围的缓存数据 |
short | Short | 2 | 16 | 0 | 缓存数值[-128,127] |
int | Integer | 4 | 32 | 0 | 缓存数值[-128,127] |
float | Float | 4 | 32 | 0f | |
double | Double | 8 | 64 | 0d | |
long | Long | 8 | 64 | 0L | 缓存数值[-128,127] |
基本类型都有对应的包装类型,基本类型与其对应的包装类型之间的赋值使用自动装箱与拆箱完成。
装箱:将基本类型用它们对应的引用类型包装起来;
拆箱:将包装类型转换为基本数据类型;
例子:
Integer i1 = 40;
Integer i2 = 40;
Integer i3 = 0;
Integer i4 = new Integer(40);
Integer i5 = new Integer(40);
Integer i6 = new Integer(0);
System.out.println("i1=i2 " + (i1 == i2));
System.out.println("i1=i2+i3 " + (i1 == i2 + i3));
System.out.println("i1=i4 " + (i1 == i4));
System.out.println("i4=i5 " + (i4 == i5));
System.out.println("i4=i5+i6 " + (i4 == i5 + i6));
System.out.println("40=i5+i6 " + (40 == i5 + i6));
//因为+这个操作符不适用于 Integer 对象,首先 i5 和 i6 进行自动拆箱操作,进行数值相加,即 i4 == 40。
//然后 Integer 对象无法与数值进行直接比较
//所以 i4 自动拆箱转为 int 值 40,最终这条语句转为 40 == 40 进行数值比较。
输出结果:
i1=i2 true
i1=i2+i3 true
i1=i4 false
i4=i5 false
i4=i5+i6 true
40=i5+i6 true
包装类 基本数据类型
包装类和基本数据类型的区别是:
-
包装类是对象,拥有方法和字段,对象的调用都是通过引用对象的地址,基本类型不是
-
包装类型是引用的传递,基本类型是值的传递
-
声明方式不同:基本数据类型不需要new关键字,而包装类型需要new在堆内存中进行new来分配内存空间
-
存储位置不同:基本数据类型直接将值保存在值栈中,而包装类型是把对象放在堆中,然后通过对象的引用来调用他们
-
初始值不同 :int的初始值为0、boolean的初始值为false 而包装类型的初始值为null
-
使用方式不同:基本数据类型直接赋值使用就好 ,而包装类型是在集合如 coolection Map时会使用
4. 方法(函数)
值传递
java中只有值传递,方法得到的是所有参数值的一个拷贝,也就是说,方法不能修改传递给它的任何参数变量的内容。
值调用:表示方法接收的是调用者提供的值
引用调用:表示方法接收的是调用者提供的变量地址
一个方法可以修改传递引用调用所对应的变量值,而不能修改传递值调用所对应的变量值
Java 中方法参数的使用情况:
一个方法不能修改一个基本数据类型的参数(即数值型或布尔型)。
一个方法可以改变一个对象参数的状态。
一个方法不能让对象参数引用一个新的对象。
重载和重写的区别
重载就是同一个类中多个同名方法根据不同的传参来执行不同的逻辑处理。如果多个方法有相同的名字、不同的参数则产生了重载。
重写就是当子类继承自父类的相同方法,输入数据一样,但要做出有别于父类的响应时,你就要覆盖父类方法
重写就是子类对父类方法的重新改造,外部样子不能改变,内部逻辑可以改变
重写:
返回值类型、方法名、参数列表必须相同,抛出的异常范围小于等于父类,访问修饰符范围大于等于父类。
如果父类方法访问修饰符为 private/final/static 则子类就不能重写该方法,但是被 static 修饰的方法能够被再次声明。
构造方法无法被重写
深拷贝与浅拷贝
二、Java面向对象
1. 类和对象
2. 面向对象三大特征
3. 修饰符
4. 接口和抽象类
5. 其他重要知识点
三、Java核心技术
集合
异常
反射
多线程
文件与I/O流
四、其他重要知识点
常用API
网络编程
JDK8新特性
Java Web
1. Jsp
2. Servlet
说明:根据网络资料进行搜索学习理解整理 若有涉及侵权联系作者
参考链接:JavaGuide