Java-数据类型以及控制语句与c的不同

  • Java和c/c++不同的一点:Java使用的是Unicode编码,后两者是采用ASCII码,Unicode的编码表示的内容会更多,更全

数据类型

基本类型(primitive type)

  • 整数类型:byte、short、int、long
  • 字符类型:char
  • 浮点类型:float、double
  • 逻辑类型:boolean

引用类型(reference type)

  • 类类型
  • 接口类型
  • 数组类型

整数类型

int

  • 分配4字节内存,占32位
  • 取值范围: − 2 31 -2^{31} 231~ 2 31 − 1 2^{31}-1 2311 (-2147483~2147483647)
  • 十进制整数: 如123(默认为int型) 默认值:0
    十六进制整数:以0x或0X开头,如0x123表示十进制数291
    二进制:以0b或0B开头,如0b10000000 (JDK7开始支持)
    八进制:以0开头,如072

byte

  • 分配1个字节,占8位
  • 取值范围: − 2 7 -2^7 27~ 2 7 − 1 2^7-1 271
  • 强制转换:(byte)-12,byte(28)

short

  • 分配2个字节,占16位
  • 取值范围: − 2 15 -2^{15} 215~ 2 15 − 1 2^{15}-1 2151
  • 强制转换:(short)-12,short(28)
  • 表示:123L或123l 0L(默认值)

long

  • 分配8个字节,占64位
  • 取值范围: − 2 63 -2^{63} 263~ 2 63 − 1 2^{63}-1 2631
注意:

整数类型的值为有符号的二进制补码整数,因此 unsigned int m 的定义是错误的

字符类型

char

  • 分配2个字节,16位无符号整数

  • 取值范围: 0 0 0~ 65535 65535 65535,无负数

  • '' 单引号括起来

  • 使用Unicode字符集:

    • 一般格式:\u**** eg,\u0041 :A \u0061 :a
    • 观察Unicode表中的顺序位置用int强制转换
    • 表示Unicode表中的字符用char强制转换
  • 有些字符不能通过键盘输入到字符串或者程序中,需要通过转义字符常量
    eg,char ch1='\n',ch2='\"',ch3='\\' 依次输出换行,双引号,反斜线

  • 无符号语言,不允许使用unsigned

  • 在这里插入图片描述

  • 字符串用双引号,string不是原始类型,而是一个类(class)

    • eg:
String str =Hello\u0041\n”; // 定义一个字符串变量,初值为HelloA
char[] str =Hello;  // 编译错误,不支持字符串类型到字符数组类型的转换

浮点类型

float

  • 单精度
  • 分配4个字节,占32位
  • 取值范围: 1.4 E − 45 1.4E-45 1.4E45 ~ 3.4028235 E 38 3.4028235E38 3.4028235E38 − 3.4028235 E 38 -3.4028235E38 3.4028235E38 ~ − 1.4 E − 45 -1.4E-45 1.4E45
  • 常量:由数字和小数点组成,必须要有小数点453.5439f,21379.987F
  • float数据保留8位有效数字
  • 形式:float f=3.2f;或者float f=(float)3.2; 错误写法float f=3.2;

double

  • 双精度
  • 分配8个字节,占64位
  • 取值范围: 4.9 E − 324 4.9E-324 4.9E324 ~ 1.7976931348623157 E 308 1.7976931348623157E308 1.7976931348623157E308
    − 1.7976931348623157 E 308 -1.7976931348623157E308 1.7976931348623157E308 ~ − 4.9 E − 324 -4.9E-324 4.9E324
  • 常量:2389.539d, 2318908.987
  • double保留16位有效数字

逻辑类型(布尔类型)

boolean

  • 判断值只有true或者false,与c不同的地方在于,c中非0或者true是真,0或false是假,在Java中,只有true的时候为真,false的时候为假

通过程序检测数据类型的范围:

public class IntegerExample{
	public static void main(String[] args){
		System.out.println(Integer.MAZ_VALUE);
		System.out.println(Integer.MIN_VALUE);
	}
}

输出结果:

	  2147483647
	  -214748368

类型转换

为什么会有这么多的数据类型,这些数据类型的不同取值范围有什么意义?
不同类型的数据所占位大小不一样,通过不同数据类型的变量的占位计算出所需要内存的大小,在不同的情况下使用不同的数据类型可以尽可能的减少内存的浪费,同时可以计算出总值判断是否会出现类型溢出的问题,存在类型溢出的问题会导致程序存在bug
注意:

两个byte或者short整数相加,结果默认转化为int,赋值给byte和short时会发生类型转换的问题

public static void main(String[] args){
	byte b=27;
	byte c=26;
	byte d=b+c;//Type mismatch:cannot covert from int to byte
}

debug:

public static void main(String[] args){
	byte b=27;
	byte c=26;
	byte d=(byte)(b+c);//两个需要同时加()
	//只加byte只会将b转化为byte,c仍然是int,所以并不能纠正错误
	//byte不加()后面的加()也会报错 建议写代码检验
}
整数类型溢出问题
public static void main(String[] args) {
      int m = Integer.MAX_VALUE/2+1; //1073741824
      int n = Integer.MAX_VALUE/2+1;
      int overflow = m + n;
      System.out.println(overflow); //-2147483648
}

debug:

public static void main(String[] args) {
      int m = Integer.MAX_VALUE/2+1; //1073741824
      int n = Integer.MAX_VALUE/2+1;
      long normal = (long) m + n;
      System.out.println(normal); //2147483648
}
转换的原则:低级化高级!在这里插入图片描述
强制类型转化,高级数据要转换成低级数据,需要强制转化,否则会发生type mismatch错误
基本数据类型及其对应包装类

在这里插入图片描述

基本数据类型与包装之间的转化:

eg:

Integer varInteger=100;//自动装箱,JDK引入
等价于
Integer varInteger=Integer.valueof(100);
int varInt=varInteger;//自动拆箱
等价于
int varInt=varInteger.intValue();
  • 高频区间数据缓存问题:
Integer varInteger1 = 100 ;   //自动装箱
Integer varInteger2 = 100;
System.out.println(varInteger1 == varInteger2);
输出:true

Integer默认会在-128到127(高频数值)之间复用已有的缓存对象,以提高性能。

表达式

  • 二元运算符:instanceod(对象运算符) 其余和c相同
Java中的算术运算主要依赖于Math类的静态方法,例如:
  • 取绝对值:Math.abs(Type i),Type可以为int、long、float、double
  • 对数取三角和反三角函数、对数和指数、乘方、开方
  • 求两个数的最大最小值
  • 得到随机数(random(),类型为double)
  • 对浮点数进行处理:四舍五入(round)、ceil(取大值)(向上取整)、floor(取小值)(向下取整)
逻辑表达式注意

而利用“&&”和“||”执行操作时,如果从左边的表达式中得到操作数能确定运算结果,则不再对右边的表达式进行运算。采用“&&”和“||”具有“短路”效应,目的是为了加快运算速度

和c不同的控制语句

  • while循环中的条件只能是布尔值,不能是算数表达式
  • switch语句中有break和break lab(用户定义的标号)。前者跳出本次循环,后者跳出多重循环的外层循环 使用break lab语句必须在外循环入口语句的前方写上lab标号,可以使程序流程退出标号所指明的外循环
  • continue语句只能用于循环结构中,其作用是使循环短路。continue;(跳出本层的本次循环,继续本层下一次循环)continue lab;(跳出外层的本次循环,继续外层下一次循环)当程序中有嵌套的多层循环时,为从内循环跳到外循环,可使用带标号的continue lab语句。此时应在外循环的入口语句前方加上标号
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值