爱悠闲 > java学习笔记三(Java数据类型)

java学习笔记三(Java数据类型)

标签: java,存储,arrays,float,byte,string  |  作者: lxbin11433 相关  |  发布日期 : 2014-12-20  |  热度 : 211°

数据类型

Java的数据类型主要分为2种:

基本数据类型:(不能简化的、内置的数据类型、由编程语言本身定义,它表示了真实的数字、字符和整数

                     1 数值型

                            1整数型:byte short int long

                            2 小数型:float double

                     2 字符型 char

                     3 boolean 取值只有true false

         复杂数据类型

               1 数组

               2

               3 接口

复杂类型和基本类型的内存模型本质上不一样,简单数据类型的存储原理:所有的简单数据类型不存在引用概念,简单数据类型直接存储在内存中的内存栈上,数据本身的值存储在栈空间里面,而Java语言里面只有这八种数据类型是这种存储模型;而其他的只要是继承于Object类的复杂数据类型都是按照Java里面存储对象的内存模型来进行数据存储的,使用Java内存堆和内存栈来进行这种类型的数据存储,简单地讲,引用是存储在有序的内存栈上的,而对象本身的值存储在内存堆上的。

 

intint整数类型,在存储的时候,用4个字节存储,范围为-2,147,483,6482,147,483,647,在变量初始化的时候,int类型的默认值为0

  shortshort也属于整数类型,在存储的时候,用2个字节存储,范围为-32,76832,767,在变量初始化的时候,short类型的默认值为0,一般情况下,因为Java本身转型的原因,可以直接写为0

  longlong也属于整数类型,在存储的时候,用8个字节存储,范围为-9,223,372,036,854,775,8089,223,372,036, 854,775,807,在变量初始化的时候,long类型的默认值为0L0l,也可直接写为0

  bytebyte同样属于整数类型,在存储的时候,用1个字节来存储,范围为-128127,在变量初始化的时候,byte类型的默认值也为0

  floatfloat属于实数类型,在存储的时候,用4个字节来存储,范围为32IEEEE 754单精度范围,在变量初始化的时候,float的默认值为0.0f0.0F,在初始化的时候可以写0.0

  doubledouble同样属于实数类型,在存储的时候,用8个字节来存储,范围为64IEEE 754双精度范围,在变量初始化的时候,double的默认值为0.0

  charchar属于字符类型,在存储的时候用2个字节来存储,因为Java本身的字符集不是用ASCII码来进行存储,是使用的16Unicode字符集,它的字符范围即是Unicode的字符范围,在变量初始化的时候,char类型的默认值为'u0000'

booleanboolean属于布尔类型,在存储的时候不使用字节,仅仅使用1来存储,范围仅仅为01,其字面量为truefalse,而boolean变量在初始化的时候变量的默认值为false

 

Java里面,每一种原始类型都对应着相应的包装类型,在JDK1.5之前(不包含JDK1.5),当包装类和原始类型进行相互转换的时候,需要调用包装类型的方法进行转换,不能通过操作符进行直接的计算。

基本数据类型转换:

     1 自动转换

         条件A.这两种类型是兼容的;B.目的类型数的范围(位数)比来源类型的大

     2 强制转换(不同类型之间的转换,大范围向小范围转)

强制转换过程,唯独可能特殊的是charint是可以转换的,不过会使用charASCII码值比如:

int a = (int)'a';a的值在转换过后输出的话,值为97

强制转换过程中不会考虑精度的丢失,直接将多余部分舍弃掉。

     3 类型的自动提升

           所有的byteshortchar类型的值将提升为int类型;

      如果有一个操作数是long类型,计算结果是long类型;

      如果有一个操作数是float类型,计算结果是float类型;

      如果有一个操作数是double类型,计算结果是double类型;

      自动类型转换图如下:

      byte->short(char)->int->long->float->double

说明:

      1 长整数字有一个后缀为“L”或者“l”

      2  默认的基本浮点类型为double

      3  float数据类型有一个后缀为“F”“f”

      4  char类型可以使用通用的转义字符,但是不是ASCII码,应该是Unicode格式的如'/u0000'

      5  数据操作中 最大值加1就会变成最小值,反之最小值减1就会变成最大值。

Java数组

1)             一维数组(声明、创建、初始化)

声明方式: type var[] type[] var  声明数组时不能指定其长度(数组中元素的个数)

创建:Java中使用关键字new创建数组对象,格式为:数组名 = new 数组元素的类型 [数组元素的个数]

初始化:

1   package com.lxb.array;

 

/**

       * 数组动态初始化

       * 数组定义与为数组分配空间和赋值的操作分开进行

       * @author lxb

       *

       */

public class TestD {

        public static void main(String[] args) {

           int[] a;

           a = new int[2];

           a[0] = 0;

           a[1] = 1;

        }

}

 

2 package com.lxb.array;

 

/**

 * 数组静态初始化

 * 在定义数组的同时就为数组元素分配空间并赋值

 * @author lxb

 *

 */

public class TestS {

 

    public static void main(String[] args) {

       int a[] = {0,1,2};

 

    }

}

 

3 package com.lxb.array;

 

/**

 * 默认初始化

 * 数组是引用类型,它的元素相当于类的成员变量,

 * 因此数组分配空间后,每个元素也被按照成员变量的规则被隐士初始化

 * @author lxb

 *

 */

public class TestDefault { 

    public static void main(String[] args) {

       int a[] = new int[5];

       System.out.println(a[3]);

 

    }

}

2)           多维数组

Java里面不仅仅可以定义一纬数组,还可以定义多维数组,多维数组的定义如下:

           int[][] arrays1 = new int[3][2];

           int[][] arrays2 = new int[3][];

           不合法的定义方式为:

           int[][] arrays3 = new int[][2];

 

操作符

操作

优先级

结合性

后缀运算符

[] . () 函数调用

从左到右

单目运算符

! ~ ++ -- +(单操作符) -(单操作符)

从右到左

创建

new

从左到右

乘除

* / %

从左到右

加减

+ -

从左到右

移位

<< >> >>>

从左到右

关系

< <= > >= instanceof

从左到右

相等

== !=

从左到右

按位与

&

从左到右

按位异或

^

从左到右

按位或

|

从左到右

逻辑与

&&

从左到右

逻辑或

||

从左到右

条件

? :

从右到左

赋值

= += -= *= /= %= ^= <<= >>= >>>=

从右到左

几乎所有运算符都只能操作基本类型Primitives,只是===!=可以操作所有对象,除此String类型可以支持++=操作符:

java 的除法运算就是就是将被除数分成多个完整的除数。特例 当最小值去除以-1 仍然是它本身。

[1]针对原始类型=操作符而言,比如a=bab为两个变量】,在赋值的过程里面,这句话进行了下边的操作:JVM在内存里面为b保存一个栈地址用来存储真实的b的值,然后在赋值过程中,JVM创建一个b的副本,然后把b的副本的值赋值到a里面,也就是说在这种情况下如果a的值发生了变化的话,b本身的值是不会受到影响的,而b在赋值过程的副本也是瞬间的,当a一旦接受到b的值过后,b的副本就从内存里面清除掉,就使得ab各自有了自己的栈地址

[2]如果是非原始类型:比如有两个对象的引用ab,如果进行了a=b的操作,这句话就进行了下边的操作:JVM拷贝一个b的引用,然后把引用副本赋值到a,使得a引用和b引用指向同一个对象,a引用的对象发生改变的时候,b引用指向的对象也会发生同样的改变

 

java存在前递增和前递减(++A--A),这种情况先进行运算,再生成值;后递增和后递减(A++A--),会先生成值,再执行运算

[1]前递增(递减)和后递增(递减)就是上边表达的那种情况,但是有一点特殊就是前递增(递减)是先改变变量的值,而后递增(递减)是在进行运算过后修改变量的值

[2]而且在Java里面,自动递增递减是支持浮点类型

 

关于关系运算符需要说明的是

·                ==!=是适合所有的基本类型(Primitives)的,但是其他关系运算符不能比较boolean

·                如果是针对两个引用指向的对象内容进行比较,必须用特殊的操作方法equals()

·                ==!=在比较两个引用的时候,比较的是引用的指向,而不是对象的内容信息

逻辑运算符和按位运算符

  逻辑运算符有&&||!能够结合表达式生成一个boolean返回值

按位运算符AND(&)OR(|)XOR(^)NOT(~)运算

下边是所有的逻辑关系表:

非关系表:

A

!A

true

false

false

true

逻辑与关系:

A

B

A && B

false

false

false

true

false

false

false

true

false

true

true

true

逻辑或关系:

A

B

A || B

false 

false 

false

true

false

true

false 

true

true

true

true

true

 

下边是按位运算关系表:

非位运算符:

A

~A

1

0

0

1

与位运算符:

A

B

A & B

1

1

1

1

0

0

0

1

0

0

0

0

或位运算符:

A

B

A | B

1

1

1

1

0

1

0

1

1

0

0

0

异或运算符:

A

B

A ^ B

1

1

0

1

0

1

0

1

1

0

0

0

 

移位运算符

      移位运算符操作的对象是二进制位,可以单独用移位运算符来处理int类型的整数,下边是概念表:

运算符

含义

例子

<< 

左移运算符,将运算符左边的对象向左异动运算符右边指定的位(在低位补0

x << 3

>> 

"有符号"右移运算 符,将运算符左边的对象向右移动运算符右边指定的位数。使用符号扩展机制,也就是说,如果值为正,则在高位补0,如果值为负,则在高位补1

x >> 3

>>> 

"无符号"右移运算 符,将运算符左边的对象向右移动运算符右边指定的位数。采用0扩展机制,也就是说,无论值的正负,都在高位补0

x >>> 3

计算机里面的原码、反码、补码

      只有有符号的整数才有原码、反码和补码 .正整数的原码、反码和补码相同

对于负整数在计算机内部是用补码表示 补码是它的反码加1

 

Java 流程控制

      java程序和普通程序运行流程一样,有三种运行顺序:顺序、循环和选择

1)             顺序: 最简单的。按顺序执行。

2)            选择:if语句;if’..else 语句; switch 语句

if语句:

               if语句的语法有两种:

               if(boolean表达式) 语句1;

                  if(boolean表达式){ 语句1;语句2;}

它所意味着的含义为如果boolean表达式的返回为true就执行语句1或者执行语句1所在的语句块{}内的内容:在使用if语句的时候,如果后边的语句块不带{},那么它能产生的效果只有紧跟着if的后边一句话(单条语句)。

           Switch语句:后边的括号里面的输入因子有类型限制

[1]int类型的变量
[2]short类型的变量
[3]char类型的变量
[4]byte类型的变量
[5]enum的枚举类型的变量【JDK1.5过后支持】

      对于switch语句  所有的输入因子在进入switch语句过后只匹配一次

3)             循环:whiledo-while循环;for循环

whiledo-while

while循环和do-while循环称为条件循环,也就是循环的终止条件为当判断语句为false的时候就终止循环,whiledo-while的区别在于不论条件判断返回false还是truedo-while语句至少执行一次,而while语句必须是当条件返回true的时候才会一次次执行

      语法规则为:

      while(布尔表达式){执行语句块}

      do{执行语句块}while(布尔表达式);

 

           for循环

      语法规则为:

      for(初始条件;判断条件;变化条件){执行语句块;}

      for(类型 变量:列表)

 

·                  一般情况下,whiledo-while循环主要用于无限循环,就是不知道循环次数,但是当终止条件满足的时候就退出循环

·                for循环一般是用于有限循环,就是已经知道了循环次数,当到达某种条件的时候退出

 

循环控制 break continue

      break的特征为:当循环遇到了break语句的时候,直接跳出本循环

   continue的特征为:当循环遇到了continue语句的时候,直接跳出本轮循环,进入下一次循环