Java笔记04

Java基础04:数据类型扩展及面试试题讲解

 public class Demo03 {
     public static void main(String[] args){
         //整数拓展:     进制   二进制0b     十进制     八进制0     十六进制0x
 
         int i = 10;
         int i2 = 010;//八进制0
         int i3 = 0x10;//十六进制0x     0-9 A-F F=16
 
         System.out.println(i);
         System.out.println(i2);
         System.out.println(i3);
 
         System.out.println("========================================================");//分割线
 
 
         //浮点数拓展?   银行业务怎么表示?钱
         //BigDecimal   数学工具类
         //float     有限的     离散的     舍入误差       大约     接近但不等于
         //double
         //最好完全避免使用浮点数进行比较
 
         float f = 0.1f;    //0.1
         double d = 1.0/10;  //0.1
 
         System.out.println(f==d);//false
         System.out.println(f);
         System.out.println(d);
 
         float d1 = 23131312312312313f;
         float d2 = d1 + 1;
 
         System.out.println(d1 == d2);//true
 
 
         System.out.println("========================================================");//分割线
         //字符拓展
         char c1 = 'a';
         char c2 = '中';
 
         System.out.println(c1);
         System.out.println(c2);
 
         System.out.println("========================================================");//分割线
 
         //可以试一下把这个东西转换成数字
         System.out.println((int)c1);//强制转换
         System.out.println((int)c2);//强制转换
         //所有的字符本质还是数字
         //char类型涉及到一个编码类型,Char类型是可以进行运算的。因为它都对应有Unicode码。Unicode编码可以处理各种语言的文字,它占用2个字节,他最多可以表示65536个字符,0-65535
         //U0000 UFFFF
 
         char c3 = '\u0061';
         System.out.println(c3);
 
         //转义字符
         // \t   制表符
         // \n 换行
         System.out.println("Hello\tWorld");
 
 
         System.out.println("========================================================");//分割线
         String sa = new String("Hello World");
         String sb = new String("Hello World");
         System.out.println(sa == sb);//false
 
 
         String sc = ("Hello World");
         String sd = ("Hello World");
         System.out.println(sc == sd);//true
         //对象   从内存分析
 
 
         //布尔值boolean拓展
         boolean flag = true;
 
         if(flag == true){}//新手
         if(flag){}//老手
         //Less is More! 代码要精简易读
 
    }
 }
转义字符说明
\b 退格符
\n 换行符
\r 回车符
\t 制表符
\’’ 双引号
\’ 单引号
\ 反斜线

Java05:类型转换

类型转换
  • 由于Java是强类型语言,所以要进行有些运算的时候,需要用到类型转换。

 ------------------------------------------------>
 byte,short,char -> int -> long -> float -> double//小数的优先级一定大于整数
  • 运算中,不同类型的数据先转换为同一类型,然后进行运算。

  • 强制类型转换

    • l 自动类型转换的逆过程,将容量大的数据类型转换为容量小的数据类型。使用时要加上强制转换符(()),但可能造成精度降低或溢出,格外要注意。(什么叫做逆转换呢?比如我们byte b = 9;int i = b;(这两行属于正常的隐式转换数据类型,它是自动的)。但是我们反过来讲,比如int k =7;byte b0 = k;这样就不行了,不能把int类型转换为byte类型,不能自动转换,如果我们要强制转换呢?例如int k = 7;byte b0 = (byte)k;(这个就是强制转换数据类型,它是手动的,强制的转换数据类型要用英文的小括号()括起来)。)

      l 通常,字符串不能之间转换为基本类型,但通过基本类型对应的包装类则可以实现把字符串转换成基本类型。

      Ø 如:String a = “43”;int i = lnteger.parselnt(a);

      Ø boolean类型不可以转换为其它的数据类型。

  • 自动类型转换

    • 自动类型转换:容量小的类型自动转换为容量大的数据类型。数据类型按容量大小排序为:

       低------------------------------------------------>高
       byte,short,char -> int -> long -> float -> double

      例如byte转换成int(byte b = 2;int x = b;输出System.out.print(x);输出结果为2);假如你想大转小,int转换成byte,例:int i = 0;byte b = i;这样是错误的,异常的,这种异常叫做编译期异常,只有在Javac的时候可以发现。

      l 有多种数据类型的数据混合运算时,系统首先自动将所有数据转换成容量最大的那种数据类型,然后再进行计算。(例如int I = 1;short s = 2;byte b = 3;然后i + s + b;//问题,他们相加最后得到的数字6是一个什么声明类型呢?在计算过程中i、s、b这三个变量会做数据类型的转化吗?答案是会,转化为最大的int:int x = i + s +b;)在计算过程中,整数类型是int的范围最大,所以s和b都分别先转换成int类型然后进行加的运算,最终的结果是int类型的数据。(char是字符为什么也能参加运算呢?比如char c = ‘a’;byte b0 = 2;int k = c + bo;输出结果是99,这明明是个字符,为什么可以和数字相加?原因是ASCII码:“上个世纪60年代,美国制定了一套字符编码,对英语字符与二进制位之间的关系,做了统一规定。这被称为ASCII码。ASCII码一共规定了128个字符的编码,比如空格“SPACE”是32(二进制00100000),大写的字母A是65(二进制01000001)。”实际上我们char定义的英文字符都是有一个数字的,所以我们用char类型的数据在与数字进行数学运算的时候,它是转化为相对应的ASCII码的值然后再进行的计算

      l Byte,short,char之间不会相互转换,它们三者在计算时首先转换为int类型。

      l 当把任何基本数据的值和字符串值进行连接运算时(+),基本类型的值将自动转换为字符串类型。(例如我们先建立一个String str = “abc”;int i = 1;然后System.out.println(str + i);输出它,结果为abc1,实际上把1也定义为字符了,他们不会相加,不论加多少个都是一样的。)

      注意:当这个有一系列的+的运算的时候,如果某个部分其中含有字符串,那么这个字符串前面挨着的+开始一直往后都是要按照字符串拼接计算去看

 public class Dome04 {
     public static void main(String[] args){
         int i = 128;
         byte b = (byte)i;//内存溢出
         //我们再转化的途中尽量要避免这种内存溢出的情况,因为内存溢出,你也不知道变成什么,以及超过它大小了
         System.out.println(i);
         System.out.println(b);
         //强制转换     (类型)变量名     高-->低
         //byte b = (byte)i;这种加()里面输入类型的称为强制转化
 
         //自动转换     低-->高
         int i1 = 128;
         double b1 = i1;
         //我们由低转到高的时候不用加任何东西它也不会报错
         System.out.println(i1);
         System.out.println(b1);
 
 
         /*注意点
         1.不能对布尔值进行转换
         2.不能把对象类型转换为不相干的类型
         3.在把高容量转化到低容量的时候,需要强制转化,反之完全不用动
         4.转换的时候可能存在内存溢出或者精度问题!
          */
 
         System.out.println("==========================================");
         System.out.println((int)23.7);  //23
         System.out.println((int)-45.89f);   //-45
 
 
         System.out.println("==========================================");
         char c = 'a';
         int d = c + 1;
         System.out.println(d);
         System.out.println((char)d);
 
    }
 }
 public class Dome05 {
     public static void main(String[] args){
         //操作比较大的数的时候,注意溢出问题
         //JDK7新特性,数字之间可以用下划线分割
         int money = 10_0000_0000;
         int years = 20;
         int total = money * years;//-1474836480,计算的时候溢出了
         long total2 = money * years;//-1474836480,默认是int,计算完之后才把money * years转换成long类型,转换之前已经存在问题了
         System.out.println(total);
         System.out.println(total2);
 
         long total3 = money * ((long)years);//20000000000,先把一个数转换为long
         System.out.println(total3);
 
    }
 }

数字类型的运算规则:

1、 有多种类型的数据混合运算时,系统首先自动将所有数据转换成容量最大的那种数据类型,然后在进行计算。数字类型的从小到大分别是byte、short、int、long、float、double。

2、 数据类型的运算中,多个相同类型变量参与的运算,变量要先转换成相对应的数据类型的默认类型(比如连个byte类型的变量相加,会先把两个byte类型的变量转换成默认的int类型之后再计算,得到的结果是int类型)。这种情况适用于变量的数据类型的容量比默认类型的容量小,(比如byte,short,都比int小)

3、 byte,short,char之间不会相互转换,它们三者在计算时首先转换为int类型。

posted @ 2020-09-21 00:32  冷色的光  阅读(436)  评论(0)    收藏  举报