对Arrays的理解:
对其的static <T> List<T> asList(T... a)de理解
1:参数的理解
T...a:这是一个可变的参数,分两种情况传入参数
A:传入一个一个内容,例如asList(“1”,“2”);
B:传入一个数组 例如: String [] arr=new String[]{"1","2"};asList(arr);
数组又分为两种:1》数组中的元素为基本数据类型,会把整个数组作为一个元素放入集合中2》数组中的元素为引用类型,会把每一个数组
中的元素作为对象放入集合list中;
例子:
public static void main(String[] args) {
//数组中存放引用类型的
// TODO Auto-generated method stub
String [] arr=new String [3];
arr[0]="li";
arr[1]="ki";
List<String> list=Arrays.asList(arr);
System.out.println("数组存引用类型时候转成集合后的集合的元素个数:"+list.size());
//list.add("12");
Iterator<String> it=list.iterator();
while(it.hasNext()){
String s=it.next();
System.out.println(s);
}
//数组中存放基本数值类型
int [] arr1=new int []{1,2,3};
List<int []> li=Arrays.asList(arr1);
System.out.println("数组存基本类型时候转成集合后的集合的元素个数:"+li.size());
//list.add("12");
Iterator<int[]> it1=li.iterator();
while(it1.hasNext()){
int[] s=it1.next();
System.out.println(s);
}
结果:
数组存引用类型时候转成集合后的集合的元素个数:3
li
ki
null
数组存基本类型时候转成集合后的集合的元素个数:
1
[I@6d9dd520
2:
Arrays的asList()返回的List是Arrays的内部类Arrays.ArrayList,此处的ArrayList与集合框架中的Arraylist
有很大的不同;
通过Arrays的源码可以得知:该ArrayList是Arrays的静态内部类,并且继承了AbstractList,但是并没有
重写AbstractList中的add,delete,等方法(基本都是有关修改集合中元素的方法)而集合框架中的ArrayList
则重写了AbstractList中所有的方法,所以通过asList()得到的集合List不能使用add,delete方法,否则会报错
java.lang.UnsupportedOperationException;
3:为啥定义内部类?
此处把ArrayList定义成内部类,因为该类只在Arrays中有他的特殊的使用作用;所以定义成内部类。
同时也省了在类中定义get,set方法,方便使用;
还有成内部类有很好的封装性和隐藏性。
4:为啥定义成静态的那 ?
因为Arrays是工具类,其方法是静态的方法,在静态方法中调用了new ArrayList();
若ArrayList定义成非静态的,那创造Arraylist时候必须有外部类对象的存在,因为
内部类的对象持有引用out.this 指向外部类对象,这也是为啥内部类可以直接访问外部类的原因,
而静态方法时候,根本没有外部类的对象。所以会编译失败。所以定义成静态的内部类。这样就可以了 。
源码:
public static <T> List<T> asList(T... a) {
return new ArrayList<>(a);
/**
* @serial include
*/
private static class ArrayList<E> extends AbstractList<E>
implements RandomAccess, java.io.Serializable
{
private static final long serialVersionUID = -2764017481108945198L;
private final E[] a;
ArrayList(E[] array) {
if (array==null)
throw new NullPointerException();
a = array;
}
public int size() {
return a.length;
}
public Object[] toArray() {
return a.clone();
}
public <T> T[] toArray(T[] a) {
int size = size();
if (a.length < size)
return Arrays.copyOf(this.a, size,
(Class<? extends T[]>) a.getClass());
System.arraycopy(this.a, 0, a, 0, size);
if (a.length > size)
a[size] = null;
return a;
}
public E get(int index) {
return a[index];
}
public E set(int index, E element) {
E oldValue = a[index];
a[index] = element;
return oldValue;
}
public int indexOf(Object o) {
if (o==null) {
for (int i=0; i<a.length; i++)
if (a[i]==null)
return i;
} else {
for (int i=0; i<a.length; i++)
if (o.equals(a[i]))
return i;
}
return -1;
}
public boolean contains(Object o) {
return indexOf(o) != -1;
}
}
|
|