ARTS-0

Algorithm

  • leetcode 300: Longest Increasing Subsequence

代码地址:https://github.com/Lazy-Lion/Algorithm/blob/master/java/src/dynamicprogramming/LongestIncreasingSubsequence.java

  • leetcode 44: Wildcard Matching

代码地址: https://github.com/Lazy-Lion/Algorithm/blob/master/java/src/dynamicprogramming/WildcardMatching.java

Review

Strings, Literally
文章介绍了java 中String字面量以及String对象的一些知识点。

针对String字面量进行如下的代码测试 (JDK8):

public class StringTest {
    static String temp3 = "CD";
    final static String temp4 = "CD";
     
    public static void main(String[] args) {
         
        String s1 = "ABCD";
        String s2= "A" + "B" + "C" + "D";
         
        String temp = "CD";
        String s3 = "AB" + temp;
         
        final String temp2 = "CD";
        String s4 = "AB" + temp2;

        String s5 = "AB" + temp3;
         
        String s6 = "AB" + temp4;
         
        String s7 = "AB" + get();
         
        String s8 = "AB" + getF();
         
        //tip: 编写代码System.out.println("s1 == s2 ? " + s1 == s2); 漏写括号,
        //导致输出的是"(s1 == s2 ? " + s1) == s2" 的结果
        System.out.println("s1 == s2 ? " + (s1 == s2));  
        System.out.println("s1 == s3 ? " + (s1 == s3));
        System.out.println("s1 == s4 ? " + (s1 == s4));
        System.out.println("s1 == s5 ? " + (s1 == s5));
        System.out.println("s1 == s6 ? " + (s1 == s6));
        System.out.println("s1 == s7 ? " + (s1 == s7));
        System.out.println("s1 == s8 ? " + (s1 == s8));
    }
     
    public static String get(){
        return "CD";
    }
     
    public final static String getF(){
        return "CD";
    }
}

对上述代码进行反编译:

public class StringTest {
    static String temp3 = "CD";
    static final String temp4 = "CD";
 
    public static void main(String[] args) {
        String s1 = "ABCD";
        String s2 = "ABCD";
        String temp = "CD";
        String s3 = "AB" + temp;
        String temp2 = "CD";
        String s4 = "ABCD";
        String s5 = "AB" + temp3;
        String s6 = "ABCD";
        String s7 = "AB" + get();
        String s8 = "AB" + getF();
        System.out.println("s1 == s2 ? " + (s1 == s2));
        System.out.println("s1 == s3 ? " + (s1 == s3));
        System.out.println("s1 == s4 ? " + (s1 == s4));
        System.out.println("s1 == s5 ? " + (s1 == s5));
        System.out.println("s1 == s6 ? " + (s1 == s6));
        System.out.println("s1 == s7 ? " + (s1 == s7));
        System.out.println("s1 == s8 ? " + (s1 == s8));
    }
 
    public static String get() {
        return "CD";
    }
 
    public static final String getF() {
        return "CD";
    }
}

可以看到,对于"+"连接,编译期间存在部分优化:

  • "+" 直接连接多个字面量,编译期间优化成一个字面量
  • "+" 连接字面量和final变量,编译期间优化成一个字面量
  • "+" 连接字面量和非final变量,不优化
  • "+" 连接字面量和方法返回值,不优化

Tip

工作中遇到为了去除重复数据而使用TreeSet的场景

TreeSet set = new TreeSet<>();

java中的Set一般都是通过Map实现,使用TreeSet的无参构造方法实例化一个对象时,实际上是通过TreeMap实现的,这时泛型对象K必须是实现了Comparable接口的对象。TreeMap的put方法进行大小比较时,先判断是否传入外部比较器(Comparator),如果没有则使用K类的Comparable接口实现,而无参构造器实例化时是没有外部比较器的。

Share

Unicode的流言终结者和编码大揭秘
关于Unicode字符集以及Unicode编码之间的区别与联系

你可能感兴趣的:(ARTS-0)