闽公网安备 35020302035485号
a = val << 3; b = val >> 1;尽量减少对变量的重复计算
//反例
for (int i = 0; i < list.size(); i++) {
System.out.println("result");
}
//正例
for (int i = 0, length = list.size(); i < length; i++) {
System.out.println("result");
}
在list.size()很大的时候,就减少了很多的消耗。public String test1(List<String> list, int index) {
try {
return list.get(index);
} catch (IndexOutOfBoundsException ex) {
return null;
}
}
//堆代码 duidaima.com
//正例
public String test2(List<String> list, int index) {
if (index >= list.size() || index < 0) {
return null;
}
return list.get(index);
}
使用局部变量可避免在堆上分配public void test(String str) {
final int s = 100;
if (!StringUtils.isEmpty(str)) {
int result = s * s;
}
}
尽量采用懒加载的策略,在需要的时候才创建String str = "duidaima.com";
if (name == "堆代码") {
list.add(str);
}
if (name == "duidaima.com") {
String str = "堆代码";
list.add(str);
}
访问静态变量直接使用类名// 反例 int i = objectA.staticMethod(); // 正例 int i = ClassA.staticMethod();字符串拼接使用StringBuilder
//反例
public class StringTest {
@Test
public void testStringPlus() {
String str = "111";
str += "222";
str += "333";
System.out.println(str);
}
}
//正例
public class TestMain {
public static void main(String[] args) {
StringBuilder sb = new StringBuilder("111");
sb.append("222");
sb.append(333);
System.out.println(sb.toString());
}
}

//反例
for (int i = 1; i <= size; i++) {
Object obj = new Object();
}
//正例
Object obj = null;
for (int i = 0; i <= size; i++) {
obj = new Object();
}
第一种会导致内存中有size个Object对象引用存在,size很大的话,就耗费内存了Set<Map.Entry<String, String>> entryseSet = nmap.entrySet();
for (Map.Entry<String, String> entry : entryseSet) {
System.out.println(entry.getKey()+","+entry.getValue());
}
不要在多线程下使用同一个 Random public static void main(String[] args) {
ThreadLocalRandom threadLocalRandom = ThreadLocalRandom.current();
Thread thread1 = new Thread(()->{
for (int i=0;i<10;i++){
System.out.println("Thread1:"+threadLocalRandom.nextInt(10));
}
});
Thread thread2 = new Thread(()->{
for (int i=0;i<10;i++){
System.out.println("Thread2:"+threadLocalRandom.nextInt(10));
}
});
thread1.start();
thread2.start();
}
public class Test {
public int longAdderTest(Blackhole blackhole) throws InterruptedException {
LongAdder longAdder = new LongAdder();
for (int i = 0; i < 1024; i++) {
longAdder.add(1);
}
return longAdder.intValue();
}
}
程序中要少用反射反射的功能很强大,但它是通过解析字节码实现的,性能就不是很理想。现实中有很多对反射的优化方法,比如把反射执行的过程(比如 Method)缓存起来,使用复用来加快反射速度。
Java 7.0 之后,加入了新的包java.lang.invoke,同时加入了新的 JVM 字节码指令 invokedynamic,用来支持从 JVM 层面,直接通过字符串对目标方法进行调用。