[#0x001B] Arrays.asList()

本文深入探讨了Java中Arrays.asList()方法的特点与用法,包括其返回的List对象特性及类型推断机制,并对比了Collections.addAll()的不同之处。

  Arrays和Collections包含的都是static方法,可以将其视为工具类。Arrays.asList()这个方法有点特殊,这里记录一下。

  首先,Arrays.asList()返回的是一个List (List是一个接口,返回List实际是返回List接口的一个实现),这个List在底层是有数组实现的,所以size是fixed的。所以,下面的代码是不可以的:

List<Integer> list = Arrays.asList(1, 2, 3);
list.add(4); //error

 

  其次,如果不指定返回List的类型(即<>部分)的话,Arrays.asList()对其返回List的类型有自己的判断,可以视为它自身的一种优化机制,如下所示:

// Arrays.asList() makes its best guess about type.

import java.util.*;

class Snow {}

class Powder extends Snow {}
class Crusty extends Snow {}
class Slush extends Snow {}

class Light extends Powder {}
class Heavy extends Powder {}

public class AsListInference 
{
	public static void main(String[] args) 
	{
		List<Snow> snow1 = Arrays.asList(new Crusty(), new Slush(), new Powder()); //pass

		//List<Snow> snow2 = Arrays.asList(new Light(), new Heavy()); //error
		List<Powder> snow2 = Arrays.asList(new Light(), new Heavy()); //pass
		
		List<Snow> snow3 = Arrays.asList(new Light(), new Crusty()); //pass

		List<Snow> snow4 = new ArrayList<Snow>();
		Collections.addAll(snow4, new Light(), new Heavy()); //pass

		List<Snow> snow5 = Arrays.<Snow>asList(new Light(), new Heavy()); //pass
	}
}

  snow1添加3个Snow的导出类对象,没有问题。

  snow2添加2个Snow的导出类对象,按理也是可以的,不过由于它们都是Powder,所以Arrays.asList()返回的是一个List<Powder>。可见Arrays.asList()返回的是精确类型的list。

  snow3混合添加,也没有问题。

  snow4不用Arrays.asList(),使用Collections.addAll(),就没有snow2中的局限了。

  如果一定要Arrays.asList(new Light(), new Heavy())返回List<Snow>而不是List<Powder>,可以用Arrays.<Snow>asList()来强制产生List<Snow>,如snow5。

#0 0xb61b0f72 in kill () from staging_dir/target-arm-openwrt-linux-uclibcgnueabihf/root-mstar/lib/libc.so.0 #1 0xb6ddfa20 in sig_handler (v=11) at init.c:354 #2 <signal handler called> #3 0xb6dcc684 in _wndInvalidateRect (hWnd=0x4d71f8, prc=0x0, bEraseBkgnd=1, mark=15) at window.c:4596 #4 0xb6dcc9d4 in InvalidateRect (hWnd=0x4d71f8, prc=0x0, bEraseBkgnd=1) at window.c:4705 #5 0xb6dcc556 in MoveWindow (hWnd=0x4d71f8, x=3489, y=0, w=351, h=90, fPaint=fPaint@entry=1) at window.c:4530 #6 0x001b01f4 in PreviewWnd_SetResolution (resolutionIdx=<optimized out>) at PreviewWnd.c:13787 #7 0x001b0596 in PreviewWnd_OnRClickMenu (hWnd=hWnd@entry=0x3e6f00, endcode=endcode@entry=30, addData=addData@entry=0) at PreviewWnd.c:11060 #8 0x001b1262 in PreviewWnd_OnRButtonUp (hWnd=0x3e6f00, wParam=<optimized out>, lParam=<optimized out>) at PreviewWnd.c:10639 #9 0x0020d24a in TpController_ProcMsgMng (pmData=0x3057a4 <Preview_pmData>, hWnd=0x3e6f00, nMessage=6, wParam=0, lParam=24576934) at TpCommonProc.c:103 #10 0x001a8878 in PreviewWnd_Proc (hWnd=<optimized out>, nMessage=<optimized out>, wParam=<optimized out>, lParam=<optimized out>) at PreviewWnd.c:11980 #11 0xb6deb63a in DispatchMessage (pMsg=0xbe9dbbf4) at message.c:1126 #12 0x001b35f0 in MiniGUIAppMain (argc=argc@entry=1, argv=argv@entry=0xbe9e01b4) at PreviewWnd.c:13354 #13 0x00017c5c in main (args=1, argv=0xbe9e01b4) at PreviewWnd.c:13182 这个core文件的栈信息里挂在了kill里面,帮忙分析一下是什么原因呢
最新发布
08-12
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值