记录一下数组ArrayList的常用语法

1.导入

import java.util.ArrayList;

2.定义数组list

ArrayList<类名> list = new ArrayList<类名>();  不能是基本类型,必须是类

3.获取集合大小

size()

4.存入数据

add(Object object);从下标0开始加入

add(int idx,Object object);将object插入索引为idx的位置,idx<=list.size();

加入的东西是对象,一个对象在堆中各自有一片内存,在访问的时候利用栈中的地址指向堆,从堆中获取数值,通过改变一个对象的值再次用add加入数组,是将同一个对象加入两次,至于使用的时候,获取的数值是最后对象的数值。

package my_acm;

import java.util.ArrayList;

public class MyTest6 {
public static void main(String []args) {
ArrayList<Point> list1 = new ArrayList<Point>();
Point p=new Point();
p.id=10086;
p.age=25;
list1.add(p);
p.id=10088;
p.age=33;
list1.add(p);
for(int i=0;i<list1.size();i++)
System.out.println( "i="+i+" id="+list1.get(i).id+" age="+list1.get(i).age);
}
} class Point{
int id;
int age;
}
/**
i=0 id=10088 age=33
i=1 id=10088 age=33
*/

5.删除

remove(int idx);删除索引为idx的元素,返回该元素,可以用变量去接收,也可不接收

6.清空

clear(); 清空数组

7.替换

set(int idx,Object object); 把object元素和原本索引为idx的元素替换

8.获取指定位置元素

Object get(int idx);

9.判空

bool isEmpty(); 一般不用,size()可以用于判空

10.判断是否有某元素

bool contains(Object object); 基本不用,可以通过查找元素的索引来解决

11.查找元素的索引

int indexOf(Object object); 如果元素存在,则返回索引,否则返回-1,通过是不是-1判断元素在不在数组里

12..对数组list排序

导入Collections类;

import java.util.Collections;

(1)默认自然排序,从小到大

Collections.sort(list); //不可以new出Collections的对象,直接用

(2)自定义排序

导入Comparator类;

import java.util.Comparator;

创建对象的时候需要实现抽象方法compare(),实现自定义排序

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;//自定义排序用的 public class MyTest4 {
public static void main(String [] args) { ArrayList<Point> list1 = new ArrayList<Point>();
Comparator<Point> comparator = new Comparator<Point>() {
public int compare(Point p1, Point p2) {
if(p1.id<p2.id)//如果p1和p2原本就是按指定顺序,返回负数
return -1;
else
return 1;
}
};
Point p1 = new Point();
p1.id=11;p1.age=21;
list1.add(p1);
Point p2 = new Point();
p2.id=9;p2.age=44;
list1.add(p2);
Point p3 = new Point();
p3.id=2;p3.age=68;
list1.add(p3); /** 修改变量的值在加到数组里是不可行的,(
p3.id=14;p3.age=23;
list1.add(p3);
*/
for(int i=0;i<list1.size();i++) {
System.out.println( "i="+i+" id="+list1.get(i).id+" age="+list1.get(i).age);
}
Collections.sort(list1,comparator);
System.out.println("按id排序后"); for(int i=0;i<list1.size();i++) {
Point x = new Point();
x=list1.get(i);
System.out.println( "i="+i+" id="+x.id+" age="+x.age );
}
}
} class Point{
int id;
int age;
}

输出结果:

i=0 id=11 age=21
i=1 id=9 age=44
i=2 id=2 age=68
按id排序后
i=0 id=2 age=68
i=1 id=9 age=44
i=2 id=11 age=21

感觉还是LinkedList的运用比较灵活。


ArrayList原理

1.数据结构

ArrayList底层是数组,都说它是动态数组,所谓的动态就是不够的时候扩容,扩容是新开一个原来数组长度1.5倍数组,再把原来的值复制过去,用Arrays.copyOf()方法,速度比常规写的遍历快很多。可以存null值。

2.添加操作add()

先判断这个数组是否为空,

如果空就新开一个数组,默认容量为10;然后赋值改大小。

如果不为空,判断当前容量是否满足size+1,如果不满足就动态增长为1.5倍,然后赋值改大小。

3.删除remove()

  • 删除指定位置元素E remove(int index):检查index合法性,获取指定位置的对象,计算后面需要往前移动位数,然后再调用移动元素的方法System.arraycopy()。(如果是普通人写就是遍历,调用这些方法会更快,具体源码就没继续深入下去看了),原来位置对象赋null让GC去回收,返回删除的对象。
  • 删除第一个指定内容的元素boolean remove(Object object):查找,再移位。找得到元素就返回真,找不到返回假。

4.清空clear()

将所有元素赋值null,让GC回收

5.其他的方法例如插入set()等大多类似,原理很简单的,应该是调用很多底层的方法编写,提高效率。

简单小结

  • 可以存null
  • 查询很快,本质是数组,直接通过下标定位获取,就算是查找指定元素遍历也远比删改移动数据快
  • 删除、插入操作比较慢,需要移动很多数据才能达到效果
  • 线程不安全,例如多个线程增删改查元素时,还没执行完就被其他线程抢了,最简单的例子就是查询很快,但是删除很慢,删除还没移动完数据 查询就查好返回了,想要让ArrayList实现同步,可以用Collections.synchronizedList(List list)函数包装后返回一个线程安全的ArrayList集合。
  • List<E> list=Collections.synchronizedList(new ArrayList<>());

    或者使用并发包(java.util.concurrent)的CopyOnWriteArrayList集合容器。


顺便提一下Vector类,这是一个jdk1.2版本的古老的类,底层实现也是数组,和ArrayList差不多,最大区别就是Vector是线程安全的,很多方法加了synchronized修饰,还有一个区别是扩容是原来的2倍。因为已经有实现ArrayList同步的方法了,所以这个Vector很少人用了。

最新文章

  1. Bittorrent Protocol Specification v1.0 中文
  2. eclipse汉化全程
  3. iOS 动画结束后 view的位置 待完善
  4. Larbin初试
  5. android之AlertDialog 点击其它区域自己主动消失
  6. Presto集群安装配置
  7. Core Animation之框架简介(一)
  8. iOS 开发百问(6)
  9. 关于cookie与session的理解
  10. Dynamics CRM 2011/2013 通过Javascript给lookup字段赋值
  11. Java 属性映射(DozerBeanMapper)
  12. mysql常用反斜杠命令
  13. De novo RNA-Seq Assembly Using De Bruijn Graphs
  14. libgdx学习记录19——图片动态打包PixmapPacker
  15. SpringMVC系列(三):REST风格
  16. SpringBoot thymeleaf模板版本,thymeleaf模板更换版本
  17. Mac无法写入移动硬盘,Mac移动硬盘不能写
  18. MySQL死锁原因分析
  19. 6、TensorFlow基础(四)队列和线程
  20. Teamviewer 手机端怎么使用右键-已解决

热门文章

  1. 远程文件传输命令•RHEL8/CentOS8文件上传下载-用例
  2. MySQL binlog三种模式
  3. 100教程-100jc.cn
  4. Linux搭建Nexus仓库+高可用方案
  5. 为某金融企业开发团队分享DevOps Server流水线使用经验
  6. Spring Boot Cache使用与整合
  7. tmp/ccdLyHub.o:(.eh_frame+0x12): undefined reference to `__gxx_personality_v0&#39; collect2: ld returned 1 exit status
  8. D-Bus
  9. 第九节:EF Core各种迁移指令(CodeFirst和DBFirst)
  10. Codeforces Round #556 (Div. 1)