目录

  • 数据类型排序
  • 类型转换
  • 自动类型转换
  • 强制类型转换
  • Scanner类
  • 算数运算符
  • 字符串拼接
  • 赋值运算符
  • 自增自减
  • 关系运算符
  • 逻辑运算符
  • 短路效应
  • 三元运算
  • 最后


数据类型排序

前一篇文章我们了解了Java八大基本数据类型,每一个数据类型表示的数据范围是不一样的,那他们的排序是怎么样的呢?

byte:-2^7 ~ 2^7-1,即-128 ~ 127。

short:-2^15 ~2^15-1,即-32768 ~ 32767。

int:-2^31 ~ 2^31-1,即-2147483648 ~ 2147483647。

long:-2^63 ~ 2^63-1,即-9223372036854774808 ~ 9223372036854774807。

float:-3.4 * 10^38 ~ +3.4 * 10^38

double:-1.7 * 10^-308 ~ +1.7 * 10^308

char: 0 ~ 65535

所以这时候我们可以将他们进行排序

byte<short<int<long<float<double

接着我们注意到这个排序的都是有负数范围的,而char是0~65535,这个char怎么排呢?

65535大于byte和short,所以有第二种排序

char<int<long<float<double

类型转换

自动类型转换

刚刚我们知晓了各个类型的数据范围,由此接着学习类型转换。

自动类型转换:通俗的讲就是范围小的转为范围大的。(就像小狗长成大狗,这是天经地义很合理的事情,所以叫做自动类型转换)

强制类型转换

强制类型转换:就是范围大的转为范围小的,这是不合理的,所以要进行强制类型转换,不然会报错。

强制类型转换可能会造成数据的丢失

public static void main(String[] args){
	double a = 3.14;
	int b = (int)a;
	System.out.println(b);
}

java的基本数据类型从小到大排序 java基本数据类型范围排序_数据结构

我们预期的结果是3.14

然而输出的是3,我们double数据类型的精度就丢失了。

Scanner类

Scanner类可以帮助我们进行键盘数据输入,具体过程为:

1.导入包

2.new一个scanner类

3.键盘输入数据

Scanner scanner = new Scanner(System.in);
        System.out.println("请输入一个值:");
        int i = scanner.nextInt();
        System.out.println("你输入的值为:");
        System.out.println(i);

要输入int类型就用nextInt,同理有nextDouble,nextFloat等等

八大基本数据类型中除了char,都可以像上面这样输入

那char类型应该怎么样输入呢?字符串类型String又该怎么输入呢?

答案是:

Scanner scanner = new Scanner(System.in);
        System.out.println("请输入一个字符:");
        String i = scanner.next();
        System.out.println("你输入的值为:");
        System.out.println(i);

算数运算符

算术运算符有+ - * / %

加减乘除我们都很清楚,那么%是什么意思呢?

%是取余的意思

public static void main(String[] args) {
        int a = 9;
        int b = a % 3;
        System.out.println("b:"+b);
    }

java的基本数据类型从小到大排序 java基本数据类型范围排序_jvm_02


因为能整除,所以对他取余就是0

加减乘都很简单没有什么特别的,但是看一下除法

public static void main(String[] args) {
        int a = 9;
        int b = a / 2;
        System.out.println("b:"+b);
    }

我们预计的结果是4.5,但是实际输出是4

java的基本数据类型从小到大排序 java基本数据类型范围排序_java的基本数据类型从小到大排序_03


因为在除法中,两个整数相除得出的只能是整数,会自动把小数点后的部分省略

为什么整数和整数相除,一定会是整数呢?

因为Java是一种很严谨的语言,它只能识别一种数据类型。

这就涉及到表达式类型提升。

什么是表达式类型提升呢?

表达式类型提升就是:

有多种数据类型参与运算,会自动转为范围较大的数据类型。

所以整数和整数只能得整数。

如果我们一定要保留小数的话,只需要让小数参与运算即可

public static void main(String[] args) {
        System.out.println(9/2);
        System.out.println(9/2.0);
        System.out.println(9.0/2);
        System.out.println(9.0/2.0);
    }

java的基本数据类型从小到大排序 java基本数据类型范围排序_数据结构_04

字符串拼接

任意类型+字符串都是在拼接,而不是加法

public static void main(String[] args) {
        int a =10;
        System.out.println("aaa"+a);
    }

java的基本数据类型从小到大排序 java基本数据类型范围排序_数据结构_05

接着看

public static void main(String[] args) {
        System.out.println("aaa"+10+10);
        System.out.println(10+10+"aaa"+10+10);
    }

我们的运算式都是从左往右,两个两个进行,所以第二个输出是先10+10进行加法运算,再进行字符串拼接

java的基本数据类型从小到大排序 java基本数据类型范围排序_java_06

赋值运算符

赋值运算符包括== += -= /= %=
"=="是判断是否相等,=是进行赋值
+=是先进行+操作,再赋值
其余都是一样的操作

public static void main(String[] args) {
        byte a = 1;
        int b = 0;
        a += b;
        System.out.println(a);
    }

java的基本数据类型从小到大排序 java基本数据类型范围排序_数据结构_07

a += b相当于先进行a + b 的操作,再把相加的结果赋值给a,也就是a = a + b

这样理解不完全正确,因为在+= -=这样之中还含有隐藏的类型转换

java的基本数据类型从小到大排序 java基本数据类型范围排序_java_08


我们会发现这样会报错,因为byte,short,char在运算时会自动转为int类型,我们先进行a + b,得到的是一个Int类型,将int类型赋值给byte,必须强制转换。

自增自减

例如i++ 、 i-- 、++i 、–i

这些都是自增自减,那i++和++i有什么区别呢?

拿自增来举个例子,

当自增是单独运算的时候,不用考虑是先++还是先赋值,结果肯定是自增的,看代码:

public static void main(String[] args) {
        int i =10;
        i++;
        System.out.println("i = " + i);
        ++i;
        System.out.println("i = " + i);
    }

java的基本数据类型从小到大排序 java基本数据类型范围排序_jvm_09


说明当i++单独操作时,不会有特殊情况,肯定是+1的。

当i++参与运算时,就会有特殊情况,看代码:
(参与运算的意思就是除了i++,这一行还有其他的代码)

public static void main(String[] args) {
        int i =10;
        System.out.println(i++);
        System.out.println(i);
        System.out.println(++i);
    }

java的基本数据类型从小到大排序 java基本数据类型范围排序_jvm_10


我们尝试后发现,

i++是先输出,再进行自增

++i是先进行自增,再输出

总结通俗的结论:

i在前面,就先得i的值

++在前面,就先进行++

关系运算符

==、>=、<=、!=、>、<
返回的是一个boolean类型的值

public static void main(String[] args) {
        System.out.println(7>8);
        System.out.println(7<8);
        System.out.println(7==8);
        System.out.println(7<=8);
        System.out.println(7>=8);
        System.out.println(7!=8);
    }

java的基本数据类型从小到大排序 java基本数据类型范围排序_jvm_11

逻辑运算符

逻辑运算符包括&&(与)、||(或)、!(非)

先举个例子引出

在Java代码中要表示一个范围2 < a < 6 ,应该怎么表示呢?

java的基本数据类型从小到大排序 java基本数据类型范围排序_java_12


我们看到直接写是会报错的,我们看一下提示,上面写的boolean和int,这是怎么回事呢?

结合前面的知识,我们是从左往右两两进行运算的,所以先执行2 < a,得到的结果是true,从而造成true < 6

public static void main(String[] args) {
        int a = 5;
        System.out.println(2<a && a<6);
    }

java的基本数据类型从小到大排序 java基本数据类型范围排序_java的基本数据类型从小到大排序_13


这就是我们的逻辑运算符

&&(与)用来表示多个关系式同时成立
||(或)用来表示多个关系式只需一个成立即可
! (非)用来取与之前相反的情况

短路效应

public static void main(String[] args) {
        int a = 5;
        int b = 10;
        System.out.println(a++ > 0 || b++>0);
        System.out.println(a);
        System.out.println(b);
    }

我们先分析一下代码,回顾之前的内容,a++应该是先赋值再加加,所以a的值应该为6,那b的值又是多少呢?11吗?

java的基本数据类型从小到大排序 java基本数据类型范围排序_jvm_14


运行后发现a = 6,b = 10,b并没有加加,这是为什么呢?

因为||是多种表达式中只要有一个满足条件即可,我们a++>0是成立的,为true,所以直接短路了,不执行后面的b++

三元运算

格式

关系表达式?表达式1:表达式2

若关系表达式为true,则返回表达式1

若关系表达式为flase,则返回表达式2

public static void main(String[] args) {
        int a = 10;
        int b = 20;
        System.out.println(a>b?a:b);

        int s = a>b?a:b;
        System.out.println(s);
    }

java的基本数据类型从小到大排序 java基本数据类型范围排序_System_15