字符串数据类型
基本语法:
代码示例:
public static void main(String[] args) {
String str = "hello";
System.out.println(str);
}
运行结果:hello
注意:
-
转义字符:
转义字符 解释 \n 换行 \t 水平制表符 \' 单引号 \" 双引号 \\ 反斜杠(一个) 双引号打印示例:
public static void main(String[] args) { String str = "\"hello\""; System.out.println(str); }
运行结果:"hello"
字符串拼接:+
只要有一个字符串,那么整个就是一个字符串。
整型提升
-
如果小于4字节的数据类型进行运算时,先会提升为整型,在进行运算;
由于计算机的CPU通常是按照四个字节为单位从内存中读写数据,为了硬件上实行方便,这些会先提升为int,在计算;
-
当int和long混合运算的时候,int会提升为long,得到的结果任然是long类型;
代码示例:
public static void main(String[] args) {
int i = 2147483647 + 1;
int i2 = Integer.MAX_VALUE + 1;
System.out.println(i);
System.out.println(i2);
}
运行结果:
-2147483648
-2147483648
而byte就不一样,都会报错,
byte c = 10;
byte b = 20;
byte d = a + b;
System.out.println(d);
原因:对于byte来说,先会将=两侧的当做整型,若要运算:byte d = (byte)(b + c)-----------------------强制转换;或者int d = b + c;
变量
变量的作用域
也就是该变量能生效的范围,一般是变量定义所在的代码块(大括号)。
在方法里跟了一个小括号-------定义在方法内的一个代码块
public static void main(String[] args) {
{
int i = 2147483647 + 1;
System.out.println(i);
}
变量的命名规则
硬性指标:
-
字母 下划线 数字 $ ;
-
但是不能以数字开头;$、__可以开头,但规范上不建议
-
变量名大小写是不同的。
软性指标:
-
变量名要有描述性,见名知意;
-
不宜使用拼音,但不绝对;
-
推荐使用名词;
-
小驼峰命名法,出第一个单词外,其他单词首字母大写。
常量
是指运行时类型不能发生改变
字面常量
举例:10 “abc”(字符串常量) 1.0 ‘a'
final修饰的常量
代码示例:
public static void main(String[] args) {
final int MAXNUM = 10;
System.out.println(MAXNUM);
}
运行结果:10
注意:
-
加了final之后就是一个常量,一般规定常量的变量名一般都大写;
-
若试图 MAXNUM = 999;错误 (原因: 常量只能被初始化一次,且使用的时候一定要记得初始化);
但是如果:
final int MAXNUM; MAXNUM = 999;
就是对的。
类型转换
显式类型转换
把一个大类型给小类型 需要进行强制类型转换
代码示例:
public static void main(String[] args) {
long a = 10L;
int b = a;
System.out.println(b);
}
运行结果:报错
这时就要强制转换(可能精度就会丢失):int b = (int)a;
隐式类型转换
把一个小类型数据给大类型
代码示例:
public static void main(String[] args) {
int a = 10;
long b = a;
System.out.println(b);
}
运行结果:10
注意:
-
int 和boolean类型不能相互转换;Boolean就是布尔类型 只有true和false,而int是数值类型;
-
int给byte赋值,不能超过byte范围(-128~127);
int和string相互转换:
方法一:
public static void main(String[] args) {
int num = 10;
String str1 = num + "";
String str2 = String.valueOf(num);//调用字符串valueOf的方法
}
运行结果:10
方法二:
String str = "100";
int num = Integer.parseInt(str);//调用Integer包装类parseInt方法
代码示例:
public static void main(String[] args) {
String str = "100";
int num = Integer.parseInt(str);
System.out.println(num);
}
运行结果:100
但是(用不好):
public static void main(String[] args) {
String str = "100a";
int num = Integer.parseInt(str);
System.out.println(num);
}
运行结果:(java中的异常)(原因: a不能转换成整型)
D:\javacode\20210919>java TestDemo
Exception in thread "main" java.lang.NumberFormatException: For input string: "100a"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Integer.parseInt(Integer.java:580)
at java.lang.Integer.parseInt(Integer.java:615)
at TestDemo.main(TestDemo.java:13)
运算符
算术运算符
基本四则运算符:+ - * / %
注意:
除法
-
代码示例:
public class TestDemo {
public static void main(String[] args) {
System.out.println(5/2);
System.out.println(5.0/2);
System.out.println((float)5/2);
System.out.println((float)(5/2));
}
}
运行结果:
2
2.5
2.5
2.0
-
代码示例:(不能除0)
public class TestDemo {
public static void main(String[] args) {
System.out.println(5/0);
}
}
运行结果:(java异常------java.lang.ArithmeticException叫做算术异常)
Exception in thread "main" java.lang.ArithmeticException: / by zero
at TestDemo.main(TestDemo.java:9)
取余
%表示不仅可以对int求模,也能对double求模 注意:
-
10/-3 -10/3等情况 代码示例:
public static void main(String[] args) {
System.out.println(10%3);
System.out.println(-10%3);
System.out.println(10%-3);
System.out.println(-10%-3);
}
运行结果:
1
-1
1
-1
第三个错误原因:10除以-3商-3 余数是1 ; 第四个错误原因: -10除以-3商3(和是一个正数)余数是-1。
-
小数可以求余数
增量赋值运算符(符合运算符)
有 += -= *= /= %=
例如:a+ = 10 ------------a = a+10;
自增自减运算符
有 ++ --
代码示例:
int a = 10;
int b = ++a;//a先加在赋值给b a=11
System.out.println(b);
int c = a++;//先c = a a=11 ; 在a++ a=12
System.out.println(c);//c=11
运行结果:
11 11
注意:(重点)
public static void main(String[] args) {
int i = 10;
i = i++;
System.out.println(i);
}
运行结果: 10
原因:与C语言又不一样,java的反汇编指令(感兴趣了解)
关系运算符
主要有六个: ==(判断相等) !=(不等于) > < <= >=
关系运算符的表达式返回值都是boolean类型
代码示例:
int a = 10;
int b = 20;
System.out.println(a == b);
System.out.println(a != b);
System.out.println(a < b);
System.out.println(a > b);
System.out.println(a <= b);
System.out.println(a >= b);
运行结果:
false true true false true false
逻辑运算符(重点)
主要有三个 : &&(且) || (或) !(非)
表达式返回值都是boolean类型
-
逻辑与:表达式1 && 表达式2 (都为真表达式才成立)
一旦表达式1为假,那么表达式2就不会执行了(短路求值)
例如:
System.out.println(10 > 20 && 10/0 == 0);
运行结果:
false (10/0会报错,为什么没有报错?-------10>20为假,后面的表达式2没有被执行)
-
逻辑或:表达式1 || 表达式2 (其中一个真 就为真)
一旦表达式1为真,那么就没有必要执行表达式2了 (短路或)
-
逻辑非:!表达式1
int a = 10; int b = 20; System.out.println(!a < b);
运行结果:
错误: 一元运算符 '!' 的操作数类型int错误 System.out.println(!a < b);//改正:System.out.println(!(a < b));
原因:在Java中 非只能运行于布尔类型数据上,举例:
boolean flg = true; System.out.println(!flg);
运行结果:false
说明:
-
&---------按位与(不为布尔类型时)
-
| --------按位或(不为布尔类型时)
-
^ --------按位异或(不为布尔类型时) 异:不一样的
-
~ ---------按位取反(不为布尔类型时)
如果操作数为布尔类型时,也表示逻辑运算。但是他们和&& || 相比,不支持短路求值;
例如:
System.out.println(10 > 20 & 10/0 == 0);
运行结果:程序异常
-
如何就一个数字的二进制?
十进制:123-----------1乘10^2 +2乘10^1 +3乘10^0
而二进制由0 1组成,
2^7 2^6 2^5 2^4 2^3 2^2 2^1 2^0 128 64 32 16 8 4 2 1 求10的二进制(8+2)----------(看成八位)0000 1010
11-------0000 1011
130-----1000 0010
(二进制转八进制 ----三个三个一起)(…010 000 010 -----0202(010----2(0开头代表八进制)
(二进制转十六进制 --四个四个一起( …1000 0010 --- 0x82(全0x00000082)(1000---8 0010---2)
二转十六:1111----f, 10----a, 11-----b, 12----c ……
-
按位与:0000 1011
&0000 1101
结果:0000 1001(不一样就是0)
-
按位或:0000 1011
| 0000 1101
结果:0000 1111(有1就是1)
-
按位异或:0000 1011
^ 0000 1101
结果:0000 0110(一样的就是0,不一样再进行或)
-
按位取反:~11 (11--------0000 1011)
结果:1111 0100(取反的就好了)
-
-
移位运算符(了解)
有三个:<< >> >>>
都是按照二进制位来运算的
举例:11的二进制0000 1011
-
11>>1 11右移1位(右移以后,最高位(前面的)为几就补几 0000 0101 -----5
右移相当于是除法 11/(2^1)=5 移2位就是 11/(2^2)=2
-1>>1 1111 1111 右移一个 1111 1111(它本身)
位运算的速度是大于 乘法 除法的,
-
11<<1 11左移1位(左移只补0 0001 0110 ------22)
11<<2 0010 1100 -----44
左移相当于乘法
-
无符号右移 >>> -1 ----1111 1111 >>>1 0111 1111(只补0)
-
没有无符号左移,没有意义
条件运算符
表达式1 ?表达式2 : 表达式3(三目运算符 是条件判断语句的简化写法)
当表达式1的值为true时,整个表达式的值为 表达式2, 表达式1为false,整个表达式的值为表达式3
运算符的优先级
乘除一定比加减高, 剩下的加括号