【0】README

0.1) 本文描述+源代码均 转自 core java volume 1, 旨在理清 java 中的 数组列表 ArrayList;


【2】数组列表 ArrayList

2.1)ArrayList: ArrayList 具有自动调节数组容量的功能, 而不需要为此编写任何代码;
2.2)ArrayList 是一个采用类型参数的泛型类:

ArrayList<Employee> staff =new ArrayList<Employee>() = new ArrayList<>() (Employee可以省略);

Annotation)实现动态数组, ArrayList 比 Vector 更加有效;
2.3)数组列表管理着 对象引用的一个内部数组:最终,数组的全部空间有可能被用尽, 这就显现出数组列表的操作魅力:如果 调用add 且 内部数组已经满了,数组列表就将自动地创建一个更大的数组,并将所有的对象从较小的数组中拷贝到较大的数组中;
2.4)ensureCapacity方法——如果已经清楚或能够估计出数组可能存储的元素数量, 就可以在填充数组之前调用 ensureCapacity方法: staff.ensureCapacity(100); 这个方法将分配一个包含100个对象的内部数组, 然后调用100 次add, 而不用重新分配空间了;还可以把初始容量传给 ArrayList 构造器: ArrayList staff= new ArrayList<>(100);
Alert) 数组列表的容量和数组大小是有区别的:如果为数组分配100个元素, 数组就有100个空位置可以使用; 而容量为100的数组列表只是拥有保存100个元素的潜力(实际上, 重新分配空间的话, 将会超过100);
2.5)size方法:它返回数组列表的实际元素数目, 等价于数组的 length 方法;
2.6)trimToSize方法:一旦能够确认数组列表的大小不在发生变化,就可调用 trimToSize 方法, 这个方法将存储区域的大小调整为当前元素数量所需要的存储空间数组。垃圾回收器将回收多余的存储空间;
Attention) 一旦整理了数组列表的大小,添加新元素就需要花时间再次移动存储块, 所以应该在确认不会添加任何元素时, 再调用 trimToSize 方法;


【3】访问数组列表元素

3.1)扩展数组的一个技巧:既可以灵活地扩展数组, 又可以方便地访问数组元素

  • 1) 先创建一个数组, 并添加所有元素:ArrayList list = new ArrayList<>();
  • 2) 使用 toArray 方法将数组元素拷贝到一个数组中:

    X[] a = new X[list.size()];
    list.toArray(a);
    

3.2)在数组中间插入元素 + 删除元素

int n = staff.size/2;
staff.add(n, e);
//位于n 之后的所有元素都要向后移动一个位置, 数组大小减1;
Employee e = staff.remove(n);
//位于n 之后的所有元素都要向前移动一个位置, 数组大小加1;

3.3)对数组进行插入和删除的效率比较低
如果数组存储的元素比较多的话, 又经常需要在中间位置插入、删除元素, 就应该考虑使用链表了
Attention)将 Employee[] 数组替换成 ArrayList , 请注意一下变化:

  • A1)不必指出数组的大小;
  • A2)使用 add 将任意多的元素添加到数组中;
  • A3)使用 size() 替代 length 计算元素数目;
  • A4)使用 a.get(i) 替代 a[i] 访问元素;

【4】类型化与原始数组列表的兼容性

4.1)假设有下面这些遗留下来的类:

public class EmployeeDB
{public void update(ArrayList list) {...}public ArrayList find(String query) {...}
}
ArrayList<Employee> staff = ...;
employeeDB.update(staff);

Warning)

  • W1)这样调用不太安全,因为添加到 数组列表中的元素可能不是 Employee 类型;
  • W2)相反, 将一个原始ArrayList 赋给一个类型化ArrayList ,会得到一个警告;
    ArrayList result = employeeDB.find(query);
  • W3)使用类型转换,还不能避免出现警告:

    ArrayList<Employee> result = ( ArrayList<Employee> )employeeDB.find(query);
    而且,还会得到 另外一个警告消息, 被告之 类型转换有误;
    

4.2)鉴于兼容性的考虑: 编译器在对类型转换进行检查之后, 如果没有发现违反规则的现象, 就将所有的类型化数组列表转换成原始 ArrayList对象。在程序运行时, 所有的数组列表都一样, 即没有虚拟机中的类型参数;因此, 类型转换(ArrayList) 和 (ArrayList) 将进行相同的运行时检查;

  • 1)在这种情形下,不必做什么:只要研究一下编译器的警告性提示,并确保这些警告不会造成太严重的后果就行了;
  • 2)一旦确保不会造成严重的后果: 就可以使用 @SuppressWarnings(“unchecked”) 标注来标记这个变量能够接受类型转换, 如下所示:

    @SuppressWarnings("unchecked")
    ArrayList<Employee> result = (ArrayList<Employee>) employeeDB.find(query);
    

泛型数组列表ArrayList相关推荐

  1. java arraylist枚举器遍历_Java基础(七)泛型数组列表ArrayList与枚举类Enum

    一.泛型数组列表ArrayList 1.在Java中,ArrayList类可以解决运行时动态更改数组的问题.ArrayList使用起来有点像数组,但是在添加或删除元素时,具有自动调节数组容量的功能,而 ...

  2. java枚举类型数组_Java基础(七)泛型数组列表ArrayList与枚举类Enum

    一.泛型数组列表ArrayList 1.在Java中,ArrayList类可以解决运行时动态更改数组的问题.ArrayList使用起来有点像数组,但是在添加或删除元素时,具有自动调节数组容量的功能,而 ...

  3. print arraylist 显示的不是内容_泛型数组列表 java.util.ArrayListlt;Egt;

    泛型数组列表 java.util.ArrayList<E> ArrayList<E>(int initialCapacity) // 用指定容量构建一个空数组列表 ArrayL ...

  4. CoreJava 5.3 泛型数组列表

    1.为了解决运行时动态更改数组的问题,使用ArrayList类:它与数组很相似,但在增加或删除元素时具有自动调节数组容量的功能. 2.ArrayList是采用类型参数的泛型类.用法:ArrayList ...

  5. java 数组与arraylist_java的数组和arraylist

    1.数组 1.0   一开始就错了 int a[8];   //没有像C在内存中开辟了8个区域 改: int a[] = {1,2,3} ; System.out.println(a.length); ...

  6. float数组 java_如何在Java中将Float数组列表转换为float数组?

    让我们首先创建一个浮点数组列表-ArrayList  arrList = new ArrayList  (); arrList.add(5.2 f); arrList.add(10.3 f); arr ...

  7. 接口,常用接口,列表ArrayList,泛型,Dictionary(字典),Dictionary版-火星文翻译器,其他集合类...

    接口 接口相当于没有方法实现的抽象类. public interface Flyable { void Flay(); } 接口方法不要public.(为什么不能用private,public,因为如 ...

  8. C#中的泛型 / 泛型类 / 数组、ArrayList和List三者的区别

    C#中数组.ArrayList和List三者的区别 在C#中数组,ArrayList,List都能够存储一组对象,那么这三者到底有什么样的区别呢. 数组 数组在C#中最早出现的.在内存中是连续存储的, ...

  9. java集合——数组列表(ArrayList)+散列集(HashSet)

    [0]README 0.1) 本文描述+源代码均 转自 core java volume 1, 旨在理解 java集合--数组列表(ArrayList)+散列集(HashSet) 的相关知识: 0.2 ...

最新文章

  1. 围绕云计算 虚拟化技术又呈现新面貌
  2. Zabbix监控实现跨区域跨网络监控数据
  3. vasp服务器中断,求助VASP能带计算的中断原因
  4. 资源放送丨《 Oracle RAC高并发系统的故障案例解析 - 2020云和恩墨大讲堂》PPT视频...
  5. 摩根溪创始人:特斯拉资产负债表有8%是比特币
  6. Java语言中几个常用的包
  7. 12行Python暴力爬《黑豹》豆瓣短评
  8. 遥感、GIS及GPS 土壤普查、制图及土壤空间数据分析
  9. 通过split命令分割大文件
  10. Windows聚焦壁纸
  11. windows安装ssh服务
  12. pythonmatplotlib怎么设置柱面_协调basemap quiver和matplotlib
  13. wav格式怎么转换成mp3?
  14. word排版快捷指令_Word怎么快速排版?这12招Word排版小技巧,3分钟完成一个Word文档...
  15. Android图像处理之GPUImage for Android
  16. 经验分享给你!小伙利用业余时间听歌赚钱,一个月挣了6000?
  17. 解决el-table固定列在ios系统出现的问题
  18. Pycharm新建项目配置虚拟环境
  19. xlrd和xlwt操作Excel文件
  20. 从提高 Elasticsearch 搜索体验说开去......

热门文章

  1. Codeforces Round #646 (Div. 2) E(贪心,bfs)
  2. LOJ#2542. 「PKUWC2018」随机游走
  3. QDU-Training-01
  4. 1305. GT考试
  5. 【无码专区9】序列统计(带权并查集 + 前缀和建边 + dp)
  6. YBTOJ:公共子串(KMP)
  7. P5341-[TJOI2019]甲苯先生和大中锋的字符串【SAM】
  8. P3889-[GDOI2014]吃【线段树】
  9. 2018/7/9-纪中某B组题【jzoj1503,jzoj1158,jzoj1161】
  10. ssl1500-最短路上的统计【Floyd】