GVKun编程网logo

为什么ArrayList使用瞬态存储?(arraylist为什么可以扩容)

9

在这里,我们将给大家分享关于为什么ArrayList使用瞬态存储?的知识,让您更了解arraylist为什么可以扩容的本质,同时也会涉及到如何更有效地ArrayListal=newArrayList(

在这里,我们将给大家分享关于为什么ArrayList使用瞬态存储?的知识,让您更了解arraylist为什么可以扩容的本质,同时也会涉及到如何更有效地ArrayList al = new ArrayList();有什么区别?和ArrayList al = new ArrayList(0)?、ArrayList list = new ArrayList()在这个泛型为Integer的ArrayList中存放一个String类型的对象、ArrayList使用示例、Arrays.asList()返回的ArrayList,这是Arrays里内嵌的一个私有静态类,而并不是java.util.ArrayList类的内容。

本文目录一览:

为什么ArrayList使用瞬态存储?(arraylist为什么可以扩容)

为什么ArrayList使用瞬态存储?(arraylist为什么可以扩容)

我正在阅读Java的ArrayList的源代码,并且遇到了它的支持数组声明:

private transient Object[] elementData;

为什么这需要是瞬态的?为什么不能对此类进行序列化?

谢谢您的帮助!

答案1

小编典典

可以 被序列化;
ArrayList班只是需要照顾的事情本身,而不是使用默认的机制。查看该类中的writeObject()readObject()方法,它们是标准序列化机制的一部分。

如果您查看源代码,则会看到它writeObject()不保存后备阵列。相反,它一次将元素(包括空值)序列化到最大size()限制。这避免了序列化阵列的开销,尤其是避免了阵列末尾的任何未使用的插槽。反序列化时,由会创建一个最小所需大小的新支持数组readObject()

ArrayList al = new ArrayList();有什么区别?和ArrayList al = new ArrayList(0)?

ArrayList al = new ArrayList();有什么区别?和ArrayList al = new ArrayList(0)?

ArrayList al = new ArrayList();有什么区别?和ArrayList al = new ArrayList(0)?

ArrayList list = new ArrayList()在这个泛型为Integer的ArrayList中存放一个String类型的对象

ArrayList list = new ArrayList()在这个泛型为Integer的ArrayList中存放一个String类型的对象

java面试要点---ArrayList list = new ArrayList(); 在这个泛型为Integer的ArrayList中存放一个String类型的对象。

ArrayList list = new ArrayList(); 在这个泛型为Integer的ArrayList中存放一个String类型的对象。 
1.刚刚看到的时候,也是很纳闷后来仔细看了下,java的反射机制;
2.这个可以通过java的反射机制来实现;
3.下面是一个例子:
 package com.credream.refelect;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
public class TestFile {
public static void main(String[] args) throws Exception {
List<Integer> list = new ArrayList<Integer>(); //定义Integer泛型
String str = "abc"; 
Method[] method=list.getClass().getMethods();//取得list的所有方法
System.out.println(method.length);
for(int i=0;i<method.length;i++){
System.out.println(method[i]);//遍历打印list的方法
}
method[0].invoke(list, str);//通过 反射来执行 list的第一个方法,第一个是list对象,代表该对象的方法,第二个是方法参数:  就是list.add(str);
System.out.println(list.size());
for(int i=0;i<list.size();i++){
System.out.println(list.get(i));
}
}
}
 ------------------------------------------------------------------------------------------------------------------
运行结果:
 35
public boolean java.util.ArrayList.add(java.lang.Object)
public void java.util.ArrayList.add(int,java.lang.Object)
public java.lang.Object java.util.ArrayList.get(int)
public java.lang.Object java.util.ArrayList.clone()
public int java.util.ArrayList.indexOf(java.lang.Object)
public void java.util.ArrayList.clear()
public boolean java.util.ArrayList.contains(java.lang.Object)
public boolean java.util.ArrayList.isEmpty()
public int java.util.ArrayList.lastIndexOf(java.lang.Object)
public boolean java.util.ArrayList.addAll(int,java.util.Collection)
public boolean java.util.ArrayList.addAll(java.util.Collection)
public int java.util.ArrayList.size()
public java.lang.Object[] java.util.ArrayList.toArray(java.lang.Object[])
public java.lang.Object[] java.util.ArrayList.toArray()
public boolean java.util.ArrayList.remove(java.lang.Object)
public java.lang.Object java.util.ArrayList.remove(int)
public java.lang.Object java.util.ArrayList.set(int,java.lang.Object)
public void java.util.ArrayList.ensureCapacity(int)
public void java.util.ArrayList.trimToSize()
public int java.util.AbstractList.hashCode()
public boolean java.util.AbstractList.equals(java.lang.Object)
public java.util.Iterator java.util.AbstractList.iterator()
public java.util.List java.util.AbstractList.subList(int,int)
public java.util.ListIterator java.util.AbstractList.listIterator(int)
public java.util.ListIterator java.util.AbstractList.listIterator()
public java.lang.String java.util.AbstractCollection.toString()
public boolean java.util.AbstractCollection.containsAll(java.util.Collection)
public boolean java.util.AbstractCollection.removeAll(java.util.Collection)
public boolean java.util.AbstractCollection.retainAll(java.util.Collection)
public final void java.lang.Object.wait() throws java.lang.InterruptedException
public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
public final native java.lang.Class java.lang.Object.getClass()
public final native void java.lang.Object.notify()
public final native void java.lang.Object.notifyAll()
1
abc

ArrayList使用示例

ArrayList使用示例

本教程演示如何在ArrayList上执行各种操作,一些常见的操作如下:

  • 将元素添加到ArrayList中。
  • 从ArrayList中删除元素。
  • 从ArrayList中检索元素。
  • 打印ArrayList的大小。
  • 检查ArrayList中是否存在元素。
  • 查找ArrayList中元素的索引。
  • 从ArrayList中删除所有元素。

文件:ArrayListExample.java -

package com.jb51.cc.tutorial;

import java.util.ArrayList;
import java.util.List;

public class ArrayListExample {
    public static void main(String[] args) {
        List<String> list=new ArrayList<>();

        /*Adding elements into the list*/
        list.add(One);
        list.add(Two);
        list.add(Three);
        list.add(Four);
        list.add(Five);
        System.out.println(Elements in list:+list);

        /*Removing an element from the list*/
        String removedEle=list.remove(0); // Remove the first element
        System.out.println(Element revoved:+removedEle);
        System.out.println(Elements in list after removal:+list);

        /*Retrieving an element in the list*/
        String element=list.get(1);    // Get second element
        System.out.println(Element at second position:+element);

        /*Print size of List*/
        System.out.println(Number of elements:+list.size());

        /*Check if an element exist in the list*/
        System.out.println(Element exist:+list.contains(Five));

        /*Finding the index of an element*/
        System.out.println(Index of 'Four' is :+list.indexOf(Four));

        /*Removing all elements from the list*/
        list.clear();
        System.out.println(Elements in list:+list);
    }
}

执行上面示例代码,得到以下结果 -

Elements in list:[One Two Three Four Five]
Element revoved:One
Elements in list after removal:[Two Three Four Five]
Element at second position:Three
Number of elements:4
Element exist:true
Index of 'Four' is :2
Elements in list after clear:[]

Arrays.asList()返回的ArrayList,这是Arrays里内嵌的一个私有静态类,而并不是java.util.ArrayList类

Arrays.asList()返回的ArrayList,这是Arrays里内嵌的一个私有静态类,而并不是java.util.ArrayList类

测试代码:

package array;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;

public class ArrayTest {
   
   
   

	@SuppressWarnings("unused")
	private static void asListTest(){
   
   
   
		String[] a = {
   
   
   "A", "B"};
		List<String> list = Arrays.asList(a);
		System.out.println(list.getClass().getName()); // java.util.Arrays$ArrayList
		System.out.println(list.contains("A")); // true
		list.add("C");
		/*
		 * Jerry: 2016-01-15 9:09PM:
	Arrays.asList() 会返回一个ArrayList,这是Arrays里内嵌的一个私有静态类,而并不是java.util.ArrayList类java.util.Arrays.ArrayList 有set(), get(), contains()方法,
	但并不支持添加元素,所以大小是固定的,想要创建一个真正的ArrayList,你应该:
	ArrayList<String> arrayList = new ArrayList<String>(Arrays.asList(arr));
		 */
	}
	
	private static void removeInLoop() {
   
   
   
		ArrayList<String> list = new ArrayList<String>(Arrays.asList("a", "b", "c", "d"));

		// 下面这段代码会触发ConcurrentModificationException异常
                // 不能在循环里直接修改一个集合类实例

		/*for (String s : list) {
		    if (s.equals("a"))
		        list.remove(s);
		}*/
                // 应该用迭代器来完成
		Iterator<String> iter = list.iterator();
		while (iter.hasNext()) {
   
   
   
		    String s = iter.next();

		    if (s.equals("a")) {
   
   
   
		        iter.remove();
		    }
		}
		list.forEach(System.out::println);
	}
	public static void main(String[] args) {
   
   
   
	    // asListTest();
		removeInLoop();
		String[] a = {
   
   
   "A", "B"};
		// internal implementation: return new ArrayList<>(a);
		List<String> list1 = Arrays.asList(a);
		List<String> list2 = Arrays.asList(a);
		List<String> list3 = Arrays.asList(a);
		System.out.println(list1);
		System.out.println(list2);
		System.out.println(list3);
                /* 这行代码会触发异常:
             Exception in thread "main" java.lang.UnsupportedOperationException
	     at java.base/java.util.AbstractList.add(AbstractList.java:153)
	     at java.base/java.util.AbstractList.add(AbstractList.java:111)
	     at array.ArrayTest.main(ArrayTest.java:57)
                */
		// list3.add("C");
		System.out.println(list1.getClass().getCanonicalName());
	}
}

本文分享 CSDN - 汪子熙。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

今天关于为什么ArrayList使用瞬态存储?arraylist为什么可以扩容的介绍到此结束,谢谢您的阅读,有关ArrayList al = new ArrayList();有什么区别?和ArrayList al = new ArrayList(0)?、ArrayList list = new ArrayList()在这个泛型为Integer的ArrayList中存放一个String类型的对象、ArrayList使用示例、Arrays.asList()返回的ArrayList,这是Arrays里内嵌的一个私有静态类,而并不是java.util.ArrayList类等更多相关知识的信息可以在本站进行查询。

本文标签: