i= 0;
1. i = i++;
2. b = i++ + i++;
要明白这两条傻逼语句的结果, 首先要明白->自增操作iinc
直接操作本地变量表
eg iinc 1,1
将index 1的位置变量 + 1; iinc
应该是针对add操作的优化
i++的语义为先将i参与运算, 再将i+1; 这里的”运算”比较特殊, 举例如下:(i = i)(++)
, 赋值是一个”运算”, 自增是一个”运算”, i先加入赋值运算中, 再进行自增运算; 编译成字节码为load-> iinc -> store
, 结果值为0b = i++ + i++
, 这里加法是一个运算, load_i将i加入到加法运算中(放到栈顶), 再自增. 编译成字节码为 load -> iinc -> load -> iinc -> add -> store
, b值为1b = i++ + ++i
, 编译成字节码为 load -> iinc -> iinc -> load -> add -> store
; b值为2
Integer a = 0, b = 40; |
(1) 首先a = Integer.valueOf(0), 进行自动装箱.
(2) b + a 会自动拆箱, 转化为int值计算.
(3) int优先级高于boxing(或者说, 非常容易导致unboxing), 将b拆箱比较
Integer a = new Integer(0); |
注意new Integer()内部不是调用valueOf()!!!
但是+还是存在拆箱
多路复用, 二进制分帧, ASCII码传输
字符串只支持set, swap操作, 求最少操作次数
source: ATTTAA, target:TTAATT, res = 3;
目前只想到暴力大法:public static int map(String source, String target) {
int res = 0;
int len = source.length();
StringBuilder sb = new StringBuilder(source);
for (int i = 0; i < len; i++) {
if (sb.charAt(i) == target.charAt(i)) continue;
boolean flag = false;
int j = i;
while (j < len && (sb.charAt(j) == sb.charAt(i) || sb.charAt(j) == target.charAt(j))) j++;
if (j != len) {
swap(sb, i, j);
} else {
假装set
}
res++;
}
return res;
}
n张中奖票, m张不中奖, A,B每次抽1张并看结果, B额外拿一张丢掉, 求A获胜率