目录
1.数据类型
在用long时,默认为int类型,如果在后面加上L,则为long类型。
在用float时,小数默认为double,如果在后面加上F或者f则为float类型,一般不使用float,计算时会导致数据失真。
alt+enter万能提示键
对比char和String
A---65
a---97
0---48
1. 数据类型与存储方式
char | String |
---|---|
基本数据类型(Primitive Type) | 引用数据类型(Reference Type) |
存储单个 Unicode 字符 | 存储不可变的字符序列(字符串) |
占用 2 个字节(16 位) | 底层使用char[] 数组存储,占用空间动态变化 |
用单引号表示:'A' | 用双引号表示:"Hello" |
2. 核心特性对比
特性 | char | String |
---|---|---|
表示形式 | 单个字符:'A' , '中' , '\n' | 字符串:"ABC" , "中国" , "" |
初始化 | char c = 'A'; | String s = "Hello"; 或 new String("Hello"); |
空值处理 | 不能为null (默认值为\u0000 ) | 可以为null :String s = null; |
常用操作 | 转换为数字、比较字符值 | 拼接、截取、查找、替换、正则匹配等 |
1.1自动类型转换
自动类型转换指的是,数据范围小的变量可以直接赋值给数据范围大的变量。
eg:byte a = 12;
int b = a;//这里就发生了自动类型转换(把byte类型转换int类型)
原理:自动类型转换其本质就是在较小数据类型数据前面,补了若干个字节
byte < short < int < long < float < double
char < int < long < float < double
除了byte和int之间的转换之外,其他类型也可以转换,转换顺序如下图所示:
char虽然是字符型,但是它实际上和int是一样的,因为字符有对应的编号,在底层这些字符都是以对应的编号来进行储存的,如a---97、A---65、0---48
public class TypeConversionDemo1 {
public static void main(String[] args) {
// 目标:理解自动类型转换机制。
byte a = 12;
int b = a; // 发生了自动类型转换了
System.out.println(a);
System.out.println(b);
int c = 100; // 4
double d = c;// 8 发生了自动类型转换了
System.out.println(d);
char ch = 'a'; // 'a' 97 => 00000000 01100001
int i = ch; // 发生了自动类型转换了 => 00000000 00000000 00000000 01100001
System.out.println(i);
int ho = 'a';//97
int ok = 'A';//65
int oo = '0';//48
System.out.println(ho);
System.out.println(ok);
System.out.println(oo);
}
}
1.2 表达式的自动类型转换
如果同一个表达式中,出现不同类型的变量或者数据一起运算,这种情况下运算结果是一个什么数据类型呢?需要遵守下面的两条运算规则:
1.多种数据类型参与运算,其结果以大的数据类型为准
2.byte,short,char 三种类型数据在和其他类型数据运算时,都会转换为int类型再运算(原因是byte的范围非常小,在进行运算时很有可能越界,所以直接把类型都转换为int)
public class TypeConversionDemo2 {
public static void main(String[] args) {
// 目标:掌握表达式的自动类型转换机制。
byte a = 10;
int b = 20;
long c = 30;
long rs = a + b + c;
System.out.println(rs);
double rs2 = a + b + 1.0;
System.out.println(rs2);
byte i = 10;
short j = 30;
int rs3 = i + j;
System.out.println(rs3);
// 面试笔试题: 即使两个byte运算,结果也会提升为int
byte b1 = 110;
byte b2 = 80;
//byte b3 = b1 + b2;//报错
int b3 = b1 + b2;
System.out.println(b3);
}
}
1.3 强制类型转换
大范围的数据直接赋值给小范围的变量是会报错的。因为数据范围大的数据,赋值给数据范围小的变量,它有可能装不下;就像把一个大桶的水倒入一个小桶中,有溢出的风险。
什么是强制类型转换?
目标数据类型 变量名 = (目标数据类型)被转换的数据;
public class TypeConversionDemo3 {
public static void main(String[] args) {
// 目标:掌握强制类型转换。
int a = 20;
byte b = (byte) a; // ALT + ENTER 强制类型转换。
System.out.println(a);
System.out.println(b);
int i = 1500;
byte j = (byte) i;
System.out.println(j);
double d = 99.5;
int m = (int) d; // 强制类型转换
System.out.println(m); // 丢掉小数部分,保留整数部分
}
}
原理:强制类型转换的原理,其实就是强行把前面几个字节砍掉,但是有数据丢失的风险。
2.运算符
2.1算术运算符
如果想得到两个数字相除的准确数字,可以在运算时在变量前*1.0
eg:1.0*5/2得到的结果为2.5
+
符号除了用于加法运算,还可以作为连接符。+
符号与字符串运算的时候是用作连接符的,其结果依然是一个字符串。(能算则算,不能算则在一起)
提示:shift+F6重构键,可以把页面中的相同变量名都选中进行操作。
public class OperatorDemo1 {
public static void main(String[] args) {
// 目标:掌握基本的算术运算符的使用。
int a = 10;
int b = 2;
System.out.println(a + b);
System.out.println(a - b);
System.out.println(a * b); // 20
System.out.println(a / b); // 5
System.out.println(5 / 2); // 2.5 ==> 2
System.out.println(5.0 / 2); // 2.5
int i = 5;
int j = 2;
System.out.println(1.0 * i / j); // 2.5
System.out.println(a % b); // 0
System.out.println(3 % 2); // 1
System.out.println("---------------------------------------");
// 目标2:掌握使用+符号做连接符的情况。
int a2 = 5;
System.out.println("abc" + a2); // "abc5"
System.out.println(a2 + 5); // 10
System.out.println("itheima" + a2 + 'a'); // "itheima5a"
System.out.println(a2 + 'a' + "itheima"); //注意 102itheima
}
}
2.2 自增自减运算符
单独使用时,++或--放在前面和后面都一样,都是对变量进行+1或者-1.
++、-- 如果不是单独使用(如在表达式中或者同时有其他的操作),放在变量前后会存在明显区别
- 放在变量的前面,先对变量进行+1、-1,在拿变量的值进行运算。
int a = 10;
int rs = ++a;
System.out.println(rs);//11
System.out.println(a);//11
- 放在变量的后面,再拿变量的值进行运算,再对变量的值进行+1、-1。
int b = 10;
int rs = b++;
System.out.println(rs);//10
System.out.println(b);//11
2.3 赋值运算符
问题1:下面的代码否有问题?
byte x = 10;
byte y = 30;
x = x + y; //这句代码有问题,因为两个byte类型数据相加,会提升为int类型;
有问题,因为两个byte类型数据相加,会提升为int类型。
问题2:下面的代码是否有问题?
byte x = 10;
byte y = 30;
x+=3; //这句代码没有问题,因为这里有隐含的强制类型转换
//x+=3; 等价于 byte x = (byte)(x+y);
没有问题,赋值运算符有隐含的强制类型转换,等价于byte x = (byte)(x+y);
2.4 逻辑运算符
在这里需要注意&&和&还有||和|的区别:
&&左边为false,右边不执行。而&无论怎么样两边都会执行。
||左边为true,右边不执行。而|无论怎么样两边都执行。
int a = 10;
int b = 20;
System.out.println(a > 100 && ++b >99);//false
System.out.println(b);//b = 20 左边为false,右边并没有执行
int m = 10;
int n = 30;
System.out.println(m > 3 || ++n >40);//true
Sysyem.out.println(n)//n = 30 左边是true,右边就不执行
2.5 三元运算符
三元运算符的格式:
关系表达式? 值1 : 值2;
public class OperatorDemo6 {
public static void main(String[] args) {
// 目标:掌握三元运算符的基本使用。
double score = 58.5;
String rs = score >= 60 ? "成绩及格" : "成绩不及格";
System.out.println(rs);
// 需求2:找出2个整数中的较大值,并输出。
int a = 99;
int b = 69;
int max = a > b ? a : b;
System.out.println(max);
// 需求3:找3个整数中的较大值。
int i = 10;
int j = 45;
int k = 34;
// 找出2个整数中的较大值。
int temp = i > j ? i : j;
// 找出temp与k中的较大值。
int max2 = temp > k ? temp : k;
System.out.println(max2);
}
}
2.6 运算优先级
&&运算比||运算的优先级高,所以&&和||同时存在时,是先算&&再算||;
//这里&&先算 相当于 true || false 结果为true
System.out.println(10 > 3 || 10 > 3 && 10 < 3); // true
在实际开发中,其实我们很少考虑运算优先级, 因为如果你想让某些数据先运算,其实加()
就可以了,这样阅读性更高。
//有括号先算 相当于 true && false 结果为false
System.out.println((10 > 3 || 10 > 3) && 10 < 3); //false
3.案例技术:获取用户键盘输入的数据
键盘录入这个事情,其实并不是我们自己做的,而是Java本身就提供了这样的功能,我们按照它的要求,去调用就行。
public class ScannerDemo1 {
public static void main(String[] args) {
// 1、导包:一般不需要我们自己做,idea工具会自动帮助我们 导包的。
// 2、抄写代码:得到一个键盘扫描器对象(东西)
Scanner sc = new Scanner(System.in);
// 3、开始 调用sc的功能,来接收用户键盘输入的数据。
System.out.println("请您输入您的年龄:");
int age = sc.nextInt(); // 执行到这儿,会开始等待用户输入一个整数,直到用户按了回车键,才会拿到数据。
System.out.println("您的年龄是:" + age);
System.out.println("请您输入您的名字:");
String name = sc.next(); // 执行到这儿,会开始等待用户输入一个字符串,直到用户按了回车键,才会拿到数据。
System.out.println(name + "欢迎您进入系统~~");
}
}