Java变量
Posted Al_tair
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java变量相关的知识,希望对你有一定的参考价值。
Java变量
大家好呀!我是小笙!前几天被培训班的老师考察基础,发现漏洞还是有很多的,我想进一步学习java基础,所以我跟着韩老师学Java,以下是我的笔记
变量 = 变量名 + 值 + 数据类型
数据类型(重点)
java是一种强制类型语言,每一种数据都定义了明确的数据类型,在内存中分配了不同大小的内存空间(字节)
细节:字符串本质是类,属于引用数据类型
整数的类型
类型 | 占用存储空间 | 范围 |
---|---|---|
byte 字节 | 1字节 | -128 ~ 127 |
short 短整型 | 2字节 | -2^15 ~ 2^15-1 |
int 整型 | 4字节 | -2^31 ~ 2^31-1 |
long 长整型 | 8字节 | -2^63 ~ 2^63-1 |
1字节(byte) = 8 位(bit)
bit 计算机中的最小的存储单位 byte 计算机中基本存储单位
浮点类型
浮点数字 = 符号位 + 指数位 + 尾数位 (尾数位可能丢失,造成精度的损失)
E38 指的是 10^38
类型 | 占用存储空间 | 范围 |
---|---|---|
float (单精度) | 4字节 | -3.403E38 ~ 3.403E38-1 |
double (双精度) | 8字节 | -1.798E308 ~ 1.798E308-1 |
浮点数使用细节
-
float 后面需要添加f 或 F
float num1 = 1.0; // 错误、 double num2 = 1.1; // 正确 float num3 = 1.2F; // 正确 double num4 = 1.3f; // 正确
-
浮点型常量的表示形式
double num = 1.0; // 十进制数形式 1.0f .512 == 0.512(小数点必须在可以省略0) double num5 = 5.12e2; // 科学计数法 5.12e2 == 512 5.12E-2 == 0.0512
-
通常情况下我们使用double 精度高
double num = 1.23456789123f; float num1 = 1.23456789123f; System.out.println(num); // 1.23456789123 System.out.println(num1); // 1.2345679
-
比较 小数数字是否相等时要注意:最好不要直接去比较两个浮点数是否 == 最好是两个浮点数的差值绝对值在某个精度范围内来进行比较(如0.000001)
double num = 8.1 / 3; double num1 = 2.7; System.out.println(num); // 2.6999999999999997 System.out.println(num1); //2.7 if(Math.abs(num - num1) < 0.000001) System.out.println("相等");
字符类型
类型 | 占用存储空间 | 表示 |
---|---|---|
char | 2字节 | 表示单个字符 |
使用细节
-
字符常量是用单引号(’‘)括起来的单个字符
char c = 'n';
-
单引号里面可以放入转义字符(虽然有两个字符,但是它是表示一个字符的 比如 // 表示 / )
char ch = '//'
-
char 的本质就是一个整数(unicode表) (**注意:字符 --> 数字 unicode 数字 --> 字符 **)
// unicode 编码 'a' -- 97 // char 类型字符可以进行加减 但是注意超出范围的问题 'a' + 10 -- 107
字符在计算机里的存储方式
存储:‘a’ ==> 97 ==> 二进制数(11000001) ==> 存储
读取: 二进制(11000001) ==> 97 ==> ‘a’ ==> 读取
字符编码表
补充:ASCII实际上可以表示256个字符,但是只使用了128个
布尔类型
常用于条件判断语句 if - else while
类型 | 占用存储空间 | 表示 |
---|---|---|
boolean | 1字节 | true / false |
数据类型转换
自动类型转换
精度小的数据类型自动转换为精度大的数据类型
自动类型转换相关的注意细节
-
当一个二元运算符连接两个值时,先将两个操作数转换成同一类型的数据进行计算(转换成操作数两边范围最大的数据类型)
// 伪代码 if(两个操作数中有一个是double类型数据) 另一个操作数也会强制转换成double类型数据 else if(两个操作数中有一个是float类型数据) 另一个操作数也会强制转换成float类型数据 ... // 依次下去
-
(byte,short)和 char 之间不会自动转换
// 注意区分具体值赋值和变量赋值 // 具体值赋值会先进行范围的判进行赋值 char c = 10000; short s = 'a'; byte b = 'b'; // 变量赋值就是依据自动类型转换或者强制类型转换 c = (char)s; s = (short)c;
-
注意赋值区别(具体数值赋值和变量赋值)
// 整数之间的赋值 byte n = 10; // 具体数值赋值,先进行判断该数值是否在byte范围,如果在编译就不会出错,便会赋值 int n1 = 10; n = n1; // int类型变量无法直接赋值给byte类型(可以进行强制类型转换) // 小数之间赋值 float f = 10.0; // 错误,float中将无法进行比较,本来都是一个估算值,无法进行比较范围,因此10.0是double类型无法自动转型为float
-
byte,char,short 三者进行计算,在计算时首先转换成int类型数据(变量计算都会转换成int类型,不管是否是同类型数据相加减)
-
boolean 数据类型不参与类型转换
强制类型转换
概念:自动类型转换的逆过程,将范围大的数据类型转换成范围小的数据类型,使用时需要在变量或者具体值前面加()
好处:根据程序员的意愿进行修改
坏处:范围超出了想要转换的数据类型,会导致溢出问题
// 例如 double ==> float
float f = (float)10.0;
强制类型转换的注意细节
-
强制符号只针对最近的操作数有效,往往会使用小括号来提升优先级
int n = (int)10*3.5+12*2.3; // 错误 int n = (int)(10*3.5+12*2.3); // 正确
基本数据类型和String类型的转换
-
将基本数据类型+"" ==> String类型
String s = 10 + "";
-
通过基本数据类型的包装类调用parseXX方法
String s = "2" Integer.parseInt(s); Double.parseDouble(s); Float.parseFloat(s); Short.parseShort(s); Long.parseLong(s); Boolean.parseBoolean("true"); Byte.parseByte(s); // char 根据索引来判断 String str = "123456789"; char c = str.charAt(0);
相关面试题
字符型常量和字符串常量的区别? (来自javaGuide)
-
形式上: 字符常量是单引号引起的一个字符; 字符串常量是双引号引起的若干个字符
-
含义上: 字符常量相当于一个整型值( ASCII 值),可以参加表达式运算; 字符串常量代表一个地址值(该字符串在内存中存放位置)
-
占内存大小 字符常量只占2个字节; 字符串常量占若干个字节(至少一个字符结束标志) (注意: char在Java中占两个字节)
String 是最基本的数据类型吗?
答:不是,String是一个类属于引用数据类型
float 型float f=3.4是否正确?
答:否,3.4 默认为double类型,如果要赋值给float 需要强制类型转换 或者后面添加f/F
short s1 = 1; s1 = s1 + 1;有什么错?
s1+1运算结果是int 型,需要强制转换类型 或者改变书写方式
三种形式都可以如下
short s1 = 1;
s1 += 1;
s1++;
s1 = (short)(s1+1);
以上是关于Java变量的主要内容,如果未能解决你的问题,请参考以下文章