JavaSE学习笔记

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。
  • 赋值运算:将 = 右边的内容(值 引用)存入=左边的变量空间内   +=   -=   *=   /=   %=
      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相关
    在这里插入图片描述
原文地址:https://www.cnblogs.com/zut-syp/p/13570688.html