java中的数据类型与运算符入门
第1节:数据类型概述
划分数据类型的意义
- 如果不把数据划分为不同的类型,那么就没有办法区分出数据之间的差别;
- 计算机可以根据不同的数据类型,把数据“合理”地存放到内存中;
- 计算机从内存中读取数据时,也可以根据其数据类型就能确认取到的数据的特征,从而正确地去处理;
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方法提供了数组排序的方法;本章作为了解;