2.java中的数据类型与运算符入门

第1节:数据类型概述

划分数据类型的意义

  • 如果不把数据划分为不同的类型,那么就没有办法区分出数据之间的差别;
  • 计算机可以根据不同的数据类型,把数据“合理”地存放到内存中;
  • 计算机从内存中读取数据时,也可以根据其数据类型就能确认取到的数据的特征,从而正确地去处理;

Java的数据类型树

Java语言的数据类型有两种,即基本数据类型和引用类型
java的数据类型数

堆、栈、常量池、方法区

堆栈

  • 在函数(方法)中定义的基本数据类型变量存储在栈中;
  • 引用类型实例的引用(reference)也是存储在栈中;
  • 引用类型实例的成员变量,存储在堆中;
总结提问
  • 为什么要划分数据类型?答: 划分数据类型的意义
  • Java的数据类型分哪两种?答:基本数据类型和引用数据类型
  • Java的类型信息存储在哪个内存逻辑区?答:方法区
  • main方法中定义了int i=1;请问这个1存储在内存哪个区?答:栈

第2节:基本数据类型

基本数据类型的分类
  • Java语言中的基本数据类型可以分为数值型、字符型、布尔型三大类,具体包 含8个类型;
    基本数据类型
每种具体类型的长度及特点
  • 每种数据类型在内存中占有不同的长度;
  • 计算机存储设备的最小信息单元叫“位(bit)”,又称之为“比特位”;
  • 连续的8个位成为1个“字节(byte)”;
  • 操作系统分配内存最少1个字节,即8 个位,而不是1个位;
  • 长度越长,所表示的范围就越大;

基本数据类型长度

每种具体类型的默认值
  • 每种具体类型都有不同的默认值;
  • 当没有为一个属性变量赋值时,会根据类型为其赋值为默认值;
    默认值
总结提问
  • Java语言中有哪几种基本数据类型? 答 :byte、short、int、long、float、double、char、boolean
  • 每种基本数据类型的长度是多少,默认值是什么? 答:默认值
  • 不同的基本数据类型之间是否可以转换,转换规则是什么?答:可以; 从表示范围小的类型转换为表示范围大的类型,可以直接转换;从表示范围大的类型转换为表示范围小的类型,需要强制转换;数值类型和boolean类型之间就不能转换;强制也不可以;
  • 如何对基本数据类型的值进行比较运算? 答:可以使用==、!=、>、<、>=、<=对基本数据类型的数值进行比较运算。
  • 常量10默认为什么类型?常量1.2默认为什么类型?答: int double
本节总结
  • Java语言中有8种基本数据类型,分为数值、字符、布尔三大类;
  • 每种数据类型有不同的长度,最小长度是1个字节,即8位;
  • 每种数据类型都有默认值,需要注意的是boolean的默认值是false;
  • 数据类型之间可以互相转换,表示范围小的可以直接转换到表示范围大的类型;反 之不可以,需要强制转换;
  • 所有基本数据类型都可以使用=直接赋值,需要注意不要超过表示范围;
  • 可以使用==、!= 、>、<、>=、<=对基本数据类型的数值进行比较运算;比较 的是其二进制的值;
  • Java中默认的整数类型是int,默认的小数类型是double ;

第3节:引用类型概述

引用类型和基本数据类型的差异

除了8种基本数据类型,其他类型都是引用类型;
在这里插入图片描述

  • int a=10; a是基本数据类型
  • Date d=new Date(); d是引用类型
引用类型的赋值及比较运算
  • 引用类型使用=赋值;
  • 除了String、包装器类(共8个)外,都需要使用new 关键字;
  • 引用类型可以使用==、!=进行比较,比较的是引用类型的地址,不是内容;
  • 引用类型不能使用>、>=、<=、<进行比较;
//声明两个引用类型变量s1、s2,并使用new进行赋值
String s1=new String("Hello");
String s2=new String("Hello");
//使用==及!=比较s1和s2的地址
System.out.println("s1==s2"+s1==s2);
System.out.println("s1!=s2"+s1!=s2);

s1==s2比较的是栈中s1和s2的值,由于s1和s2指向堆中不同的内存空间,所以s1和s2的值不同。因此比较返回false;

null
  • 当只声明了一个引用类型变量,却没有为其赋值,则此时该变量为null;
public class Item0301 {
static String s;
public static void main(String[] args) {
System.out.println(s);
}
}
S只是存储在栈中的一个变量,并没有为其赋值,没有指向堆中的任何实际内容,目前值为null
总结提问

• 基本数据类型和引用类型在内存存储上有什么区别?
• 使用 == 比较基本数据类型比较的是什么?
• 使用 == 比较引用数据类型比较的是什么?
• 能不能用>比较引用类型?
• 引用类型变量如果只声明没有赋值,变量默认值是什么?
• 除了类(class)是引用类型外,JDK1.5后又增加了哪些新的类型?

本节总结

• 基本数据类型存储在栈中,引用类型的引用存储在栈中,具体内
容存储在堆中;
• 引用类型只能使用==及!=,不能使用>、<等,比较的是地址,
也就是引用的值;
• 引用类型如果没有赋值,默认是null;
• JDK1.5后,增加了枚举、注解,后续详细学习;

第4节:包装器类型

包装器类型的概念及作用

• Java语言中有8个基本数据类型,对应有8个类,这8个类统称包装器类型(Wrapper类);
• 使用这8个包装器类,能够把某一种基本数据类型的变量转换成引用类型,从而使用类中的方法,进行更多的操作;
包装器

自动装箱拆箱

• 装箱:基本数据类型转换为包装器类型,称为装箱(boxing);例如,int型转换为Integer类型;
• 拆箱:包装器类型转换为基本数据类型,称为拆箱(unboxing);例如Integer类型转换为int类型
• JDK1.5以后,装箱拆箱可以自动进行;例如:

//传统的装箱、拆箱
int a=128;
Integer ao1=new Integer(a);
int b1=ao1.intValue();
//自动装箱
Integer ao2=a;
Integer ao3=128;
//自动拆箱
int b2=ao2;
int b3=ao2+ao3
自动装箱拆箱中的池操作
  • 在自动装箱拆箱过程中,Java使用到了常量池;
  • 如下代码所示,i1、i2使用到了自动装箱,io1和io2则没有使用

Integer i1=10;
Integer i2=10;
Integer io1=new Integer(10);
Integer io2=new Integer(10);
System.out.println("i1==i2"+(i1==i2));
System.out.println("io1==io2"+(io1==io2));

• i1 i2使用到常量池,io1、io2没有使用
i1 i2使用到常量池,io1、io2没有使用;
• i1和i2的值都是10,所以指向常量池中
相同的空间;因此i1 == i2返回true;
• io1和io2使用new创建赋值,所以分别
指向堆中不同的空间,因此io1 == io2返
回false;
在这里插入图片描述

第5节:字符串类型

Java中的字符串的final特征
  • 使用了final修饰,意思是不能被扩展,不能被修改
StringBuffer及StringBuilder与String的区别
  • Java语言中的有一个StringBuffer类,称为字符串缓冲区;所表示的也是一个字符序列;
  • Java语言中的还有一个StringBuilder类,与StringBuffer兼容,但是不保证线程 同步;

三个类的区别

  • String类是不可变的,对象一旦被创建,就不能被修改;可以使用=直接赋 值,此时使用常量池;也可以使用new创建,不使用常量池;
  • StringBuffer是可变的,对象创建后,可以修改;必须使用new关键字;
  • StringBuilder是不同步的,在单线程情况下使用比StringBuffer高效;必须使 用new关键字;
总结提问
  • 字符串类用哪个关键字修饰,从而使其不能扩展? finally
  • String类不可变性如何理解? 再次给string赋值,String指向一个新的地址,而不是改变自己。
  • =直接对字符串赋值和使用new赋值,有什么区别? =对字符串赋值是指向常量池,new赋值是在堆中开辟一个新的地址。
  • String/StringBuffer/StringBuilder三个类有什么区别?
    三个类的区别
本节总结

• 字符串类用final进行了修饰,所以不能扩展;
• 字符串有不可变性,只要创建,就不能被改变;
• 用+可以连接两个字符串;
• 字符串使用到了常量池,多个引用可以共享同一个字符串;但是使用
new创建的字符串不使用常量池;
• StringBuffer也表示一个字符串,不过是可变的;
• StringBuilder类的方法跟StringBuffer一样,不过是不同步的,在单线
程情况下更高效;

第6节:数组

数组的概念与作用

• 数组是一组类型相同的数据的集合;
• 也就是说,数组中可以存储多个数据,但是这些数据的类型必须相同;
• 数组能够作为数据的容器使用,把多个数据集中存储;
• 存储在数组中的数据,都有相应的索引值,可以方便获取或修改;
• 当需要同时保存多个类型相同的变量并进行处理时,可以考虑用数组,

Java中的数组特性

• Java的数组是引用类型;
• 数组与类、接口、枚举、注解并列,是引用类型中的一种;
• Java的数组长度一经确定不能改变;
• 数组在内存中是连续分配,所以读取速度快

数组元素

• 数组中存储的数据称为数组的元素(Element);
• 数组本身是引用类型,但是数组中的元素可以是基本数据类型,也
可以是引用类型;
• 数组中的元素有索引值,索引值从0开始

基本类型或字符串一维数组的声明与初始化
  • 一维数组的声明形式
数组元素类型[ ] 变量名称;
或
数组元素类型 变量名称[ ] ;
例如:
int[] a;int a[];
String[] s; 或 String s[]

• 不论数组中元素是什么类型,以上声明形式都适用;

  • 一维数组的初始化
第一种:数组元素类型[ ] 变量名称=new 数组元素类型[数组长度];
第二种:数组元素类型[ ] 变量名称=new 数组元素类型[]{用逗号隔开元素的具体值};
第三种:数组元素类型[ ] 变量名称= {用逗号隔开元素的具体值};

//a1的长度为5,元素的值为默认值0
int[] a1=new int[5];
//a2的长度为3,元素的值为1,4,10
int[] a2=new int[]{1,4,10};
//a3的长度为4,元素的值为34,23,4,10
int[] a3={34,23,4,10};

在这里插入图片描述
• 数组是引用类型,a保存数组的首地址,指
向堆中数组的具体内容;
• 数组元素使用索引表示,如a[0]、a[1]……

数组的长度

• 在创建数组的时候,一定要确定数组的长度;
• 数组的长度将在初始化数组元素的时候同时初始化到内存中;
• 使用 数组变量名.length 可以返回数组的长度;

int[] a1=new int[5];
int[] a2=new int[]{1,4,10};
int[] a3={34,23,4,10};
System.out.println("a1的长度:"+a1.length);
System.out.println("a2的长度:"+a2.length);
System.out.println("a3的长度:"+a3.length);
一维数组遍历
int[] a=new int[]{1,2,10};
//使用for循环遍历
for(int i=0;i<a.length;i++){
System.out.println(a[i]);
}
//使用增强for循环遍历
for(int x:a){
System.out.println(x);
}
数组排序

• Java API中有一个类 Arrays,定义了大量的sort方法,可以对数组中元素进行排
序;

int[] a=new int[]{12,3,90,1,2,10};
//使用API中的Arrays类的sort方法可以排序
Arrays.sort(a);
for(int x:a){
System.out.println(x);
}
总结提问
  • 数组有什么作用?
  • Java语言中的数组有什么特点?
  • 如何声明并创建数组?
  • 如何遍历数组?
  • API中哪个类提供了数组排序方法?
  • 如何声明一个二维数组?
本节总结

• Java中的数组是与类、接口、枚举、注解并列的一种引用类型;
• 数组中的元素必须类型相同,可以是基本数据类型,也可以是引用类型;
• 建议使用int[] 形式声明数组,或者二维数组int[][];
• 创建数组的时候,要么直接赋值,要么指定长度使用默认值;
• 数组的长度一旦被确定,不能再修改;
• 数组长度是一个属性,用length表示;
• 可以使用for循环遍历数组;本章作为了解;
• Arrays类的sort方法提供了数组排序的方法;本章作为了解;

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值