您的位置:首页 > 编程语言 > Java开发

【JavaSE】常见的错误点总结1

2017-11-03 15:41 204 查看

1.基本数据类型

按字节大小分别为:

类型字节数位数
byte1字节8位
char2字节16位
short2字节16位
int4字节32位
float4字节32位
long8字节64位
double8字节64位
Boolean按1字节处理true/false
注意以下几点:

1.1 int类型可以完全包含char类型:如int a=’好’;

1.2 char与short的字节长度一样,但是数值范围不一样,char:0~65535,short:-32768~32767,二者之间转换都需要进行强转。

char c='1';
//char转short
short i=(short) c;
//short转char
char c1=(char) i;


1.3 Java默认的整形为int,给long型赋值需要加后缀L;默认实数类型为double,给float类型赋值需要加f。如 float f=0.2;会报错!应改为:float f=0.2f;

1.4 不同数据类型的运算,运算结果是范围最大的那个数据类型,如3*0.1结果为double。

1.5 低级变量向高级变量转换时需要强转,强转可能会造成精度下降内存溢出等情况;高级变量向低级变量转换时自动转换

1.6 无论在Linux还是Windows上这些数据的字节长度和位数均不变,这是因为Java是和平台无关的语言。

1.7 Java中默认的编码方式为Unicode,一个Unicode码元占2个字节,char类型的变量也占两个字节,因此可以用char存一个汉字。

2.位运算

位运算的思路在于将现有的数制转为二进制进行运算。

十进制二进制
20010
40100
2&4=0(11得1,其余均为0)

2|4=6(00得0,其余均为1)

2^4=6(相同为0,不同为1)

右移>>(等同于除以2) 左移<<(等同于乘以2) >>>(无符号右移,高位均已0补齐)

3.break与continue

continue:结束本次循环进入下一次循环。

break:结束并跳出本层循环,如果有外层嵌套循环可以用标记进行跳出外层循环。

//跳出外层i循环
x:
for(int i=0;i<10;i++){
for(int j=0;j<10;j++){
break x;
}
}


4.switch分支语句中的参数类型

JDK7之前支持byte、char、short、int以及枚举类型,JDK7及其以后又支持了String类型。

枚举类型即为自己定义的类型:

//定义枚举
public enum SSS{
A,B,C,D
}


//使用枚举类型
SSS[] values = SSS.values();
switch (values[0]) {
case A:
System.out.println("111111");
break;
case B:
System.out.println("222222");
break;
default:
System.out.println("333333");
break;
}


5.this与super区别

第一点:this.和super.的用法

一是表示当前对象;二是当方法的形参与实例变量同名时用this.实例变量来区分。

class Person {
private int age = 10;
public Person(){
System.out.println("初始化年龄:"+age);
}

public int GetAge(int age){
this.age = age;//用this.实例变量名来区分形参
return this.age;
}
}


一是表示super.父类方法名或变量名;二是当子类和父类的变量名和方法名同名时,用super.父类方法名或变量名来区分子类的。

//父类
class Country {
String name;
void value() {
name = "China";
}
}
//子类
class City extends Country {
String name;
void value() {
name = "Shanghai";
super.value();      //调用父类的方法
System.out.println(name);
System.out.println(super.name);//调用父类的变量
}


第二点:this()和super()的用法

前者表示调用了本类的构造器;后者调用的是父类的构造器。

6.异常处理中throws与throw的区别

二者都是异常处理的关键字。

throw用在方法体内,后面是new +异常对象,表示产生了一个异常对象。

throws用在方法的声明后,后面是异常的类型,表示该方法可能抛出的异常。

//throw的用法
void t1() {
//非检查异常类型:不需要配合throws往上抛
throw new NullPointerException();
}


//throws的用法
void t2()throws ClassCastException{
System.out.println("====");
}


void t3() throws SQLTransientException {
//检查异常:必须配合使用throws往上抛或者用try-catch捕捉异常
throw new SQLTransientException();
}


void t4(){
//检查异常:必须配合使用throws往上抛或者用try-catch捕捉异常
try {
throw new SQLTransientException();
} catch (Exception e) {
e.printStackTrace();
}
}


7.finally和return的执行关系

首先要明白return语句的执行原理:

例如:return x+y;

这句代码先执行x+y,再执行return;先执行将x以及y从局部变量区复制到操作数栈顶,然后执行加法指令,这个时候结果x+y的值会保存在操作数栈的栈顶,最后执行return指令,返回操作数栈顶的值。

重要结论1: return指令只是用来负责返回栈顶值的!

接着分析含有finally语句的执行顺序:

如下面这段代码:

try{

return expression;

}finally{

do some work;

}

首先我们知道,finally语句是一定会执行,但他们的执行顺序是怎么样的呢?他们的执行顺序如下:

1、执行:expression,计算该表达式,结果保存在操作数栈顶;

2、执行:操作数栈顶值(expression的结果)复制到局部变量区作为返回值;

3、执行:finally语句块中的代码;

4、执行:将第2步复制到局部变量区的返回值又复制回操作数栈顶;

5、执行:return指令,返回操作数栈顶的值;

我们可以看到,在第一步执行完毕后,整个方法的返回值就已经确定了,由于还要执行finally代码块,因此程序会将返回值暂存在局部变量区,腾出操作数栈用来执行finally语句块中代码,等finally执行完毕,再将暂存的返回值又复制回操作数栈顶。所以无论finally语句块中执行了什么操作,都无法影响返回值,所以试图在finally语句块中修改返回值是徒劳的。因此,finally语句块设计出来的目的只是为了让方法执行一些重要的收尾工作,而不是用来计算返回值的。

重要结论2: finally语句是在try中return之前执行的!

特别注意: finally语句块中含有return语句时会将try块中的return返回值覆盖掉,根据上面的执行过程可知。另外是强烈不推荐在finally语句块中使用return语句的,因为eclipse会报warning:“finally block does not complete normally”。

protected static int t5(int a,int b){
try {
System.out.println("return语句的执行");
return a+b;
}finally{
System.out.println("finally总会执行");
return a+b+1;
}
}


//测试
public static void main(String[] args) {
System.out.println(t5(1,2));
}
//输出结果:
return语句的执行
finally总会执行
4


8.在PL/SQL中写一个9*9乘法表

begin
for i in 1..9 loop
for j in 1..i loop
dbms_output.put_line(j||'*'||i||'='||j*i||'   ');
end loop;
dbms_output.put_line('');
end loop;
end;


9.==、equals方法和hashCode方法

首先要搞清楚以下几个问题?

9.1 ==,equals方法,hashCode都是干什么的?

==是比较运算符,基本数据类型比较的是值是否相等;引用类型比较的是两个对象的引用(内存地址)是否相同。

equals方法是Object类的方法,没有重写的equals方法的类中和==使用是一样的;被重写的类中,比较的是两个对象的内容是否相同。

hashCode方法也是Object类的方法,被用来获取给定对象的唯一整数,返回这个对象存储的内存地址的编号。

9.2 为什么要重写equals方法?怎么重写?

没有重写equals方法时,比较对象的内存地址是否相同,然而需要进行基于对象特征的计较时,重写equals方法很有必要。

参考String等重写了equals方法的类。

orm中重写equals时注意变量懒加载的问题,最好使用get/set方法进行比较

9.3 为什么重写equals方法时为什么要同时重写hashCode方法?

有关hashCode作用继承参考以下文章:

http://c610367182.iteye.com/blog/1930676

http://blog.csdn.net/fenglibing/article/details/8905007

10.集合泛型与原始类型的区别?

泛型被设计出来的主要目的是为了Java类型的安全。

例如:

List lists=new ArrayList();
List<String> lists=new ArrayList<String>();


原始类型进行编译时不进行安全检查,可以接受任何带参数的类型。集合泛型在编译期间会进行安全检查,并告知编译器接受的类型为String类。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java se 总结