1.finally和final的区别
finally,用于异常处理,通常会构成try,catch,finally的结构,无论是否抛出异常,finally都会执行。
finall关键词可以修饰类,方法和变量。
修饰类,类不可以被继承。修饰方法,方法不能被重写(覆盖)。修饰变量的时候,变量一旦赋值就不可更改,并且要初始化,在声明或者构造方法时。
2.sql注入
前提已知用户名,
操作,在后台进行拼接sql
SELECT * FROM users WHERE username = 'admin' AND password = '' OR '1'='1';
本质在于:and的优先级高于or的优先级, username = 'admin' AND password = ''(falese)
继续执行,username = 'admin' AND password = '' (false)OR '1'='1'(true),即false or true
最终结果,true,完成sql注入
如何避免sql注入
使用?作为占位符,原因是,将用户的输入作为纯数据处理
3.128陷阱
4.经典面试题128陷阱
package com.qcby.Demo;
public class Demo1 {
public static void main(String[] args) {
Integer a=100;
Integer b=100;
Integer c=200;
Integer d=200;
System.out.println(a==b);
System.out.println(c==d);
}
}

为什么一个是true,一个为false?
首先,明确==比较的是什么,在基本类型中,为值;在引用类型中,为内存地址。
其次,Integer.class中,有范围的限定-128~127

如果不在这个范围之内,则创建新的内存空间,如下代码

总结,a与b在范围之内,指向同一块内存空间
c和d不在范围之内,new开辟新的空间,不指向同一块内存空间
5.小测试题
package com.qcby.Demo;
public class Demo1 {
public static void main(String[] args) {
int a=10;
int b = 10;
Integer a1 = 10;
Integer b1 = 10;
Integer a2 = new Integer( 10);
Integer b2 = new Integer( 10);
System.out.println(a == b); // T 基本数据类型的对比 ==比较值是否相同
System.out.println(a1 == b1); // T 128陷阱
System.out.println(a2 == b2); // F new会开辟新内存
System.out.println(a1 == a); // T 包装类和基本数据类型对比时,包装类需要拆箱 ==比较值是否相同
System.out.println(a1.equals(a)); // T 包装类和基本数据类型对比时,包装类需要拆箱 equals方法的底层还是==
System.out.println(a1 == a2); //F开辟新地
System.out.println(a == a2); // T 自动拆箱
}
}
注意最后一个Integer与int比较,Integer自动拆箱,变为int类型,之后进行值比较
equals的底层实现为==


2357

被折叠的 条评论
为什么被折叠?



