Java学习笔记---基本类型、运算优先级的一些知识整理

一、Java提供了8种原始数据类型,其对比见下表:



数据类型字节长度范围默认值包装类
int4[-2147483648,2147483647]
(-2^31~2^31-1)
0Integer
short2[-32768,32767]0Short
long8[-9223372036854775808,9223372036854775807]
(-2^63~2^63-1)
0L或0lLong
byte1[-128,127]0Byte
float432位IEEE754单精度范围0.0F或0.0fFloat
double864位IEEE754双精度范围0.0Double
char2Unicode[0,65535]u000Character
boolean1true和falsefalseBoolean
以上基本类型可以分为以下四种类型:

  1. int长度数据类型:byte(8bit)、short(16bit)、int(32bit),long(64bit)
  2. float长度数据类型:单精度(32bit float),双精度(64bit double)
  3. boolean类型变量的取值:true 、false
  4. char数据类型:unicode字符(16bit)
笔试题举例:

1、下列表达式争取的是()

A. byte b=128;   B.boolean flag=null; C. float f=0.9239; D.a=2147483648L;

答案是D.  C不正确的原因是因为会造成精度损失。因为0.9239是double型。正确的赋值应该是0.9239f。

2、String是基本的数据类型吗?

答案不是。见上表。

3、赋值语句float f=3.4正确吗?

答案不正确,原因见第1题。


二、不可变类。

先看段代码:

class ImmutableClass{
	private Date d;

	public ImmutableClass(Date d){
		this.d=d;
	}
	public void printState(){
		System.out.println(d);
	}
}
public class Test{
	public static void main(String args[]){
		Date d= new Date();
		ImmutableClass im = new ImmutableClass(d);
		im.printState();
		d.setMonth(5);
		im.printState();
	}

}


运行结果:

Sun Aug 03 17:41:47 CST 2015

Tue Jun 04 17:41:47 CST 2015

显然这不是我们想要的结果。正确的代码应该是什么样的呢?如下:

class ImmutableClass{
	private Date d;

	public ImmutableClass(Date d){
		this.d=(Date)d.clone();//去掉了引用关系
	}
	public void printState(){
		System.out.println(d);
	}
	public Date getDate(){
		return (Date)d.clone();
	}
}
public class Test{
	public static void main(String args[]){
		Date d= new Date();
		ImmutableClass im = new ImmutableClass(d);
		im.printState();
		d.setMonth(5);
		im.printState();
	}

}


运行结果:

Sun Aug 03 17:41:47 CST 2015

Sun Aug 03 17:41:47 CST 2015

对象应用导致上面的代码出现了状态改变的问题。设计时,要注意这些问题。

三、运算符的优先级

优先级运算符结合性
1. () [ ]从左向右
2+(正) -(负) ++ -- ~ !从左向右
3* / %从左向右
4+(加) -(减)从左向右
5<< >>(无符号右移) >>(有符号右移) 从左向右
6< <=  > >= instanceof从左向右
7==  !=从左向右
8&从左向右
9|从左向右
10^从左向右
11&&从左向右
12||从左向右
13?:从左向右
14 += -= *= /= %= &= =|= ^= ~= <<= >>= >>>=从左向右
举例:

public class Test{
	public static void main(String args[]){
	byte a=5;
	int b=10;
	int c=a>>2+b>>2;
	System.out.println(c);
	}
}


答案:0,相当于 a>>12>>2,a右移12位显然是0,再右移2位依然是0.

四、Math中几个函数

  1. Math.floor():向下取整,举例:Math.floor(5.8)的值为5.
  2. Math.ceil:向上去整,举例:Math.floor(5.3)的值为6;
  3. Math.round():四舍五入,举例Math.round(5.4)的值为5;

五、==、equals和hashCode有什么区别?

  1. ==运算符迎来比较两个变量的值是否相等。
  2. equals和==运算符一样,比较的是引用。但是equals方法是可以覆盖的。即用户可以覆盖对象的equals方法。
  3. hashCode()方法返回对象在内存中地址转换成的一个int值,所以如果没有重写这个方法,所有对象的hashCode()方法都是不想等的。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值