`

小知识积累(持续更新)

阅读更多
     由于工作太忙,已经很久没写下什么东西了,记录比记忆重要,把一些小知识记下来,顺便与大家交流和分享下(持续更新)。

1)List的复制
//方法(a)
	public <T extends Object> List<T> copyArrayList(List<T> list){
		List<T> copyList = new ArrayList<T>();
		for(T t:list){
			copyList.add(t);
		}
		return copyList;
	}

这样直观而低效,可以用以下两种方式代替[/b]
//方法(b)
public <T extends Object> List<T> copyArrayList(List<T> list){
		new ArrayList<T>(list);
		if(list instanceof ArrayList){
			return (List<T>) ((ArrayList<T>)list).clone();
		}else{
		List<T> copyList = new ArrayList<T>();
		for(T t:list){
			copyList.add(t);
		}
		return copyList;
		}
	}
//ArrayList的clone()方法底层是调用System.copyArray的方法去拷贝数组,比自己拷贝要快得快

//方法(c)
public <T extends Object> List<T> copyArrayList(List<T> list){
		return new ArrayList<T>(list);		
	}
//简单又方便
//据测试比(b)方法还要快上许多

总结:具体情况还要根据数量量而定,数据量越大,(a)方法越慢,因为要频繁地进行add操作。创建List的时候能指定容量最好,调用add()方法超过容量就要拷贝底层的数组。
PS:平时我们拷贝数组尽量用System.copyArray的方法,速度快


2)List的remove
         无论是ArrayList还是LinkedList,remove(int index)效率都会比remove(Object obj)高。
         对于ArrayList来说,remove(int index)能马上定位到数组上的某个元素,然后把它删掉,而remove(Object obj)则比较惨烈,需要从数组顺序遍历一次,对每个元素调用equals方法找出remove(Object obj)与参数中Object相等的对象,再把他删掉,这个元素如果在数组的越尾端则效率越低。
         对于LinkedList来说,remove(Object obj)也是类似地从链表的头开始遍历,对每个元素调用equals方法找出remove(Object obj)与参数中Object相等的对象,再把他删掉,因此效率也是最低的。而remove(int index)不像ArrayList一样马上定位到某个位置,需要从链表查找到该index的元素进行删除。这个步骤与LindedList的get(int index)方法是一样的。做了优化的地方是,如果index比size大则从链表的末尾开始遍历,比size小则从头开始遍历。但依然不是最高效。removeFirst()与removeLast可以马上定位(jdk1.6的poll与pop,pollLast同理),在可以的情况下尽量调用这2方法删除LinkedList中的元素。
           一般情况而言,LindedList的删除会比ArrayList效率高,建立在删除ArrayList元素需要进行拷贝数组的情况下。但这也不是绝对的,以下这种情况ArrayList则比LinkedList效率更高
for(int i=list.size();--i>=0;){
			Object obj = list.remove(i);
			//TODO...by obj
}



3)参数final
    不少人说在 JAVA 中用 final 来修饰方法参数是为了防止方法参数在调用时被修改,但其实更重要的更少人知晓的原因是:当你的方法体内没有持有参数的引用时,理论上是有被释放掉的可能。使用了final修饰参数,即使外部没有任何指针指向这个引用,这个参数都不会在方法体跑完之前GC掉。


4)找出字符串中第一个不重复的字符
  public static Character firstNoRepeated(String str) {
        int[] aa = new int[255];
        for (int i = 0; i < str.length(); i++) {
            aa[str.charAt(i)]++;
        }
        for (int i = 0; i < aa.length; i++) {
            if (aa[i] == 1) {
                return (char) i;
            }
        }
        return null;
    }

    public static Character firstNoRepeated2(String str){
        int length = str.length();
        for(int i=0;i<length;i++){
            char c = str.charAt(i);
            if(str.indexOf(c) == str.lastIndexOf(c)){
                return c;
            }
        }
        return null;
    }

总结:都是不错能实现的想法,效率谁快一看便知


5)
-XX:-OmitStackTraceInFastThrow
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics