阅读更多

28顶
0踩

编程语言

原创新闻 关于 Java 数组的 12 个最佳方法

2013-09-16 15:23 by 副主编 wangguo 评论(14) 有399726人浏览
下面是stackoverflow中关于数组方法的相关问题中,获得最多票数的12个数组操作方法。

1.  声明一个数组

String[] aArray = new String[5];
String[] bArray = {"a","b","c", "d", "e"};
String[] cArray = new String[]{"a","b","c","d","e"};


2.  输出一个数组

int[] intArray = { 1, 2, 3, 4, 5 };
String intArrayString = Arrays.toString(intArray);
 
// print directly will print reference value
System.out.println(intArray);
// [I@7150bd4d
 
System.out.println(intArrayString);
// [1, 2, 3, 4, 5]


3.  从一个数组创建数组列表


String[] stringArray = { "a", "b", "c", "d", "e" };
ArrayList<String> arrayList = new ArrayList<String>(Arrays.asList(stringArray));
System.out.println(arrayList);
// [a, b, c, d, e]


4.  检查一个数组是否包含某个值


String[] stringArray = { "a", "b", "c", "d", "e" };
boolean b = Arrays.asList(stringArray).contains("a");
System.out.println(b);
// true


5.  连接两个数组

int[] intArray = { 1, 2, 3, 4, 5 };
int[] intArray2 = { 6, 7, 8, 9, 10 };
// Apache Commons Lang library
int[] combinedIntArray = ArrayUtils.addAll(intArray, intArray2);


6.  声明一个内联数组(Array inline)


method(new String[]{"a", "b", "c", "d", "e"});


7.  把提供的数组元素放入一个字符串


// containing the provided list of elements
// Apache common lang
String j = StringUtils.join(new String[] { "a", "b", "c" }, ", ");
System.out.println(j);
// a, b, c


8.  将一个数组列表转换为数组

String[] stringArray = { "a", "b", "c", "d", "e" };
ArrayList<String> arrayList = new ArrayList<String>(Arrays.asList(stringArray));
String[] stringArr = new String[arrayList.size()];
arrayList.toArray(stringArr);
for (String s : stringArr)
	System.out.println(s);


9.  将一个数组转换为集(set)


Set<String> set = new HashSet<String>(Arrays.asList(stringArray));
System.out.println(set);
//[d, e, b, c, a]


10.  逆向一个数组

int[] intArray = { 1, 2, 3, 4, 5 };
ArrayUtils.reverse(intArray);
System.out.println(Arrays.toString(intArray));
//[5, 4, 3, 2, 1]


11.  移除数组中的元素

int[] intArray = { 1, 2, 3, 4, 5 };
int[] removed = ArrayUtils.removeElement(intArray, 3);//create a new array
System.out.println(Arrays.toString(removed));


12.  将整数转换为字节数组

byte[] bytes = ByteBuffer.allocate(4).putInt(8).array();
 
for (byte t : bytes) {
   System.out.format("0x%x ", t);
}


Via programcreek
28
0
评论 共 14 条 请登录后发表评论
14 楼 yixiandave 2013-09-22 14:00
yelangking 写道
总的来讲还是比较实用,但是有一点不明白的是,第六点,method(new String[]{"a", "b", "c", "d", "e"}); 内联数组干嘛用呢,还请赐教,另外对于11点,移除数组中的元素,可以转换成list集合后,直接调用remove方法直接删除,jdk中支持按照索引下标删除和元素本身删除!这是我的拙见。


内联数组在调用方法需要一个数组参数的时候可以直接在方法内创建,而不需要在外部创建一个变量再来传入。如果只有一个数组参数,使用 String.. 形式的可变长度参数更方便,但是对于需要传入多个数组参数的情况就可以用内联的方式传值

第二问,我只能说,转换为List需要消耗更多的资源。。也许现在你不关注这个,但对效率要求非常严格的地方这种方式是有意义的
我们可以看看ArrayUtils内部的实现代码:

    public static Object[] remove(Object[] array, int index) {
        return (Object[]) remove((Object) array, index);
    }

    private static Object remove(Object array, int index) {
        int length = getLength(array);
        if (index < 0 || index >= length) {
            throw new IndexOutOfBoundsException("Index: " + index + ", Length: " + length);
        }

        Object result = Array.newInstance(array.getClass().getComponentType(), length - 1);
//关键!调用了System.arraycopy方法
        System.arraycopy(array, 0, result, 0, index);
        if (index < length - 1) {
            System.arraycopy(array, index + 1, result, index, length - index - 1);
        }

        return result;
    }

我们再来看看System.arraycopy是什么东西:
public static native void arraycopy(Object src,  int  srcPos,
                                        Object dest, int destPos,
                                        int length);

注意,这里是native方法,直接调用内核进行运算,效率不说比转为List快了,甚至比自己遍历一遍数组赋值都快
13 楼 yelangking 2013-09-22 10:39
总的来讲还是比较实用,但是有一点不明白的是,第六点,method(new String[]{"a", "b", "c", "d", "e"}); 内联数组干嘛用呢,还请赐教,另外对于11点,移除数组中的元素,可以转换成list集合后,直接调用remove方法直接删除,jdk中支持按照索引下标删除和元素本身删除!这是我的拙见。
12 楼 Tu小二 2013-09-19 20:42
ArrayUtils是他自己写的方法
11 楼 影非弦 2013-09-18 14:13
知道了,叫的这么正式,还以为是什么呢
10 楼 影非弦 2013-09-18 14:12
内联数组是神马?以前没听说过啊
9 楼 yixiandave 2013-09-17 13:44
好吧。。是我没看清楚=w=
8 楼 yixiandave 2013-09-17 13:44
关于第8个
List有个toArray()接口,分为无参数和数组参数两种
        //初始准备
        String[] strArray = {"aa","bb","cc"};
        List<String> stringList = new ArrayList<String>(Arrays.asList(strArray));
        String[] newArray1 = new String[stringList.size()];
        //输入一个String数组,直接以String数组输出
        newArray1 = stringList.toArray(newArray1);
        System.out.println(ArrayUtils.toString(newArray1));
        //无参数,直接输出Object数组
        Object[] newArray2 = stringList.toArray();
        System.out.println(ArrayUtils.toString(newArray2));
7 楼 yixiandave 2013-09-17 13:36
pangpang514 写道
第11,ArrayUtils哪个包下面的?

commons-lang
6 楼 shidan66 2013-09-17 10:22
huihai 写道
第8个没有看明白,感觉刚开始是一个数组,后面还一个数组啊,有区别吗?

重点在数组和list的转换
5 楼 pangpang514 2013-09-17 09:38
第11,ArrayUtils哪个包下面的?
4 楼 renci 2013-09-17 09:33
第12个是啥意思
3 楼 huihai 2013-09-17 08:12
第8个没有看明白,感觉刚开始是一个数组,后面还一个数组啊,有区别吗?
2 楼 xiajie8931 2013-09-16 23:56
徐风子 写道

表示觉得挺好的。
1 楼 徐风子 2013-09-16 18:18

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

Global site tag (gtag.js) - Google Analytics