数据类型
基本数据类型(简单数据类型 - 语言内置的类型)
- 布尔型 :boolean
true flase
纯粹的java中 数值不能给boolean赋值
boolean is /has/can
- 字符型:char
16 位
0个符号位 16位 全部都是数值位
char c1 = 'a' // 直接指定字面值
char c2 = 96 //ASCII
char c3 = '\u4e2d' //i18n
char c4 = '\t' //转移赐福
在ANSI编码当中 :
中文占据2个字节
英文占据1个字节
在Unicode编码当中:
空文件会有两个字节
- 整数类: byte short int(默认) long
整数类型: byte short int long 符号位(1)+ 数值位(n-1)
8 16 32 64
-128~127
int的取值范围为(-2147483648~2147483647),占用4个字节(-2的31次方到2的31次方-1)
long类型定义结束后可以+ L
比如打印一年的毫秒
System.out.println(365L*24*60*60*1000) //在任意一个数字后面+ L即可 否则会出现超出int的取值范围
整数类型赋值方式:
int num1 = 25; // 十进制赋值
int num2 = 025; // 8进制赋值
int num3 = 0x25; // 16进制赋值
Int num4 = 0b1011; //2进制赋值 sinceJDK7.0
比如 byte n1 = 76;
76 = 64 + 8 + 4 = 0b000000001001100
所以byte n1 存储为 01001100
12345678
1 符号位 (0正数 1负数)
- 浮点类型:float double(默认)
float 32 (1 + 8 + 23) F/f 符号位 + 幂指位 + 数值位
double 64 (1 + 11 + 52) D/d
符号位 + 幂指位 + 数值位
67.25 :
符号位: 0
整数部分:67 = 1000011
小数部分: 0.25 = 0.01
0.25 * 2 = 0.5 0
0.5 * 2 = 1 1
0.0 * 2 = 0 0
1000011.01 => 科学计数法 1.00001101 * 2(6)
符号位 + 幂指位(8) + 数值位(23个后面补充0)
0 6 00001101
幂指位(8)
默认值 01111111 = 127(8个2进制数的一半) 相当于0
6 : 01111111 + 110 = 10000101
0 10000101 00001101000000000000000
===============================
System.out.println(2.0-1.1);
引用类型(自定义类型 - 自己写的类型 Object)
运算符
+ - * /
+
[+ :1 + 1 在什么情况下不能与2]
当字符串String和数值类型进行+链接的时候 不是代表算数运算 而是追加链接
System.out.println('1' + 1 + "1" ); // char + int + String
String属于引用类型 是一个类
char + int + String
‘1’ + 1 + “1”
char + int + String
‘1’ + 1 + “1”
’1‘ 首先转换成int类型 49 49+1 = 50 再追加一个String = 501
* /
数值进行乘法运算的时候可能出现数据越界,发生溢出
- int类型超过21亿的时候,就需要添加L
- 商品价格7折优惠
int price = 1257;
price = price * 0.7; //*.07 会牵扯到oirce强制类型转换成float
//java当中整数除以整数一定为整数
优化方案:
price = price *7/10;
% 1 0 -1
最终结果的符号位取决于参与运算的第一个数值
第一个数是正的 结果为 +
负 为 -
5 % 2===========1
5 % -2==============1
-5 % 2=============-1
-5 % -2==============-1
定义一个方法 要求传入一个int整数 返回一个Boolean值 判断奇数偶数
public static boolean check(int num){
return ((num & 1) == 0);
}
+= -= *= /= %=
能够自动保持运算符左侧数据类型不发生任何变化
int mum = 1;
num = mun + 0.5 ; num += 0.5;
num 先强制类型转换成float num保持int类型不变
java当中整数 / 整数一定是整数
> < >= <= = == !=
public static void main(String[] args){
boolean isOk = false;
if(!isOK){
System.out.println("not ok");
}
}
& | && ||
[&逻辑非短路运算符]
[&&逻辑短语运算符]
当通过前面的条件能够得出最终结论的时候,短路运算符号会舍弃之后没有必要的无用功
if(a<10 && a > 0 ){
System.out.println(a);
}
&&:短路 如果a !< 10就不会进行第二个判断
运用:
public static void main(String[] args){
int num = 1;
if(++num > 5 && ++num < 10){
System.out.pirntln("随意");}
Syetem.out.println(num)
}
两种运算符就会有不同的效果
++ –
[a :运算 b:取值 x++ => ba ++ x => ab]
& | ^ ~ 二进制按位运算符
18 & 15
00010010
& 00001111
00000010 = 2
当一个正数%2的n次方数的时候 将完全等价于&(这个数字的2(n)-1)
当实现权限控制权限的时候
Unix:
1 :执行权限
2:写入
4:读取
chmod 777
验证777
7
& 4
java当中的修饰符static 相当于汉语中的修饰符
public : 1
static : 8
HashSet HashMap
must be a power of two ===⇒ 必须是个2的n次方
^ 按位异或运算符
相同是 0
不同是 1
如何不借助第三块空间交换两个值
int a = 3;
int b = 5;
a = a ^ b;
b = a ^ b;
a = a ^ b;
~
取反就是1为0,0为1,5的二进制位是0000 0101,取反后为1111 1010,值为-6
>> << >>> 位移运算符
3 << 2
首先把3转换为二进制数字0000 0000 0000 0000 0000 0000 0000 0011,然后把该数字高位(左侧)的两个零
移出,其他的数字都朝左平移2位,最后在低位(右侧)的两个空位补零。则得到的最终结果是
0000 0000 0000 0000 0000 0000 0000 1100,则转换为十进制是12。
相当于乘以2(2)
例如11 >> 2,则是将数字11右移2位
计算过程:
11的二进制形式为:0000 0000 0000 0000 0000 0000 0000 1011,然后把低位的最后两个数字移出,因为该数字是正数,所以在高位补零。则得到的最终结果是
0000 0000 0000 0000 0000 0000 0000 0010。转换为十进制是2。
相当于除以2(2)
*2 *4 *8 *16 *32
<<1 <<2 <<3 <<4 <<5
/2 /4 /8 /16 /32
>>1 >>2 >>3 >>4 >>5
流程控制
分支:
if else
注意利用排他特性简化流程控制
switch case
for
for(char c = 'a' ; c <= 'z' ; c ++){
System.out.println((char)c)
}