Java小知识整理

Java的泛型通配符

  以前看过几次没看懂,这次好好看了一下,大概明白是怎么回事儿了。
泛型通配符使用的地方并不多,一般是作为方法参数使用,使该方法能够接受包含不同泛型参数的对象。一般的只能处理包含一种泛型参数的对象嘛。看下面例子:

void gMethod(List<? extends Number> p) {
    if (p != null && !p.isEmpty()) {
        Number num = p.get(0);
        // ...
        // p.put(new Integer()); 错误,编译不通过,因为类型已丢失
    }
}

这个方法就可以处理传进来以Number子类作为泛型参数的对象,比如Integer, Float, Double,而如果一般的,参数是List<Integer> 作为参数,则只能处理Integer相关的。
而这种包含泛型统配符的对象会丢失泛型参数类的具体的类型信息,只能知道它是Number类或其子类,所以不能进行具体的类型相关的操作。

泛型通配符一共有3种,上界通配符,下界通配符,无解通配符,具体的使用就是上面的上界通配符差不多了,如下:

List<? super Integer> lowerBound;
List<?> noBound;

极限性能优化:
看到Java HashMap里面的一些操作,Java希望它的性能达到最优,所以是进行了极限优化的,里面的一些操作,应该是极限情况下的性能优化的(不知道对不对),一般情况下都不这样做的,降低可读性,维护性。
1、将一个变量相关的操作都放到一个表达式里面完成:

  Node<K,V> e;
  if ((e = oldTab[j]) != null) {
     // ...
  }

这应该是CPU的寄存器数量有限,两条语句执行中让e不被换出CPU的寄存器,如果把赋值和比较分成两条语句的话,引用e的数据就可能换出寄存器,然后换进去,增加消耗。

2、在方法里面重新创建一个引用,引用其他类里面的引用
方法里面的引用是在栈区的,访问快很多,如果访问类里面的引用,需要到堆区去,慢了。

3、各种使用位操作,有一个规律是不少计算仔细研究下可以变成简单的位运算。(和2的幂结合更佳,它相当于整数中的10,100,自然有更多的好处嘛,2的幂在编程中是一个吉祥的数)
位运算巧妙呀,学算法的时候涉及到这个,不是白来的。
比如HashMap里面的两个例子:
1、它的放数据的数组的size没有设置成通用的的素数,而是采用2的倍数。这样在计算HashMap中元素的hash值的时候,不用取余了,而是使用位运算 hash & (n -1) 即可得到hash相对于n的余数了。除法运算是四则运算里面最耗时,比加法慢呢几十倍,比起位运算更慢了。
2、又一个,对于取余运算又一个规律,若 m1 = x % n 与 m2 = x % 2n, m2 = m1或者n + m1. 而又通过位运算发现当扩容2倍后,重新用hash去对map的size取余,显然满足这个规律。并且还有一个东西,m2 = m1还是m2与n的最高位是0还是1有关,并且hash对应于n的最高位的值是随机的,所以不用担心重复。根据这个规律优化了resize过程中,Hash数组上一个链表的重新放置的过程,因为重新放置的位置只有两种可能,所以不用再把链表中的节点一个一个取出来再放,只需要遍历整个链表,根据上面规律分成两个链表,分别插到对应位置即可,并且这样不会像以前的头插法那样倒序一遍。

在对象的创建语句后面可以直接添加一段代码块,方便执行这个对象相关的操作。
比如

class M {
        String name;

        M(String name) {
            this.name = name;
        }


        public void setName(String name) {
            this.name = name;
        }
    }
    public static main(String[] args) {
         M m = new M("NameA") {{
              String innerString = "nameC";
              setName(innerString);
         }};
         System.out.println(m.name);
    }

比较常用的是在集合类型创建的时候:

    public static final List<String> INPUT_COMMAND_LIST = new ArrayList<String>(){{
        add(REGEX_SERACH);  add(RMB);           add(RST);
        add(OPEN_SETTING);  add(WORD_NUMBER);   add(STRANGE_DEGREE);
    }};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值