2013年3月29日星期五
java puzzers 94: shuffle
主要代码就是这一段:
Random rnd=new Random();
for (int i = 0; i < size; i++)
swap(array, i, rnd.nextInt(size));
这个算法是不公平的,Collections.shuffle用的是:
for (int i = size; i > 1; i--)
swap(arr, i - 1, rnd.nextInt(i));
其实就是(有点难看):
for (int i = 0; i < size; i++)
swap(array, i, i+rnd.nextInt(size-i));
java puzzers:"+","=="
匆匆看完,大部分都很有意思,不过看完都没什么印象,只有一个我现在还偶尔碰到.
puzzer 43:(排版稍微有点不一样)
运算符“+”和“==”的优先级,前者高.(不管是加法还是字符串连接)
puzzer 43:(排版稍微有点不一样)
很明显能看出pig!=dog,但是这个迷题的重点却在输出语句上,原文将“+pig==dog”显示在第二行,错误就更不容易看出来。public class AnimalFarm{public static void main(String[] args){final String pig = "length: 10";final String dog = "length: " + pig.length();System.out. println("Animals are equal: "+ pig == dog);}}
运算符“+”和“==”的优先级,前者高.(不管是加法还是字符串连接)
2013年3月28日星期四
ArrayList笔记
Jdk6:
1.初始化(源码):
public ArrayList(Collection<? extends E> c) {
elementData = c.toArray();
size = elementData.length;
// c.toArray might (incorrectly) not return Object[] (see 6260652) if (elementData.getClass() != Object[].class)
elementData = Arrays.copyOf(elementData, size, Object[].class);
}
elementData = c.toArray();
size = elementData.length;
// c.toArray might (incorrectly) not return Object[] (see 6260652) if (elementData.getClass() != Object[].class)
elementData = Arrays.copyOf(elementData, size, Object[].class);
}
下面是这个代号6260652中说到的bug代码示范:
List l = Arrays.asList(args);
System.out.println(l.toArray());
System.out.println(l.toArray(new Object[0]));
EXPECTED -
[Ljava.lang.Object;@10b62c9
[Ljava.lang.Object;@82ba41
ACTUAL -
[Ljava.lang.String;@10b62c9
[Ljava.lang.Object;@82ba41
[Ljava.lang.Object;@10b62c9
[Ljava.lang.Object;@82ba41
ACTUAL -
[Ljava.lang.String;@10b62c9
[Ljava.lang.Object;@82ba41
2.arrayList.toArray()内部调用的也是Arrays.copyOf
3.数组复制:
System.arraycopy(Object src,int srcPos,Object dest,int destPos,int length)
4.
默认初始容量10, 扩容方法ensureCapacity(int minCapacity)是取
min{ minCapacity, (oldCapacity *3)/2+1 }
2013年2月26日星期二
Java的Integer
注册某个网站的时候要回答一道题目:
Integer i1 = 124;
真正写代码的时候谁会去用==,这答案只有遇到了才知道。
不过通过这个题目也可以稍微了解下Integer类。
Integer源码里面有个IntegerCache,缓存了从-128到127,所以这个范围的地址判断都得到都是相同的。
Integer i1 = 124;
Integer i2 = 124;
Integer i3 = 129;
Integer i4 = 129;
System.out.println(i1 == i2);
System.out.println(i3.equals(i4));
System.out.println(i3 == i4);
真正写代码的时候谁会去用==,这答案只有遇到了才知道。
不过通过这个题目也可以稍微了解下Integer类。
Integer源码里面有个IntegerCache,缓存了从-128到127,所以这个范围的地址判断都得到都是相同的。
订阅:
博文 (Atom)