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

时间:2022-01-19 11:50:40

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



数据类型 字节长度 范围 默认值 包装类
int 4 [-2147483648,2147483647]
(-2^31~2^31-1)
0 Integer
short 2 [-32768,32767] 0 Short
long 8 [-9223372036854775808,9223372036854775807]
(-2^63~2^63-1)
0L或0l Long
byte 1 [-128,127] 0 Byte
float 4 32位IEEE754单精度范围 0.0F或0.0f Float
double 8 64位IEEE754双精度范围 0.0 Double
char 2 Unicode[0,65535] u000 Character
boolean 1 true和false false Boolean
以上基本类型可以分为以下四种类型:

  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()方法都是不想等的。