变量表示内存中的一个存储区域,该区域用来存放同一类型的常量数据,并可以重复使用这个区域,
这个区域有自己的名称(变量名)和类型(数据类型)。
可以理解,变量就相当于数学中的未知数。(运行中会被改变的值。)
数据类型 变量名 = 初始化值
;( = 是赋值符号)
格式是固定的,记住它,以不变应万变。
int res = (12*24);//开辟一片名叫 res区域,存放int类型的数据。将12*24的值赋值给res区域,作为初始值。
int res1;//开辟一片名叫 res区域,存放int类型的数据。但是如果一个变量 没有赋值,是无法直接使用的。
变量表示内存中的一个存储区域,这时必须给这个区域起个名字 ,才能使用。当在给变量起名时,同样
需要见名知义
。同标识符。例如:String name ;使用name表示这个空间名字,即说明这个空间存放的姓名。
变量在使用时,必须先给变量空间存放数据,即初始化
。同时变量也有自己的生命周期(作用域问题
)。
注意:常量池的值有的直接用,没有就创建,注意常量池基础数据很多,开发时不考虑他的多少,优化内存问题。
在生活中,使用的数据有大有小,有整数,也有小数,同时也会使用字母,或者汉字表示特定含义。在Java中根据数据的不同特点,数据也分为不同的类型。
java语言是强类型
语言,对于每一种数据都定义了明确的具体数据类型,在内存总分配了不同大小的内存空间。
boolean类型通常用于逻辑运算
和程序流程控制
。
boolean 类型数据只允许取值true 或 false
boolean flag;
flag = true;
System.out.println("flag"+ flag);
char用来存储通常意义上的字符,char占两个字节;范围是[0,65535],前256 (2^16)个表示 特殊字符
,通常用单引号包裹’’。
例如:
char c = 'A';
char c2 = '传';
char c3=97;
有些符号在java语言中有独特意义,当需要使用原本意义的时候需要,转义表示。
例如:键盘上的制表符tab键。可以使用 ‘\t’
表示。如双引号,在Java中使用双引号表示字符串,若想使用双引号本身含义,即可使用’\”’
表示。
String不属于基本数据类型;但和字符有一定的联系。
String是一个类
(java语言里的最小单元),表示字符串;就是一串字符,字符串用""包裹起来,连接字符用+。
String str1 = "这是一个字符串"+"这又是一个字符串";
整型数据根据数据范围不同,需要使用不同的关键字
来表示。
double
和 float
关键字在内存中开辟的空间可以存放小数。double开辟8个字节的空间,float开辟4个字节的空间;
Java浮点类型常量有两种表示方式:
double
,则要声明一个常量为float
型,则需在常量后加上f 或 F,double pi = 3.14;//正确
float pi = 3.14F;//必须加上f
1. 寄存器:最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制.
2. 栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(对象可能在常量池里)(字符串常量对象存放在常量池中。)
3. 堆:存放所有new出来的对象。
4. 静态域:存放静态成员(static定义的)
5. 常量池:存放字符串常量和基本类型常量(public static final)
6. 非RAM存储:硬盘等永久存储空间
栈,堆和常量池,对于栈和常量池中的对象可以共享,对于堆中的对象不可以共享。栈中的数据大小和生命周期是可以确定的,当没有引用指向数据时,这个数据就会消失。堆中的对象的由垃圾回收器负责回收,因此大小和生命周期不需要确定,具有很大的灵活性。
对于字符串:其对象的引用都是存储在栈中的,如果是编译期已经创建好(直接用双引号定义的)的就存储在常量池中,如果是运行期(new出来的)才能确定的就存储在堆中。对于equals相等的字符串,在常量池中永远只有一份,在堆中有多份。
垃圾回收站(GC):会检查托管堆中是否有应用程序不再使用的任何对象。如果有,他们的内存就可以回收。
1.垃圾回收器开始执行时,垃圾回收器沿着线程栈上行以检查所有根(然后遍历所有类型对象上的所有根),如果发现一个根引用了一个对象,就在对象的“同步块索引字段”上开启一个位(对象就是这样标记的),如果对象里又引用有其他对象,则会遍历所有对象以标识。检查好所有根之后,堆中将包含一组已标记和未标记的对象。
2.垃圾回收器线性遍历堆,以寻找未标记对象的连续内存。如果发现的内存块比较小,垃圾回收器会忽略它们。但是,如果发现大的、可用的连续内存块,“垃圾回收器会把非垃圾的对象移动到这里以压缩堆”。
最后记得重新分配地址存根
当在存储整数数据时,Java中所有的 整数默认 都是int
类型的。所以在将-128~127之间的数据存储在byte
类型空间中时,JVM会把这个int类型的数据自动转换成byte类型,然后存放在byte空间中。short
同理。
// 类型转化
byte b = 2;// 隐式转化 int类型的2转化为byte类型 放在b中
short s = 34;// 同上
char ch1 = 65;// 隐式转化 int类型的65转化为char类型 放在ch1中
char ch2 = 'A';//直接将A字符存放在ch2空间中
// 当数据超过需要隐式转化的类型时,会发生错误。
// char ch = 65536;
// byte b2 = 128;
// short s2 = 65536;
基本数据类型转化的范围:byte,short,char–int–long–float–double
整型,字符型,浮点型的数据在混合运算中相互转换,转换时遵循以下原则:
容量小的类型可自动转换为容量大的数据类型(类型自动提升):
byte,short,char → int → long → float → double
byte,short,char
之间不会相互转换,他们在计算时首先会转换为int类型。
容量大的数据类型转换为容量小的数据类型时,要加上强制转换符,但可能造成精度的降低或溢出,使用时要格外注意。
强制转换格式:(数据类型)(被转数据);
long l = 123L;
int i = (int) l;
double d = 3.14;
float f = (float) d;
Java中的算术运算符和生活中的算数运算基本相似。
在使用算术运算时需要注意运算两侧类型:当两侧类型不统一时,运算结果和较大类型保持一致。
注意:
当自加符号在变量右侧
时,需要先将变量的值临时保存,然后给变量空间加1,接着用临时变量空间中的值去和其他运算符进行运算。(需要开辟新的空间)
当自加符号在变量左侧
时,需要先给变量空间加1,然后把加1后的值和其他运算符进行运算。(不需要开辟新的空间)
赋值运算符号:
*= , +=, -=, =, /=, %=
赋值号的功能是将赋值号右侧的结果存储到左侧的变量空间中。
赋值号和算术运算符组合起来的混合运算符,它们即具有算术运算的特定,同时还具有赋值运算的特定。
int a = 4;
a += 3; //相当于 a = a + 3;的运算,即把a空间中的值和3进行加法运算,把和值从新存放到a空间中
比较运算符符号:
>大于 >=大于等于 <小于 <=小于等于 ==相等 !=不等
比较运算符。运算完的结果要么true,要么false。后期学习中会根据比较的结果做出相应逻辑判断。
逻辑运算符。用来连接boolean型表达式的。
& : 与
| :或
^ : 异或。
!:非
&& 短路与 || 短路或
需求1:最有效率运算2乘以8.通过位移运算。2<<3
需求2,对两个整数变量的值进行互换(不需要第三方变量)
三元置换方法:
//通过第三方变量的形式进行置换。
int a = 3, b = 7;
int temp = a;
a = b;
b = temp;
//通过和的形式。有个弊端,两个数据较大,可能会超出int范围。
a = a + b;//a = 3 + 7;
b = a - b;//b = 3 + 7 - 7; b = 3;
a = a - b;//a = 3 + 7 - 3; a = 7;
//技巧。异或。
a = a ^ b;// a = 3 ^ 7;
b = a ^ b;// b = 3 ^ 7 ^ 7;
a = a ^ b;// a = 3 ^ 7 ^ 3;