【JavaSE笔记】第二章 进制数据类型和运算符

第二章 进制数据类型和运算符

第一节 进制及其转换

1.1 进制类型

十进制:人类使用

二进制:计算机使用

八进制和十六进制:为了更好的表示二进制(缩短二进制长度)

1.2 计算机为什么使用二进制而不使用十进制

物理上容易实现,可靠性强;

运算简单

便于进行逻辑运算。

在这里插入图片描述

1.3 二进制和十进制相互转换

在这里插入图片描述

1.4 各进制数之间的关系

加粗样式

第二节 常见存储单位

2.1 存储单位介绍

位 bit

最小值 0

最大值 1

表示的数的范围 0-1(2^1-1)

字节 byte

1byte=8bit

最小值 00000000

最大值 11111111

表示的数的范围 0-255(2^8-1)

字符 :16bit

最小值 0000 0000 0000 0000

最大值 1111 1111 1111 1111

表示的数的范围0-65535(2^16-1)

计算机存储单位转换

位(bit):一个数字0或者一个数字1,代表一位。

字节(Byte):每逢8位是一个字节,这是数据存储的最小单位。

1 Byte = 8 bit

1 KB = 1024 Byte

1 MB = 1024 KB

1 GB = 1024 MB

1 TB = 1024 GB

1 PB = 1024 TB

1 EB = 1024 PB

1 ZB = 1024 EB

在这里插入图片描述

符号位

二进制数如何表示正数和负数呢?

使用最高位作为符号位,0代表整数,1代表负数;
其余数位用作数值位,代表数值。

字节 byte表示的数的范围

无符号数:0-255(28-1) 256个数

有符号数:-128(-27)–127(27-1) 还是256个数

字符 表示的数的范围

无符号数 0-65535(216-1) 65536个数

有符号数 -32768(-215)-----32767(215-1) 还是65536个数

在这里插入图片描述

第三节 标识符、关键字、字符编码

3.1 标识符

作用

常量、变量、方法、类和包等的名称

命名规则

  • 必须以**字母、_下划线、美元符$**开头。
  • 其它部分可以是字母、下划线“_、美元符“$和数字的任意组合
  • 大小写区分,长度无限制。
  • 不可以是Java的关键字,但可以包含关键字或保留字,如class1等。
  • 标识符不能包含空格。

注意

  1. Java不采用通常语言使用的ASCII字符集
  2. Java采用unicode这样的标准的国际字符集。因此,这里的字母的含义:英文、汉字等等。(不建议大家使用汉字来定义标识符!)

3.2 关键字/保留字

Java关键字是Java语言保留供内部使用的,如class用于定义类。 关键字也可以称为保留字,它们的意思是一样的。

注意:

  1. Java中所有的关键字都是小写的。TRUE,FALSE,NULL
  2. enum是Java

在这里插入图片描述

3.3 字符编码

  • ASCII

    • 英文字符集 1个字节
  • ISO8859-1

    • 西欧字符集 1个字节
  • GB2312

    • 大陆使用最早、最广的简体中文字符集 2个字节
  • GBK

    • GB2312的扩展,可以表示繁体中文 2个字节
  • GB18030

    • 最新GBK的扩展,可以表示汉字、维吾尔文、藏文等中华民族字符 2个字节
  • BIG5

    • 台湾的大五码,表示繁体汉字 2个字节
  • Unicode ----UTF-8 UTF-16

    • 国际通用字符集 2个字节

第四节 数据类型、常量和变量

4.1 数据类型

Java是一种强类型语言

      • 常量是有数据类型的
      • 变量都必须声明其数据类型

八大基本数据类型

​ byte 1byte

​ short 2byte

​ int 4byte

​ long 8byte

​ float 4byte 单精度

​ double 8byte 双精度

​ 字符类型 unicode字符 不是ascii

​ char 2byte

​ 布尔类型:表示判断的结果,if,while条件判断的结果

​ boolean 1bit true false 0,1

问题1.float在内存中占据4个字节,int在内存中占据4个字节,从而两种类型表示的范围应该是相同的?

不相同!!!

存储的方式,表示的方法是不同的

int 整数类型 10进制直接转换成二进制,存入即可

float 浮点类型 4个字节分为前后两部分,前面存储基数,后一部分存放的是指数

符号为1位 基数位23 指数位 8

前一部分决定精度,后一部分用来决定范围

问题2.char和int的区别和联系

char类型常量在内存中存储的就是该字符的Unicode编码值(是一个整数),A–65 a—97

​ 在一定范围内,字符类型和整型可以通用

​ 区别

​ 1.分配的空间不同 int 4 char 2

​ 2.数值的范围不同 int的范围更大,并且char只有正数没有负数

注意事项:

  1. 字符串不是基本类型,而是引用类型。

  2. 浮点型可能只是一个近似值,并非精确的值。

  3. 数据范围与字节数不一定相关,例如float数据范围比long更加广泛,但是float是4字节,long是8字节。

  4. 浮点数当中默认类型是double。如果一定要使用float类型,需要加上一个后缀F。
    如果是整数,默认为int类型,如果一定要使用long类型,需要加上一个后缀L。
    推荐使用大写字母后缀。


整型数据类型

整型常量

十进制整数,如:99, -500, 0

八进制整数,要求以 0 开头,如:015

十六进制数,要求 0x 或 0X 开头,如:0x15

整型常量默认为int型,声明long型常量可以后加‘ l ’或‘ L ‘(建议使用大写,小写容易误认为数字1),如:

long a = 55555555; //不出错,在Int表示的范围内(21亿内)。

long b = 55555555555;//不加l出错,已经超过int表示的范围。

整型变量

final int YEAR=365;

在这里插入图片描述

浮点型数据类型

浮点类型常量

十进制数形式,例如:

3.14 314.0 0.314

科学记数法形式,如

314e2 314E2 314E-2

double f = 314e2; //314*10^2–>31400.0

double f2 = 314e-2; //314*10^(-2)–>3.14

浮点型变量

float类型:单精度类型,尾数可以精确到7位有效数字,在很多情况下,float类型的精度很难满足需求。

double类型:双精度类型 精度是float类型的两倍,绝大部分应用程序都采用double类型。

注意

浮点常量默认为double。要变为float,需在后面增加F/f. 如: 3.14F

浮点数存在舍入误差,很多数字不能精确表示。如果需要进行不产生舍入误差的精确数字计算,需要使用BigDecimal类。

在这里插入图片描述


字符数据类型(2个字节)

单引号用来表示字符常量。例如‘A’是一个字符,它与“A”是不同的,“A”表示含有一个字符的字符串。

char 类型用来表示在Unicode编码表中的字符。

Unicode编码被设计用来处理各种语言的所有文字,它占2个字节,可允许有65536个字符;ASCII码占1个字节,可允许有128个字符(最高位是0),是Unicode编码表中前128个字符。

Java 语言中还允许使用转义字符 ‘\’ 来将其后的字符转变为其它的含义,

​ char c2 = ‘\n’; //代表换行符

char类型在内存中存储的是该字符的Unicode编码值,所以char类型可以当做int类型来处理

在这里插入图片描述

布尔数据类型(一位,不是一个字节)

boolean类型有两个值,true和false

boolean 类型用来判断逻辑条件,一般用于程序流程控制

实践:

请不要这样写:if ( is == true && done == false ) ,只有新手才那么写。对于任何程序员 if ( whether && !done ) 都不难理解吧。所以去掉所有的==false 和 ==true。

在这里插入图片描述

public  class TestDataType{
	public static void main(String [] args){
		//整数类型
		byte b = 64;
		//byte b = 640;  //超过了byte类型变量的存储范围  -128---127
		System.out.println("b="+b);
		int i = 640;
		System.out.println("i="+i);
		long l = 6401234576L; //如果整数常量值超过了int的范围,要添加l或者L后缀,建议大写
		System.out.println("l="+l);
		
		int i1 = 0111;  //0 开头 八进制
		int i2 = 0x111; //0x 0X开头 十六进制  0b二进制
		int i3 = 111;
		System.out.println(i1+"   "+i2+"    "+i3);//73   273    111
		//浮点类型
		double pi = 3141.59; //小数写法
		System.out.println("pi = "+ pi);
		pi = 3.14159e3;  //科学计数法
		System.out.println("pi = "+ pi);
		
		
		float f = 3.14F; //默认的浮点常量是double类型  ,如果赋给float变量,需要添加F或者f后缀
		System.out.println("f="+f); 
		
		//字符类型   1个字符(不能是0,2,3,n个字符) 使用单引号括起来  unicode编码
		//存储一个Unicode字符,不仅仅是一个英文字符;
       	//只能是一个字符;字符常量使用单引号;还可以是转义字符
		char ch = 'A';//charactor 字符
		System.out.println("ch="+ch); 
		ch = '学';
		System.out.println("ch="+ch); 
		ch = 'ж';
		System.out.println("ch="+ch); 
		
		ch = '\n'; //转义字符  转义字符也是一个(控制)字符
		System.out.println("ch="+ch); 
		ch = '\"'; // \  ' "的转义表示
		System.out.println("ch="+ch); 
		
		ch = 97; //A:65  a:97  char变量在内存中存储的就是字符的编码值
		System.out.println("ch="+ch); 
		
		System.out.println("MaxInteger: "+Integer.MAX_VALUE);
		System.out.println("MinInteger: "+Integer.MIN_VALUE);
		System.out.println("MaxCharacter: "+(int)Character.MAX_VALUE);
		System.out.println("MinCharacter: "+(int)Character.MIN_VALUE);
		
		//布尔类型:
		boolean flag = false;
		System.out.println("flag = " + flag );
		flag = true;
		System.out.println("flag = " + flag );
	
	}

}

4.2 常量和变量

常量变量定义

  • 在程序中存在大量的数据来代表程序的状态,其中有些数据在程序的运行过程中值会发生改变,有些数据在程序运行过程中值不能发生改变,这些数据在程序中分别被叫做变量常量

  • 年龄和体重会变化,使用变量存储 年龄是整数类型;体重应该是浮点数类型


变量

变量:程序运行期间,内容可以发生改变的量。

创建一个变量并且使用的格式:

数据类型 变量名称; // 创建了一个变量

变量名称 = 数据值; // 赋值,将右边的数据值,赋值交给左边的变量

一步到位的格式:数据类型 变量名称 = 数据值; // 在创建一个变量的同时,立刻放入指定的数据值

变量举例

  • 在2D游戏程序中,需要代表人物的位置,则需要2个变量,一个是x坐标,一个是y坐标,在程序运行过程中,这两个变量的值会发生改变

注意:

1.右侧数值的范围不能超过左侧数据类型的取值范围

2.一个变量定义一次,可以多次使用

3.理解=,不是数学中的等于,代表赋值

使用变量的时候,有一些注意事项:

  1. 如果创建多个变量,那么变量之间的名称不可以重复。

  2. 对于float和long类型来说,字母后缀F和L不要丢掉。

  3. 如果使用byte或者short类型的变量,那么右侧的数据值不能超过左侧类型的范围。

  4. 没有进行赋值的变量,不能直接使用;一定要赋值之后,才能使用。

  5. 变量使用不能超过作用域的范围。

    • 【作用域】:从定义变量的一行开始,一直到直接所属的大括号结束为止。
  6. 可以通过一个语句来创建多个变量,但是一般情况不推荐这么写。


常量

常量:在程序运行期间,固定不变的量。

常量举例

    • 代表常数,便于程序的修改(例如:圆周率的值)
    • 增强程序的可读性(例如:常量UP、DOWN、LEFT和RIGHT分辨代表上下左右,其数值分别是1、2、3和4)

常量的分类:

  1. 字符串常量:凡是用双引号引起来的部分,叫做字符串常量。例如:“abc”、“Hello”、“123”

字符串两个双引号中间的内容可以为空

  1. 整数常量:直接写上的数字,没有小数点。例如:100、200、0、-250

  2. 浮点数常量:直接写上的数字,有小数点。例如:2.5、-3.14、0.0

  3. 字符常量:凡是用单引号引起来的单个字符,就做字符常量。例如:‘A’、‘b’、‘9’、‘中’

    两个单引号中间必须有且仅有一个字符,没有不行。两个单引号中间必须有且仅有一个字符,有两个不行。

  4. 布尔常量:只有量中取值。true、false。

  5. 空常量:null。代表没有任何数据。空常量不能直接用来打印输出。

总结1.认识数据类型常量变量

​ 数据类型:int double

变量 age weight1 weight2

常量值 10 67.5 76.3

总结2:在内存中到底发生了什么

​ 变量其实代表内存中一块空间

​ 变量 房间

​ 变量名 age weight1 房间号

​ 变量类型 int double 房间类型(标准间,三人间 ,总统间)

​ 变量的值 15 70.5 房间中客人

总结3:变量如何定义

​ int age = 15;

​ 变量的类型 变量名 = 变量值;

​ 可以一次定义多个变量

​ 可以定义变量的时候赋值,也可以分开进行

​ 方法中定义的变量没有默认值

在这里插入图片描述

4.3 final常量和Scanner输入

final常量: final double PI=3.14159;

问题1:如果要修改圆周率的精度,需要修改每个值,繁琐

​ 解决:定义一个变量pi,存储圆周率的值,减少了修改量

问题2:因为pi是变量,所以可以中途修改pi的值,导致整个程序中pi的值不一致

​ 解决:使用final修饰pi finally 最后的 最终的 不能再变化的

使用final修饰的变量就成了常量

​ 3.14159 3 字面常量

​ pi 符号常量

问题3:存在常量、变量、方法、类等,不能够通过名称直接判断类型

​ 解决:

命名规范

testdatatype

 类:  TestDataType  驼峰命名法

​ 变量和方法 testDataType testDataType()

​ 常量 TESTDATATYPE

​ 包 testdatatype

问题4:半径是死的,要通过键盘输入半径

​ 解决:Scanner 扫描仪

​ 1.import java.util.Scanner;

​ 2.Scanner input = new Scanner(System.in);

​ 3.double r = input.nextDouble();

总结

​ 常量:PI 3.14159

​ 字面常量 3.14159 10 67 6.5 true ‘A’

​ 符号常量 final double PI = 3.14159;

第五节 基本数据类型的类型转换

5.1 类型转换的介绍

1.什么是类型转换

​ 在(赋值运算或算术)运算时,要求数据类型相同,否则要进行类型转换

2.类型转换的类型

​ 基本数据类型的类型转换:

​ 数值类型(int short byte long float double char)和非数值类型(boolean),

​ 类型转换不涉及布尔类型

​ 引用数据类型的类型转换:父类和子类 Person Student Animal Dog 以后再讲

3.基本数据类型的类型转换的方向

​ byte,short,char---->int—>long—>float---->double

4.算术运算中的转换

​ 操作数都转换为最大宽度的类型,再运算

​ 3+‘a’+3.14+5L====>3.0+97.0+3.14+5.0

5.赋值运算中的转换

​ 左=右 long n = 5+‘a’+123L; 没有发生类型转换

​ 左<右 int n = 5+‘a’+123L; 强制转换 (类型) 做手术

​ 左>右 double n = 5+‘a’+123L; 自动转换

6.特例

​ byte b = 12;

​ 把int赋给byte,short,char,如果数值在byte,short,char范围内,不用强制转换

​ b=(byte)129;

​ 如果超过了 byte,short,char范围,必须进行强制转换

7.数字和字符的对照关系表(编码表):

ASCII码表:American Standard Code for Information Interchange,美国信息交换标准代码。

Unicode码表:万国码。也是数字和符号的对照关系,开头0-127部分和ASCII完全一样,但是从128开始包含有更多字符。

48 - '0’

65 - 'A’

97 - 'a’

在这里插入图片描述

5.2 自动类型转换

  1. 特点:代码不需要进行特殊处理,自动完成。

  2. 规则:数据范围从小到大。

注意:s += 1;
不是等价于 s = s + 1;
而是等价于 s = (s的数据类型)(s + 1);

而s=s+1则会报错,因为右侧数据类型为 byte+int 大于左侧的 byte

public class TestTypeConvert{
	public static void main(String [] args){
		//int n = 10/3;
		//double n = 10/3;
		//double n = 10/3.0;
		//int n = (int)(10/3.0);
		//System.out.println(n);
		//算术运算时的类型转换:自动
		System.out.println(3+'a'+3.14+5L);
		System.out.println(3+'a'+5L);
		
		//赋值运算时
		long l = 3+'a'+5L; //105 Long; 左  =  右 不需要转换
		System.out.println(l);
		double  d = 3+'a'+5L;  // 左double > 右 long 自动类型转换
		System.out.println(d);
		int i = (int)(3+'a'+5L+3.14); // 左int < 右 double 强制类型转换  108.14
		System.out.println(i);
		
		//特例
		byte b = (byte)270;
		System.out.println(b);
		b = 20; //-128--127
		System.out.println(b);
          byte s = 5;
            //s = s+1;
            s+=1;//这个没有问题 内部强制转换
            /*
            s += 1;
                不是等价于 s = s + 1;
                而是等价于 s = (s的数据类型)(s + 1);
            */
            System.out.println(s);
	}

}

5.3 强制类型转换(显式)

  1. 特点:代码需要进行特殊的格式处理,不能自动完成。

  2. 格式:范围小的类型 范围小的变量名 = (范围小的类型) 原本范围大的数据;

注意事项:

  1. 强制类型转换一般不推荐使用,因为有可能发生精度损失、数据溢出。

  2. byte/short/char这三种类型都可以发生数学运算,例如加法“+”.

  3. byte/short/char这三种类型在运算的时候,都会被首先提升成为int类型,然后再计算。

    一旦char类型进行了数学运算,那么字符就会按照一定的规则翻译成为一个数字

  4. boolean类型不能发生数据类型转换

  5. int强制转换为short:注意必须保证逻辑上真实大小本来就没有超过short范围,否则会发生数据溢出

  6. (int)3.99 会显示为3 小数位去掉

第六节 运算符

6.1 算术运算符

/**
技能:算术运算符和赋值运算符
    总结1:
        如果两个整数运算,结果还是整数
        如果两个操作数中有一个是double或者float,则另外一个操作数先转换为double或者float,再进行运算,
        结果不是整数类型;(自动类型转换)
    
    总结2:+
        正号
        加号
        字符串相连
        单目双目运算符
        结合性

    总结3:优先级别
        ( + - 加减 )<(* / %乘 除 取模) < (++  --)   <(+ - 正 负) < 小括号
        
    总结4:++  --
        n++; ++n;作用是相同的,都相当于n = n +1;
        如果n++ ++n是一条单独的语句,两者没有任何区别,都相当于n = n +1;
        
        如果n++ ++n不是一条单独的语句,此时有区别
        x++:先运算,后++
        ++x; 先++,后运算
        注意:变量可以自增自减,常量不可以
        int n = 6 + m++;  先运算符再+1
        int n = 6 + ++m;   先+1再运算
        6++ 变量可以++ -- 常量不可以
*/
public class TestOperator1{
	public static void main(String [] args){
		// /  %
		System.out.println( 12 / 3);  //4
		System.out.println( 12 / 5);  //2
		System.out.println( 12 % 5); // 2
		System.out.println( 12 / 5.0); //2.4
		System.out.println( 12 % 5.0);//2.0
		
		//+
		System.out.println( +3); //3 正号  单目运算符
		System.out.println( 6+3); //9 加号  双目运算符
		System.out.println( 6+3+"ABC"); //9ABC
		System.out.println( "ABC"+6+3); //ABC63
		System.out.println( 'a'+5); //not a5  but  102
		
		//++
		int i = 5;
		System.out.println("i="+i);
		//i++; //  i = i+1  自增1
		++i; // i = i+1  自增1
		System.out.println("i="+i);
		
		int m = 5;
		//int n = 6 + m++; //先运算符再加1
		//int n = 6+m;
		//m++;
		//System.out.println(m+"   "+n); // 6   11
		//int n = 6 + ++m;
		m = m+1;
		int n = 6+m;
		
		System.out.println(m+"   "+n); // 6  12
		
		//i = (i++)+(i++)+(++i);
		System.out.println(5 + 6 / 3 % 2 - 4);
		System.out.println(5 + (6 / 3 % 2) - 4); //提高可读性
		System.out.println((5 + 6) / 3 % 2 - 4); //改变运算顺序
		
		//int n = 5 + 6 / 3 % 2 - 4;
		
	}
}

6.2 赋值运算符

/**
	技能:赋值运算符
	1.=
	 运算级别最低
	 结合性:自右向左
	 是赋值,不是等于
	2.扩展的赋值运算符(和算术运算符结合)
		+=   -=  *=  /=   %=
*/
public class TestOperator2{
	public static void main(String [] args){
		//定义三个分数
		int score1 = 80;
		int score2 = 70;
		int score3 = 95;
		
		//求和
		//int sum = score1+score2+score3;
		int sum = 0; //方法中定义的变量没有默认值
		//sum = sum + score1; //80
		//sum = sum + score2; //150
		//sum = sum + score3; //245
		//建议采用此方式
		//好处1:简单
		//好处2:编译速度快
		//可读性差吗?
		sum+=score1; //sum = sum + score1;
		sum+=score2;
		sum+=score3;
		
		System.out.println(sum);
		
		int m = 6;
		m*=5+6; // m = m * (5+6) 66    m = m * 5+6   36
		System.out.println(m);
		
	}	
}

6.4 逻辑运算符

/*
    技能:逻辑运算符
    1.生活案例:
        1.用户登录:username正确 并且 password="bjsxt"
        2.用户登录失败  username错误 或者 密码错误  
                    除了登录成功之外的  除了(username正确 并且 password="bjsxt") 		
        3.班级流动红旗颁奖  名次前三名  and  分数大于95分  含义不同
                        名次前三名  or  分数大于95分  含义
        
    2.逻辑运算符及其运算规则
        and 与  &  &&  双目
        or  或  |  ||  双目
        not 非  !      单目运算符
        操作数和结果都是布尔类型
    
    3.逻辑运算符运算规则
    
    4.运算符优先级别:
        !> &  > |
        
    5.&和&&的联系和区别   |和||的联系和区别
    联系:
        运算规则相同:两个操作数都是true,结果是true,否则是false	
    区别
        区别1:第一个操作数是false,能决定最终的结果,没有必要计算第二个操作数,此时&和&&有区别
        & 还要计算第二个操作数
        && 不计算第二个操作数 短路
        区别2:
        & 不仅是逻辑运算符,还是位运算符
        && 只是逻辑运算符
        
        开发中常用的是短路逻辑运算符:
**/
public class TestOperator4{
	public static void main(String [] args){
		//& 与 AND :两个操作数都是true,结果是true,否则是false
		/*
		System.out.println(true & true); //true
		System.out.println(true & false); //false
		System.out.println(false & true); //false
		System.out.println(false & false); //false
		*/
		//| 或 OR :两个操作数都是false,结果是false,否则是true
		//有一个操作数是true,结果是true
		/*
		System.out.println(true | true); //true
		System.out.println(true | false); //true
		System.out.println(false | true); //true
		System.out.println(false | false); //false
		*/
		// ! 非 NOT
		/*
		System.out.println(!true); //false
		System.out.println(!false); //true
		*/
		//^ 异或  两个操作数相同,结果是false,否则是true
		/*
		System.out.println(true ^ true); //false
		System.out.println(true ^ false); //true
		System.out.println(false ^ true); //true
		System.out.println(false ^ false); //false
		*/
		
		//优先级别  ! >  &  > |
		//System.out.println(false | true & !false ); 
		//false | true & true
		//false | true
		//true
		
		//&和&&的区别和联系
		//第一个操作数是true,不能确定整个表达式的结果,第二个操作数必须进行运算,此时两者没有区别
		System.out.println(7<8 & 'A'=='a'); 
		System.out.println(7<8 && 'A'=='a');
		//第一个操作数是false,能确定整个表达式的结果,第二个操作数还要进行运算吗?已经没有必要了;
		//& 会计算第二个表达式的值
		//&& 短路与 不会计算第二个表达式的值  性能高  在实际开发中使用更多
		System.out.println(7>8 & 'A'=='a'); 
		System.out.println(7>8 && 'A'=='a'); 
		//举例:用户名错误了,就没有必要判断密码了,肯定是登录失败
		
		System.out.println(5&6); //&还可以做位运算符,&&不可以
		//System.out.println(5&&6);
		
	}	
}

6.5 位运算符

/**
    技能:位运算符1
    &  |  ^  ~
    操作数和结果都是int类型
    
    技能:位运算符2
    << 左移运算符:每左移一位,相当于乘以2
    >>  右移运算符:每右移一位,相当于除以2.最高位正数补0,负数补1
    >>> 无符号右移运算符:不管正数还是负数,最高位一律补0
    
    无符号右移的作用:
    
    无符号右移在数据变换时非常重要。
    比如对byte b;做无符号右移,在众多散列、加密、压缩、影音媒体编码、序列化格式都会用到。
    如果没有这个无符号右移,就需要用更大的空间去做有符号右移。
    
    了解即可
*/

public class TestOperator5{
	public static void main(String [] args){
		//
		/*
		System.out.println(5&6);//4
        System.out.println(5|6);//7
        System.out.println(5^6);//3
        System.out.println(~6); //-7
		//异或:可以理解为不进位的加法和不进位的减法
        //异或的特点:一个数据对另一个数据位异或两次,该数本身不变
		System.out.println(5^6^6);
		*/
		
		//移位运算符  << 左移  >> 右移  >>> 无符号右移  <<< 没有无符号左移
		//右移一位,相当于除以2
		System.out.println(-16>>1); //-8
		System.out.println(-16>>2); //-4
		System.out.println(-16>>3); //-2
		System.out.println(-16>>4); //-1
		//左移一位,相当于乘以2
		System.out.println(16<<1); //8
		System.out.println(16<<2); //4
		System.out.println(16<<3); //2
		System.out.println(16<<4); //1
		
		System.out.println(7>>1); //8
		System.out.println(7>>2);
		System.out.println(7>>3);
		System.out.println(7>>4);
		System.out.println(7>>5);
		
		System.out.println(-16>>>1); //-8
		
		//面试题:请使用最快的方式计算出2*8=?
		System.out.println(2*8);
		System.out.println(2<<3);
	}
}

在这里插入图片描述

6.6 条件运算符

/*
    功能:获取两个数中较大的数并输出
    技能:条件运算符
    
    1.条件运算符  表达式1? 表达式2:表达式3
    2.运算符规则:表达式1为true,取表达式2的值,否则取表达式3的值
    3.唯一的三目运算符
    4.优先级别:仅高于赋值运算
    5.结合性:自右向左的结合性
    6.作用:替代简单的if-else语句
    
*/

public class TestOperator6{
	public static void main(String [] args){
		//定义两个数
		int num1 = 50;
		int num2 = 40;
		
		//获取两个数中较大的数
		int max = num1>num2?num1:num2;
		
		//输出较大数
		System.out.println(max);
		
		//结合性:自右向左的结合性
		System.out.println(5>6?5:(7==8?'a':'A'));  
		//5>6?5:'A'
		
	}
	
}

6.7 运算符的优先级别

      • 不需要去刻意的记优先级关系
      • 赋值<三目<逻辑<关系<算术<单目(单目乘除位关系,逻辑三目(条件)后赋值)
        • 单目算术位关系,逻辑条件后赋值
      • 理解运算符的结合性

        • 单目,条件,赋值自右向左
        • 其他自左向右

在这里插入图片描述

本章总结

  1. 数据类型:基本数据类型和引用数据类型

    • 整型数据类型 byte short int long
    • 浮点型数据类型 float double
    • 字符数据类型 char
    • 布尔数据类型 boolean
  2. 运算符

    • 算术运算符 难点 ++ – 注意+的三个作用
    • 赋值运算符 = += -=… sum+=6---->sum=sum+6关
    • 关系运算符 > < == 关系运算的结果是boolean类型
    • 逻辑运算符 操作数和结果都是boolean型 &和&&的区别和联系(是否短路)
    • 条件运算符 ? : 唯一的三目运算符 int max = num1>num2?num1:num2;
    • 位运算符 了解即可
  3. 运算符的优先级别

    1. 不用刻意背诵,多做练习
    2. 单目>算术>关系>逻辑>条件>赋值
  4. 基本数据类型的类型转换

    1. 自动类型转换 double d=5;
    2. 强制类型转换 int n =(int)3.14;
  5. 其他

    • 字符集 Java采用Unicode字符集 常用字符集都兼容ASCII字符集
    • final常量 使用final修饰变量,变量变成常量,值不能再被改变
    • Scanner 可以接收来自键盘的输入
posted @ 2019-05-22 10:38  陈小哥cw  阅读(265)  评论(0编辑  收藏  举报