小知识积累(持续更新)

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

[size=small][b]1)List的复制[/b][/size]

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


[b][size=small]2)List的remove[/size][/b]
无论是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
}



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


[size=small] [b]4)找出字符串中第一个不重复的字符[/b][/size]

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值