Java语言特性
- 简单性:Java 中真正操作内存的是 Java 虚拟机,Java 虚拟机通过运行 Java 程序来操作内存,而 C++ 都是通过指针来操作内存,Java 程序中不能直接操作指针,所以在 Java 中不容易导致内存泄漏,所以变得简单。
- Java 是完全面向的对象的语言:万物皆对象
- 健壮性:Java 编译器能够检测许多在其他语言中仅仅在运行时检测出来的问题。Java 有自动垃圾回收回收机制( GC 机制),不容易导致内存泄漏。
- 支持多线程
- 可移植性:编写的 Java 程序,可以在不同的平台运行。
Java虚拟机 - JVM
- 虚拟机是一种抽象化的计算机,通过在实际的计算机上仿真模拟各种计算机功能来实现的。我们所编写的 Java 程序,都是在 JVM 上运行的。
- 我们用 Java 编写的程序可以在任何的操作系统上面运行,这就是 Java 的跨平台,Java 编写的程序是在 JVM 上运行的,而 JVM 是运行在操作系统之上。
JDK、JRE
- JRE:Java 程序的运行环境,其包含了 JVM (如果执行要跑一个 Java 程序,不需要开发的话,就是安装一个可以运行程序的环境即可)
- JDK:Java 程序的开发工具包,包含 JVM 和 JRE (如果程序开发者需要开发 Java 程序,那么必然也会运行 Java 程序来进行测试。)
数据类型
基本数据类型 8个
- 整型:byte(1字节) short(2字节) int(4字节) long(8字节,后缀L)
- 浮点型:float(后缀F) double
- 字符型:char(2字节),中文使用Unicode编码(0-65535)
- 布尔型:boolean(1字节)
- char 和 short 都是两个字节,但是 char 表示的文字,文字没有正负的区别,所以 char 表示的数字更大。
计算机的存储单位
- 1字节 = 8bit(8比特)-> 1byte = 8bit
- 1KB = 1024byte
- 1MB = 1024KB
- 1GB = 1024MB
- 1TB = 1024GB
引用数据类型
- 数组[]
- 类 class(抽象类)
- 接口 intergace
- 枚举 enum
- 注解 @interface
除了基本类型以外,剩下的都是引用数据类型。
常量与变量
- 常量:程序运行过程中,不能再次改变的值。固定的值,代表计算过程中经常用到的值,便于程序计算。(常量尽量使用大写)
常量分类
- 字符串常量:“111”
- 整型常量:111
- 浮点数常量:1.11
- 字符常量:‘我’
- 布尔常量:true、false
- 空常量:null
- 变量:程序执行的过程中,不能修改,变量指的是内存空间,变量空间在创建的时候,必须指定数据类型,变量空间的名字,必须用赋值语句对变量进行显示初始化。变量是内存中最基本的存储单元。
变量赋值内存分析
注意事项
- 创建多个变量时,变量之间的名称不可重复
- float 和 long 类型需要添加后缀 F 和 L
- 没有赋值的变量不能直接使用
类型转换
- 除了 boolean 类型不能转换以外其他的其中都可以进行类型转换
- 自动类型转换:数据范围从小到大
- 强制类型转换:数据范围从大到小,编写的时候需要添加 “强制类型”,在类型转换的过程中,可能发生精度损失或者数据溢出
- byte,short,char 类型的数据在进行混合运算的时候,都会将数据转换为 int 类型,然后在进行运算。(编译器的优化)
运算符
按照操作数来分类
- 单目、双目、三目
- 三目运算符:布尔表达式 :?表达式1 :表达式2
按照运算符的功能来进行分类
- 算术运算:+ - × ÷ ++ –
+ 对于整型来说,直接进行运算,对于 char 来说,在计算之间计算机将 char 转换成 int,然后进行运算,对于字符串来说表示字符串的连接。
int y=x++,只有变量可以进行自增自减的运算,常量不能进行自增自减的运算,++ 在后,先赋值后计算。内存分析:在进行计算的时候,内存中有一个变量为 x 的空间和一个 y 的空间,进行计算的时候,先开辟一个临时的内存空间,++ 在后的时候我们先把 x 的值备份到这个临时空间内,然后对 x 进行自增的操作,最后将临时空间内的值赋值给 y。如果 ++ 在前的时候,就对 x 先进行自增的操作,然后将 x 备份到临时的内存空间中,最后将临时空间中的内容赋值给 y。
- 表达式求值题目
public class Solution {
public static void main(String[] args) {
int i = 1;
i = i ++;
int j = i ++;
int k = i + ++i * i++;
System.out.println("i = " + i); // 4
System.out.println("j = " + j); // 1
System.out.println("k = " + k); // 11
}
}
- 赋值运算:将 = 右边的内容(值 引用)存入=左边的变量空间内 += -= *= /= %=
byte、char、short 在参与运算的时候都会自动转换成 int 类型,但是在使用 byte += 的时候不会变成 int 类型,因为 += 是一个符号会进行自动类型转换。 - 关系运算:> >= < <= != == 对象 instanceof 类
- 逻辑运算:& | ^ ! && ||
- 位bit运算:& | ^ ~ << >> >>>(按位右位移,无符号)
正数的原码,反码,补码相同,负数:反码符号不动,其余取反,补码 = 反码 + 1,计算机中不管是整数还是负数,存储形式都是以补码的形式来存储。反码是数据存储的一种方式,而取反是一个计算过程(每一个位置都取反)
&和&&的区别
& 可以是逻辑运算也可以是位运算,&& 只能是逻辑运算
如果两个符号是逻辑运算符的时候
& 前后两个条件都是 true,最终结果就是 true,正常情况下 & 执行结构是一致。
当面前条件为 false 的时候后面的判断语句就不会在执行了,最后结果为 false。
== 和 equals区别: 基本类型 == 比较的是值,引用类型比较的是地址,所以引用类型使用的是 equals 来对值进行比较,在引用类型中 equals 默认比较的也是地址,但是由于类中可以重写 equals 方法,所以在引用类型进行值得比较的时候,需要重写 equals 方法。
流程控制语句
Java数组
- 定义:数组是用来存储一组相同数据类型的数据的容器,将一组数据统一的管理起来。
- 特点:数组本身是一个引用数据类型;数组可以存储基本类型或者引用类型的元素;数组是存储在堆内存中的一串连续的地址;如果需要用变量来进行存储,变量空间在栈内存中,变量中存储的数组引用(地址);数组在初始化是必须指定长度以及内容存储元素类型;数组的长度一旦确定是不能再次发生改变。
数组初始化
//动态初始化
int[] a = new int[100];
int[] a;
a = new int[100];
//静态初始化
String[] strings = new String[] { "sss", "aaa", "ppp"};
String[] strings;
strings = new String[] { "sss", "aaa", "ppp"};
//省略格式的初始化(不能进行拆分)
int[] a = {1, 2, 3};
数组内存图: new 出来的对象都保存在堆区
Java内存划分
- 栈(Stack):存放方法中的局部变量,方法的运行在栈中。
局部变量:方法的参数,方法内部的变量
作用域:一旦变量超出作用域就会在栈内存中消失 - 堆(Heap):只要是 new 出来的东西,都是在堆内存中的,存储对象的实例,所有的对象的实例都在以及数组都要在堆上分配。
堆内存中的数据都有默认值
堆内存中的东西都需要有一个 16 进制的内存地址值 - 方法区(Method Area):存储 .class 文件的相关信息,方法等。存储被虚拟机加载的类信息、常量、静态边浪、即时编译后的代码等。
- 本地方法栈(Native Method Stack):和操作系统相关
- 寄存器:与CPU相关