JavaSE之数据类型和运算符的总结

目录

一、数据类型

1.变量和类型

2.整型类型int

 3.长整型long

4.双精度浮点型变量double

5.单精度浮点型变量float

6.字符类型变量char

7.字节类型变量byte

8.短整型变量short

9.布尔类型变量boolean

10.字符串类型变量

11.变量的作用域

12.变量的命名规则

13.常量

14.类型转换

15.数值提升

16.int和string的相互转换

总结:

 二、运算符

1.算术运算符

2.关系运算符

3.逻辑运算符

4.位运算符

5.移位运算符

6.条件运算符

7.运算符的优先级

三、注释


一、数据类型

1.变量和类型

变量指的是程序运行时可变的量 . 相当于开辟一块内存空间来保存一些数据
类型则是对变量的种类进行了划分 , 不同的类型的变量具有不同的特性

2.整型类型int

(1)基本语法形式:int 变量名 = 初始值;

(2)没有所谓的无符号类型,统一都是有符号的,一个 int 变量占 4 个字节,和操作系统没有直接关系。第一位为符号位,其余31位为数值位,所以int的大小范围:-2^31 -> 2^31-1,即-2147483648~2147483647。如果运算的结果超出了 int 的最大范围, 就会出现溢出的情况。

public class DataTyprs{
   public static void main(String[] args){
       int maxValue = Integer.MAX_VALUE;
       int minValue = Integer.MIN_VALUE;

       System.out.println(maxValue);
       System.out.println(maxValue+1);
       System.out.println(minValue);
       System.out.println(minValue);
   }
}
       

编译运行该代码,输出如下: 

 3.长整型long

(1)基本语法形式:long 变量名 = 初始值;建议初值加一个后缀L或l,如:10L或10l

(2)long 类型占 8 个字节. 表示的数据范围 -2^63 -> 2^63-1

public class TestData{
   public static void main(String[] args){
      System.out.println(Long.MAX_VALUE);//9223372036854775807
      System.out.println(Long.MIN_VALUE);//-9223372036854775808
   }
}

4.双精度浮点型变量double

(1)基本语法形式:double 变量名 = 初始值;
(2) Java 中的 double 虽然也是 8 个字节 , 但是浮点数的内存布局和整数差别很大 , 不能单纯的用 2 ^ n 的形式表示数据范 .J ava double 类型的内存布局遵守 IEEE 754 标准 ( C 语言一样 ), 尝试使用有限的内存空间表示可能无限的小数 , 必会存在一定的精度误差 .
public class TestData{
    public static void main(String[] args){
        double num = 1.1;
        System.out.println(num*num);
    }
}
  

编译运行该代码,输出如下:

1.2100000000000002

5.单精度浮点型变量float

(1)基本语法形式:double 变量名 = 初始值;建议初值加一个后缀F或f,如:10.1F或10.1f

(2) float 类型在 Java 中占四个字节 , 同样遵守 IEEE 754 标准 . 由于表示的数据精度范围较小 , 一般在工程上用到浮点数都
优先考虑 double, 不太推荐使用float

6.字符类型变量char

(1)基本语法形式:char 变量名 = 初始值;

(2)Java 中使用 单引号 + 单个字母 的形式表示字符字面值.

(3)计算机中的字符本质上是一个整数. C 语言中使用 ASCII 表示字符, Java 中使用 Unicode 表示字符. 因此一 个字符占用两个字节, 表示的字符种类更多, 包括中文.使用一个字符表示一个汉字,如:char ch = '呵';

7.字节类型变量byte

(1)基本语法格式 : byte 变量名 = 初始值 ;
(2) 字节类型表示的也是整数 . 只占一个字节 , 表示范围较小 ( - 128 - > +127 )
(3) 字节类型和字符类型互不相干

8.短整型变量short

(1)基本语法格式: byte 变量名 = 初始值;

(2)short 占用 2 个字节, 表示的数据范围是 -32768 -> +32767。这个表示范围比较小, 一般不推荐使用。

9.布尔类型变量boolean

(1)基本语法格式: boolean 变量名 = 初始值;

(2)boolean 类型的变量只有两种取值, true 表示真, false 表示假

(3)Java boolean 类型和 int 不能相互转换, 不存在 1 表示 true, 0 表示 false 这样的用法

public class TestData{
   public static void main (String[] args){
       boolean value = true;
       System.out.println(value+1);
   }
}

编译运行该代码,会发现编译错误。value的类型是boolean,1的类型是int。 

(4)boolean 类型有些 JVM 的实现是占 1 个字节, 有些是占 1 个比特位, 这个没有明确规定。假设有一条4选1的选择题题,这时要去看其他3项有无明显错误

10.字符串类型变量

(1)基本语法格式 : String 变量名 = " 初始值";
(2) Java 使用 双引号 + 若干字符 的方式表示字符串字面值 . 如:String str = "Hello";
(3) 和上面的类型不同 , String 不是基本类型 , 而是 引用类型
(4) 字符串中的一些特定的不太方便直接表示的字符需要进行转义
一些常见的转义字符
转义字符解释
\n换行
\t水平制表符
\'单引号
\"双引号
\\反斜杠

(5)字符串使用“+”表示字符串的拼接(当一个 + 表达式中存在字符串的时候, 都是执行字符串拼接行为

System.out.println("hello"+"world");//helloworld

字符串和其他数据类型使用“+“拼接,结果就是一个字符串,如:

System.out.println("hello"+10+20);//hello1020

但是也有一些特例:

System.out.println(10+20+"hello");//30hello  这是因为括号里的式子从左往右计算,所以会先加起来等于30再与hello拼接为30hello

那么如何才能打印出hello30和1020hello呢?

System.out.println("hello"+(10+20));//hello30   加一个括号,就会先进行加法,再进行拼接啦

System.out.println(10+""+20+"hello");//1020hello   ""是一个空字符串,10+""就拼接为一个字符串"10","10"再和20拼接为字符串"1020",最后"1020"与"hello"拼接为“1020hello”

11.变量的作用域

也就是该变量能生效的范围 , 一般是变量定义所在的代码块 ( 大括号 )
public class TestData{   
      public static void main(String[] args) { 
          { 
              int x = 10; 
              System.out.println(x); // 编译通过; 
          } 
          System.out.println(x); // 编译失败, 找不到变量 x. 
      } 
}

12.变量的命名规则

(1)一个变量名只能包含数字 , 字母 , 下划线
(2)数字不能开头.
(3)变量名是大小写敏感的. 即 num Num 是两个不同的变量 .
注意 : 虽然语法上也允许使用中文 / 美元符 ($) 命名变量 , 但是 强烈 不推荐这样做
一些建议:
(1)变量命名要具有描述性 , 见名知意 .
(2)变量名不宜使用拼音 ( 但是不绝对 ).
(3)变量名的词性推荐使用名词 .
(4)变量命名推荐 小驼峰命名法 , 当一个变量名由多个单词构成的时候 , 除了第一个单词之外 , 其他单词首字母都大写.

13.常量

 常量指的是运行时类型不能发生改变。常量主要有以下两种表现形式:

(1)字面值常量

10               // int 字面值常量 ( 十进制 )
010             // int 字面值常量 ( 八进制 ) 由数字 0 开头 . 010 也就是十进制的 8
0x10           // int 字面值常量 ( 十六进制 ) 由数字 0x 开头 . 0x10 也就是十进制的 16
10L             // long 字面值常量 . 也可以写作 10l ( 小写的 L)
1.0              // double 字面值常量 . 也可以写作 1.0d 或者 1.0D
1.5e2          // double 字面值常量 . 科学计数法表示 . 相当于 1.5 * 10^2
1.0f             // float 字面值常量 , 也可以写作 1.0F
true            // boolen 字面值常量 , 同样的还有 false
'a'               // char 字面值常量 , 单引号中只能有一个字符
"abc"          // String 字面值常量 , 双引号中可以有多个字符
(2)final 关键字修饰的常量

不能在程序运行过程中发生修改.

public class TestData{
    public static void main(String[] args){
        final int a = 10;
        a = 20;
    }
}

14.类型转换

Java 作为一个强类型编程语言 , 当不同类型之间的变量相互赋值的时候 , 会有教严格的校验
(1) int long/double 相互赋值
public class TestData{
    public static void main(String[] args){
        int a = 10; 
        long b = 20; 
        double c = 30.0;
  
        a = b; // 编译出错, 提示可能会损失精度,也许我们会想int还放不下一个小小的20吗?这是因为b是一个变量,程序运行时才知道b的值,所以在编译时不知道b的值,所以编译出错
        b = a;//编译通过
        a = c; // 编译出错, 提示可能会损失精度
        c = a;//编译通过
    }
}
不同数字类型的变量之间赋值 , 表示范围更小的类型能隐式转换成范围较大的类型 , 反之则不行

(2)int boolean 相互赋值 

public class TestData{
    public static void main(String[] args){
         int a = 10; 
         boolean b = true; 

         b = a; // 编译出错, 提示不兼容的类型
         a = b; // 编译出错, 提示不兼容的类型
    }
}
int boolean 是毫不相干的两种类型 , 不能相互赋值
(3)int字面值常量 给 byte 赋值
public class TestData{
    public static void main(String[] args){
        byte a = 100; // 编译通过
        byte b = 256; // 编译报错, 提示 从int转换到byte可能会有损失    byte 表示的数据范围是 -128 -> +127
    }
}
使用字面值常量赋值的时候 , Java 会自动进行一些检查校验 , 判定赋值是否合理
强制类型转换:
(1)强制类型转换可能会导致精度丢失
(2)强制类型转换不是一定能成功 , 互不相干的类型之间无法强转
public class TestData{
    public static void main(String[] args){
       int a = 0; 
       double b = 10.5; 
       a = (int)b; //精度丢失,10.5会变成10

       int c = 10; 
       boolean d = false; 
       d = (boolean)c;// 编译出错,提示不兼容类型
    }
}

15.数值提升

(1)int和long的混合运算

public class TestData{
    public static void main(String[] args){
        int a = 10; 
        long b = 20; 
        int c = a + b; // 编译出错, 提示将 long 转成 int 会丢失精度
        long d = a + b; // 编译通过
    }
}

CPU在进行>4byte的数据的运算时,会将范围小的数据提升为范围大的数据,如上面的代码,当 int long 混合运算的时候, int 会提升成 long, 得到的结果仍然是 long 类型, 需要使用 long 类型的变量来接收结果. 如果非要用 int 来接收结果, 就需要使用强制类型转换

(2)byte和byte的运算

public class TestData{
    public static void main(String[] args){
       byte a = 1;
       byte b = 2;
       byte c = a + b;
       byte d = 1 + 2;
    
       System.out.println(c);//编译报错,原因:不兼容的类型: 从int转换到byte可能会有损失
       System.out.println(d);//3  1和2都是字面值常量,在程序编译时,已经被编译为3了
    }
}

 由于计算机的 CPU 通常是按照 4 个字节为单位从内存中读写数据. 为了硬件上实现方便, 诸如 byte short 这种低于4个字节的类型, 会先提升成 int, 再参与计算

可以修改为byte c = (byte)(a+b);

16.int和string的相互转换

int---->String

valueOf() 方法用于返回给定参数的原生 Number 对象值,参数可以是原生数据类型, String等

public class TestData{
    public static void main(String[] args){        
        int num = 10;
        //方法一:
        String ret = String.valueOf(num);
        //方法二:
        String str = num + "";
        System.out.println(ret);
        System.out.println(str);
    }
}

编译运行该代码,输出如下:

10

10

String------>int

public class TestData{
    public static void main(String[] args){   
        String str = "100"; 
        int num = Integer.parseInt(str);
          
        System.out.println(num);
    }
}

编译运行该代码,输出如下:

100

总结:

 

 二、运算符

1.算术运算符

(1)基本运算符  +  -  *  /  %

这里值得注意的是/和%:

对于/:int/int=int,诸如1/2这样的计算要用double;0不能作除数,否则会抛出异常,后面的代码都不会执行

对于%不仅仅可以对 int 求模, 也能对 double 来求模。注意以下3个式子:

              -10%3     10%-3     -10%-3,没错它们的答案分别是-1,1,-1

(2)增量赋值运算符 += -= *=  /= %=

public class TestData{
    public static void main(String[] args){ 
       short s = 10;
       
       s = (short)(s+9);
       y += 9;
       System.out.println(s);
       System.out.println(y);
    }
}

  编译并运行该代码,输出如下:

19 

19

可以看到增量赋值运算符会完成自动类型转换

(3)自增/自减运算符   ++/ --

①如果不取自增运算的表达式的返回值 , 则前置自增和后置自增没有区别 .
②如果取表达式的返回值 , 则前置自增的返回值是自增之后的值 , 后置自增的返回值是自增之前的值

2.关系运算符

关系运算符主要有:==     !=    <     >     <=      >=

关系运算符的表达式返回值都是 boolean 类型
public class TestData{
    public static void main(String[] args){
       System.out.println(10 > 20);
    }
}

编译运行该代码,输出如下:

false

3.逻辑运算符

逻辑运算符的操作数 ( 操作数往往是关系运算符的结果 ) 和返回值都是boolean
逻辑运算符主要有   &&      ||       !
表达式1&&表达式2:表达式1和表达式2均为布尔表达式        两个操作数都为 true, 结果为 true, 否则结果为 false
表达式1||表达式2:表达式1和表达式2均为布尔表达式           两个操作数都为 false, 结果为 false, 否则结果为 true
!表达式:表达式为布尔表达式     操作数为 true, 结果为 false; 操作数为 false, 结果为 true( 这是个单目运算符 , 只有一个操作数 )
&& || 遵守短路求值的规则:
(1) 对于 && , 如果左侧表达式值为 false, 则表达式的整体的值一定是 false, 无需计算右侧表达式
(2)对于 ||, 如果左侧表达式值为 true, 则表达式的整体的值一定是 true, 无需计算右侧表达式

4.位运算符

位运算符主要有:&     |     ~     ^
位操作表示 按二进制位运算 . 计算机中都是使用二进制来表示数据的 (01 构成的序列 ), 按位运算就是在按照二进制位的每一位依次进行计算.
&:对应位都是1,结果就是1
|:对应位如果有1,结果就是1
^: 一样的是0,不一样的1
~: 如果该位为 0 则转为 1, 如果该位为 1 则转为 0
& | 的操作数为整数 (int, short, long, byte) 的时候 , 表示按位运算 , 当操作数为 boolean 的时候 , 表示逻辑运算.

5.移位运算符

移位运算符有3个:>>    <<     >>>     都是按照二进制位来运算

左移 << : 最左侧位不要了 , 最右侧补 0
右移 >> : 最右侧位不要了 , 最左侧补符号位 ( 正数补 0, 负数补 1)
无符号右移 >>>: 最右侧位不要了 , 最左侧补 0.
注意:
(1)左移 1 , 相当于原数字 * 2. 左移 N , 相当于原数字 * 2 N 次方 .
(2)右移 1 , 相当于原数字 / 2. 右移 N , 相当于原数字 / 2 N 次方 .
(3)由于计算机计算移位效率高于计算乘除 , 当某个代码正好乘除 2 N 次方的时候可以用移位运算代替 .
(4)移动负数位或者移位位数过大都没有意义

6.条件运算符

表达式 1 ? 表达式 2 : 表达式 3               表达式1为布尔表达式
Java 中唯一的一个 三目运算符 , 是条件判断语句的简化写法

7.运算符的优先级

运算符之间是有优先级. 具体的规则我们不必记忆. 在可能存在歧义的代码中加上括号即可。如:

System.out.println(10 < 20 && 20 < 30);

此时明显是先计算的 10 < 20 20 < 30, 再计算 &&. 否则 20 && 20 这样的操作是语法上有误的 (&& 的操作数只能是
boolean).

三、注释

注释是为了让代码更容易被读懂而附加的描述信息. 不参与编译运行, 但是却非常重要

1.Java 中的注释主要分为以下三种:
  单行注释:// 注释内容(用的最多)
多行注释:/* 注释内容*/(不推荐)
文档注释: /** 文档注释 */(常见于方法和类之上描述方法和类的作用),可用来自动生成文档  
2.注释规范:
(1)内容准确 : 注释内容要和代码一致 , 匹配 , 并在代码修改时及时更新 .
(2)篇幅合理 : 注释既不应该太精简 , 也不应该长篇大论 .
(3)使用中文 : 一般中国公司都要求使用中文写注释 , 外企另当别论 .
(4)积极向上 : 注释中不要包含负能量 ( 例如 领导 SB ).

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值