经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » Java » 查看文章
Java ArrayList的底层实现方法
来源:jb51  时间:2018/10/15 8:59:48  对本文有异议

如下所示:

  1. package com.soto.collection;
  2. /**
  3. * 自己实现一个ArrayList,帮助我们更好地理解ArrayList的底层结构;
  4. * @author 王
  5. *
  6. */
  7. public class SxtArrayList {
  8. private Object[] elementData;
  9. private int size;
  10. public int size(){
  11. return size;
  12. }
  13. public boolean isEmpty(){
  14. return size == 0;
  15. }
  16. public SxtArrayList(){
  17. this(10);
  18. }
  19. public SxtArrayList(int initialCapacity){
  20. if(initialCapacity<0){
  21. try {
  22. throw new Exception();
  23. } catch (Exception e) {
  24. e.printStackTrace();
  25. }
  26. }
  27. elementData = new Object[initialCapacity]; //初始化 容量为10
  28. }
  29. public void add(Object obj){
  30. elementData[size++] = obj; //若超过容量了,那么..数组扩容
  31. if(size==elementData.length){
  32. //实质:搞个新数组
  33. Object[] newarray = new Object[size*2+1];
  34. //数组的copy:
  35. System.arraycopy(elementData, 0, newarray, 0, elementData.length);
  36. elementData = newarray;
  37. }
  38. }
  39. public Object get(int index){
  40. rangeCheck(index);
  41. return elementData[index];
  42. }
  43. public void remove(int index){
  44. rangeCheck(index);
  45. //删除指定位置对象,删除某位置,相当于 将后往前挪:
  46. int numMoved = size-index-1;
  47. if(numMoved>0){
  48. System.arraycopy(elementData, index+1, elementData, index, numMoved);
  49. }
  50. }
  51. public void remove(Object obj){
  52. for(int i=0;i<size;i++){
  53. if(get(i).equals(obj)){ //注意底层调用的equals方法而不是==。
  54. remove(i);
  55. }
  56. }
  57. }
  58. private void rangeCheck(int index){
  59. if(index<0||index>size){
  60. try {
  61. throw new Exception();
  62. } catch (Exception e) {
  63. e.printStackTrace();
  64. }
  65. }
  66. }
  67. public Object set(int index, Object obj){
  68. rangeCheck(index);
  69. Object oldValue = elementData[index];
  70. elementData[index] = obj;
  71. return oldValue;
  72. }
  73. public void add(int index, Object obj){
  74. rangeCheck(index);
  75. ensureCapacity(); //扩容
  76. System.arraycopy(elementData, index, elementData, index + 1,
  77. size - index);
  78. elementData[index] = obj;
  79. size++;
  80. }
  81. private void ensureCapacity(){
  82. //扩容
  83. if(size==elementData.length){
  84. //实质:搞个新数组
  85. Object[] newarray = new Object[size*2+1];
  86. //数组的copy:
  87. System.arraycopy(elementData, 0, newarray, 0, elementData.length);
  88. elementData = newarray;
  89. }
  90. }
  91. public static void main(String[] args) {
  92. SxtArrayList list = new SxtArrayList(3);
  93. list.add("222");
  94. list.add("333");
  95. list.add("444");
  96. list.add("555");
  97. list.add("666");
  98. list.add("777");
  99. System.out.println(list.size());
  100. System.out.println(list.get(6));
  101. }
  102. }

以上这篇Java ArrayList的底层实现方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持w3xue。

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号