【Java程序性能优化】-读书笔记第3章

来源:互联网 发布:a5源码站 编辑:程序博客网 时间:2024/06/02 00:57

序:

  在看这本12年出的书,还是有借鉴意义。

3.1 字符串优化:

3.1.1 String对象的特点:

  不变性:指String对象一旦生成,则不更在对他进行改变。

针对常量池的优化:当两个String对象拥有相同 的值时,他么只引用常量池中的同一个拷贝。

类final的定义:不能有子类。

3.1.2 jdk1.6 subString()方法的内存泄漏:

    在String类中有3个域:char[] value、int offset、int count,分别用来存储真实的字符数组,数组的起始位置,String的字符数。由这3个变量就可以决定一个字符串。1.6版本当substring方法被调用的时候,它会创建一个新的字符串,但是上述的char数组value仍然会使用原来父数组的那个value。父串无效的时候,子串还引用这哥字符串数组,被能被回收。存在内存泄漏。
  1.7 版本开始修复了这个问题:实现:
public static char[] copyOfRange(char[] original, int from, int to) {        int newLength = to - from;        if (newLength < 0)            throw new IllegalArgumentException(from + " > " + to);        char[] copy = new char[newLength];        System.arraycopy(original, from, copy, 0,                         Math.min(original.length - from, newLength));        return copy;    }
去为子字符串创建了一个新的char数组去存储子字符串中的字符。父字符串引用失效的时候,可以被回收。
3.1.3 字符串的分割与查找
indexof>stringtokenizer>split

3.1.4 Stringbuffer 与stringbulider
    Stringbuffer线程安全,但是效率比stringbulider低
   简单的非大量的字符串拼接可以用concat来替代“+”。

3.2 核心数据结构

3.2.1 List接口
  主要介绍:ArrayList,LinkedList.
    .ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。
         对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。 
        对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。 
3.2.2 Map接口
    Hashtable继承Map接口,实现一个key-value映射的哈希表。任何非空(non-null)的对象都可作为key或者value。是线程安全的。
     Hashmap与hashtable不同之处在于HashMap是非同步的,并且允许null. 现场安全可以使用:concurrenthashmap
     底层原理:数组+链表。先计算key 的hash,如果重复entry吧新元素放入数组的i位置,并把它的next指向旧元素。
     容量参数:默认16,负责而因子0.75,hash扩容会遍历整个hashmap,尽量避免。
     linkedhashmap:是HashMap的一个子类,保存了记录的插入顺序,
     TreeMap实现SortMap接口,能够把它保存的记录根据键排序,默认是按键值的升序排序,也可以指定排序的比较器,当用Iterator 遍历TreeMap时,得到的记录是排过序的。  时间复杂度O(log n)
   3.2.3 SET 接口:
    set元素是不能重复的,set是基于map的封装。
  3.2.4 优化访问集合代码:
  
1. 分离循环中被重复调用的代码。把collecttion.size提取出来。放在for循环外面。
2. 减少方法的调用。

3.3 使用NIO提升性能

主要介绍使用New I/O的buffer,channel

3.4 引用类型:

Java提供了四种类型的引用:强引用、软引用、弱引用和虚引用。Java中提供这四种引用类型主要有两个目的:第一是通过代码的方式决定某些对象的生命周期;第二是有利于JVM进行垃圾回收。
   
强引用: 1)可以直接访问目标对象。
              2) 只要某个对象有强引用与之关联,JVM必定不会回收这个对象,即使在内存不足的情况下,JVM宁愿抛出OutOfMemory错误也不会回收这种对象。

软引用:1)软引用是用来描述一些有用但并不是必需的对象,在Java中用java.lang.ref.SoftReference类来表示。对于软引用关联着的对象,只有在内存不足的时候JVM才会回收该对象。

  2)软引用可以和一个引用队列(ReferenceQueue)联合使用,如果软引用所引用的对象被JVM回收,这个软引用就会被加入到与之关联的引用队列中。

弱引用:1) 弱引用也是用来描述非必需对象的,当JVM进行垃圾回收时,无论内存是否充足,都会回收被弱引用关联的对象。在java中,用java.lang.ref.WeakReference类来表示。
虚引用:虚引用和前面的软引用、弱引用不同,它并不影响对象的生命周期。在java中用java.lang.ref.PhantomReference类表示。如果一个对象与虚引用关联,则跟没有引用与之关联一样,在任何时候都可能被垃圾回收器回收。必须和引用队列一起使用,作用在于跟踪垃圾回收过程。

3.5 有助于改善性能的技巧
3.5.1 慎用异常。
作者举例吧try-catch移到for循环外面
3.5.2 使用局部变量
临时变量保存到栈(stack)中,速度较快,静态变量,实例变量都在堆(heap)中区别,速度较慢
3.5.3 位运算替代乘除法
3.5.4 替换switch:用数组实现
3.5.5一维数组替代二维数组
3.5.6 提出公用表达式
3.5. 8 布尔运算代替位运算 
3.5.9 使用arraycopy
3.5.10 使用buffer进行I/O操作
3.5.12 静态方法替代实例方法
   static方法不仅可以加快函数调用速度,也不需要生成类的实例。 


阅读全文
0 0
原创粉丝点击