java语言学习历程小结(四)

来源:互联网 发布:visio软件结构图 编辑:程序博客网 时间:2024/05/16 01:37

数据结构

1 内存模型

数据如何在计算机中存储?

内存直观理解:

 

任何类型的数据在计算机中都是以二进制的01保存的。计算机之所以选择二进制,因为有通电和断电俩种状态决定的。计算机最大的优点就是不怕运算复杂,任何数据都可以换算成二进制来运算。

 

内存还可以理解为容器,多大的容器装多大的东西。内存这些格子是相同的。如果一个格子放不下的话,可以将相邻的格子打通。

为了让内存不浪费,也不溢出,就产生了数据类型。

 

任何编程语言,比如java,肯定是要操作内存的,读和写。写的时候你最好告诉内存,你数据体积大概多大,需要我内存给你打通多少个格子来存你的东西。存进去的东西如何访问呢?存东西的时候,就起个名字标示你东西存放的那块内存。这个名字就叫变量,通过变量就可以找到某块内存,就可以对该内存进行读写。

 

数据体积大概多大=========数据类型

变量命名:只要是合法的标识符就可以。

数据类型就多了,每门编程语言首先学的很重的就是数据类型。

 

也可以先声明变量(声明变量意味着内存中会划出来一块内存供变量使用),然后往变量代表的内存中放东西。也就是数据。

 

不能理解内存,不能理解二进制,进制转换,学不好编程。

案例:int a = 10;//声明一个int数据类型的变量,并且往该变量代表的中存入数据10.

从内存理解以下公式:打通相邻盒子

 1Byte = 8b;   

 1Kb = 1024 b; 210次方1KB

 1Mb = 1024 kb; 220次方 1MB

 1Gb = 1024Mb; 230次方 1GB

 1Tb = 1024GB; 240次方 1TB

 

2  java数据类型

内存中可以存放两种类型的数据:

一种直接放值,一种放内存地址。在高级语言当中被称为指针,引用。(也就是值类型和引用类型

  

Java的数据类型分为两种:基本数据类型和引用类型。

 

基本数据类型:48

整数型

byte1个字节     -128~127

short2个字节     -32768~32767

int  4个字节     。。。

long 8个字节     。。。

浮点数型

 float4个字节

 double8个字节

 

字符型

char 2个字节

 

Boolean

boolean 1Bit true false

 

引用数据类型

            

            数组

            接口

 

a整数详解

整数的表现形式:可以使二进制的,十进制的,8进制的 16进制的。

int int1 = 012;//8进制数 以0开头

  System.out.println("int1的值是--->"+int1);

 

    int int2 = 0x12;//16进制数,以0x开头     

    System.out.println("int2的值是--->"+int2);//值为18

    

    int int3 = 0b1001;//2进制 以0b开头 jdk1.7才支持的特性

   System.out.println("int3的值是--->"+int3);

 

整数常量默认是int类型.如果想要声明long类型的变量,需要在整数后加Ll。建议L。因为l1很难分清。

 

案例: Demo_01_整数测试.java

long lon = 2147L;

 

计算机内部存储整数最高位是符号位 0代表正数,1代表负数。

 

所有运算实际是基于补码运算的。

 

原码:直接换算成的二进制就是原码。

 

反码:原码除了符号位,全部取反。

 

补码:对于正数 原码就是补码。

     对于负数,补码 =反码+1;

   

 

 

解释:345=256+64+16+8+1转换为二进制为1 0 1 0 1 1 0 0 1(原码)由于1byte=8bit,多出来一位溢出,所以把最高位去掉。剩下来 0 1 0 1 1 0 0 1(补码),对于正数 原码就是补码。最高位为0所以为正数。转换成十进制为89

 

同理385=256+128+1转换为二进制是1 1 0 0 0 0 0 0 1(原码),溢出,把最高位去掉,剩下1 0 0 0 00 0 1(补码),因为最高位是1,所以为负数,又由于对于负数,补码 =反码+1;所以得出的反码为1 00 0 0 0 0 0(反码),然后转换成原码就是1 1 1 1 1 1 1 1(最高位即符号位不管,其他转换即可)。换算成十进制数为-127(最高位不算)

b.浮点数详解

 支持小数.

 

 表现形式:两种

10进制表示 5.12512

科学计数法 3.14e2

 

 小数常量默认是double类型。如果要声明float变量必须在小数后加Ff

 实际应用的时候double用的多,因为其表示的范围更大,也更精确。

 浮点数有3个特殊值:

正无穷大:正小数除以0得到的是正无穷大,所有正无穷大都相等。

负无穷大:负小数除以0得到的是负无穷大,所有负无穷大都相等。

非数:0除以0得到非数,非数和自己都不相等。

   

案例 Demo_02_浮点数.java  

 

double d1 = .12;//.12没有问题

    System.out.println("d1的值是--->"+d1);

    

    double d2 =3.14e2;//314.0而不是314

    System.out.println("d2的值是--->"+d2);

 

    float f1 = 3.14f;

    System.out.println("f1的值是--->"+f1);

 

    double d3 = 0.0/0;//返回结果是非数,非数和自己都不相等

    double d4 = 3.14/0;

double d5 =1000.0/0;

 

    System.out.println(d3==d3);//==判断相等;=赋值

//System.out.println(d4==d5);//返回结果为true,都是正无穷大。

    

 

c char类型详解

char是字符类型 ,特点是单引号括起来的一个字符。

 

表现形式三种:

    1)char a = ‘a’;

2)char b = ‘’;

    3)转义字符: \r\n\t\\\” \’。。。

    例:aa = ‘\t’;//tab

    例如在控制台打印:你好美女”!

      public class NiHao{

            public static void main(String[] args){

             System.out.print("你好,\"美女\"");

//输出带双引号的内容

   }

}

                       

char c4 = '\u0032'; //‘2’

    解释:‘\u0032’为16进制数,转换成十进制是2*160+2*161=50,又因为char ’0’对应的十进制是48,所以50对应的char类型是‘2’。

    

一个字符占2个字节,一个字节8bit。一个16进制数等于4个二进制的数。所以一个字符可以用416进制的数表示。

例如:八个二进制数1001 0001,把它转换成16进制时,合四为一也就是1001|0001分开计算,前半部分是:1*20+1*23=9,后半部分:1*20=1,所以转换后的十六进制数是91

二进制转换成八进制就是合三为一。位数不够,就左边往左加零;右边往右加零。

 

Java字符因为2个字节,总共65536种状态,并且最高位不是符号位,所以字符一共可以有65536个,都是正整数0~65535

 

练习:产生4位随机验证码(A~Z)用于注册或登录。

 

 

public class Demo_04_验证码测试{public static void main(String[] args){//循环两点核心:循环次数如何定,每次循环做什么for(int i = 0 ;i<4 ;i++){Random rand = new Random();//随机数类 用的时候必须实例化int a = rand.nextInt(25);//产生一个0~25的随机数                        // System.out.print(a);//输出0-25之间的任意一个数System.out.print((char)(a+65));//输出A-Z之间的任意一个字母。}}

 

注:‘a’转换为十进制是97

   ‘A’转换为十进制是65;

   ‘0’=48//字符零转换为十进制是48

   \u0042//16进制数转换为字符型是B66=2*160+4*161

d Boolean类型详解

 

Boolean1bit

 

取值也是字面值,truefalse

 

应用场景:经常在判断条件中使用

 

例如

if(2>1){

 System.out.println(t)//如果2>1表达式返回true则执行此行代码

}

 

 类型的转换

 1.java是一种强类型的语言,也就是变量必须有数据类型,变量赋值时候必须要考虑类型是否匹配。通俗说就是多大的容器装多大的东西。变量类型不能改变。

       int a = 10 ;

       double a = 21.2;//a不能改变类型

       这也是java安全性好的一个原因。编译期间内就会检查匹配。运行起来出错机会就少了。

2.类型转换分为2种:

讲类型转换的时候,我们最好把基本类型重新划分一下:48种换成2类。一类数值型,一类boolean型。

 

a)     自动类型转换(放不满)

表述范围小的可以自动转换为表述范围大的。

 Byte---àshort-àint-àlong-àfloat--àdouble

Char

 Byteshort不能转成char类型,因为在它们的范围内存在负数

 Char能自动转成 int

 Int需强制转换成char类型

 

 所有数值型都可以自动转换为double

 所有的整数都可以自动转换为long.

 转的时候看的是声明时候的类型而不是实际存储的值你认为的类型 。

 

b)     强制类型转换(可能放不下)

表述范围大的必须强制转换表述范围小的。因为有能溢出。不一定溢出但是有可能就不行。必须强转。

 

          比较形象的一个例子:一个小盒子可以很自然的放进大盒子里,但是大盒子不能放进小盒子里,如果一定要放的话只能强制把它变小,就OK了。          byte b2 = 24;//24默认是int型,但是由于是直接赋值,并且该值在byte short范围内,那么系统就将其当做byte,或short来用,不用强转。

原创粉丝点击