&、|、&&、||
- &、|即使逻辑运算符又是位运算符,而&&、||只是逻辑运算符
- &&、||只是逻辑运算符,两边只能是bool类型
- &、|即使逻辑运算符又是位运算符,两边既可以是bool类型,也可以是数值类型
&、|不会短路。即:即使&、|前面的表达式结果已经决定了整个表达式的的结果,但是仍然会计算&、|后面的表达式结果
&&、||会产生短路
位运算符的运算规则(与&、或|、非^):
将两个表达式的值按二进制位展开,对应的值进行位运算。0&0=0; 0&1=0; 1&0=0; 1&1=1;
Static:
静态初始化块,静态变量这两个是属于同一级别的,是按代码写得顺序执行的!
实例初始化块:每次调用构造函数之前,先调用实例初始化块
静态代码块就执行流程:
(1)父类静态成员和静态初始化块,按在代码中出现的顺序依次执行。
(2)子类静态成员和静态初始化块,按在代码中出现的顺序依次执行。
(3)父类实例成员和实例初始化块,按在代码中出现的顺序依次执行。
(4)执行父类构造方法。
(5)子类实例成员和实例初始化块,按在代码中出现的顺序依次执行。
(6)执行子类构造方法。
父类(静态成员、静态初始化块)----->子类(静态成员、静态初始化块)---->父类(实例成员、实例初始化块)----->父类构造方法 -----> 子类(实例成员、实例初始化块)----->子类构造方法
finally:
必须执行的代码块,不管是否有异常产生,即使发生OutOfMemoryError也会执行,通常用于执行善后清理工作。
如果finally代码块没有执行,那么有三种情况可能:
1、没有进入try代码块。
2、进入try代码块,但是代码运行中出现了死循环或死锁情况。
3、进入try代码块,但是执行了System.exit()操作。
注意,finally是在return表达式运行后执行的,此时将要return的结果已经暂存起来,待finally代码块执行结束后再将之前暂存的结果返回。
finally代码块的职责不在于对变量进行赋值等操作,而是清理资源、释放连接、关闭管道流等操作。
相对在finally代码块中赋值,更加危险的做法是在finally块中使用return操作,这样的代码会使返回值变得非常不可控。
值传递、引用传递:
public class Example {
String str = new String("good");
char[] ch = { 'a', 'b', 'c' };
public static void main(String args[]) {
Example ex = new Example();
ex.change(ex.str, ex.ch);
System.out.print(ex.str + " and ");
System.out.print(ex.ch);
}
public void change(String str1, char[] ch1) {
str1 = "test ok";
ch1[0] = 'g';
}
}
输出结果为:good and gbc
new出来的对象放在堆中
赋值的变量值放在常量池中。
堆中存放的是所有变量、实例对象所指向值的地址。
Mybatis中#{}与${}
默认情况下,使用#{}格式的语法会导致 MyBatis 创建PreparedStatement语句属性并安全地设置值(比如?)。这样做更安全,更迅速,通常也是首选做法,不过有时你只是想直接在 SQL 语句中插入一个不改变的字符串。比如,像 ORDER BY,你可以这样来使用:
ORDER BY ${columnName}
#{}解析为JDBC预编译语句(PreparedStatement)的参数标记符(?)
${}仅仅为一个纯粹的字符串替换
-
为了性能的考虑,相同的预编译sql可以重复使用。
-
${}在预编译之前就被变量替换了,这样就会存在sql注入的问题
PreparedStatement如果是字符串?会自动加上引号,如果是整数就不做处理。表名和order by之后的列名不能加单引号,所以当表名或者order by为变量是,必须要用${}
#和$在like中使用: where name like '%张%'
MySQL的 CONCAT()函数用于将多个字符串连接成一个字符串,是最重要的mysql函数之一。
CONCAT(str1,str2,j
如果使用模糊查找:concat('%', #{name}, '%')