一、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 |
- int长度数据类型:byte(8bit)、short(16bit)、int(32bit),long(64bit)
- float长度数据类型:单精度(32bit float),双精度(64bit double)
- boolean类型变量的取值:true 、false
- 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中几个函数
- Math.floor():向下取整,举例:Math.floor(5.8)的值为5.
- Math.ceil:向上去整,举例:Math.floor(5.3)的值为6;
- Math.round():四舍五入,举例Math.round(5.4)的值为5;
五、==、equals和hashCode有什么区别?
- ==运算符迎来比较两个变量的值是否相等。
- equals和==运算符一样,比较的是引用。但是equals方法是可以覆盖的。即用户可以覆盖对象的equals方法。
- hashCode()方法返回对象在内存中地址转换成的一个int值,所以如果没有重写这个方法,所有对象的hashCode()方法都是不想等的。