记录一下数组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很少人用了。

Java 数组ArrayList语法的更多相关文章

  1. 比较Java数组,ArrayList,LinkedList,Vector 性能比较

    public class PerformanceTester { public static final int TIMES=100000; public static abstract class ...

  2. Java 基本语法---Java数组

    Java 基本语法---Java数组 0. 概述 数组:相同类型的数据 按照顺序 组成的一种 引用数据类型 . 数据类型:基本数据类型 + 引用数据类型: 引用数据类型:类 + 接口 + 数组 : 一 ...

  3. 数据结构与算法系列2 线性表 使用java实现动态数组+ArrayList源码详解

    数据结构与算法系列2 线性表 使用java实现动态数组+ArrayList源码详解 对数组有不了解的可以先看看我的另一篇文章,那篇文章对数组有很多详细的解析,而本篇文章则着重讲动态数组,另一篇文章链接 ...

  4. Java基本语法-----java数组(一维数组二维数组)

    嘿嘿!你们懂的,又是图片,委屈大家了. java数组(一维数组二维数组) [正在看本人博客的这位童鞋,我看你气度不凡,谈吐间隐隐有王者之气,日后必有一番作为!下面有个"顶"字,你就 ...

  5. 初涉java库--ArrayList

    我的车就差一个轮子啦,造好轮子,我就飞上天与太阳肩并肩啦,想想都激动.什么你要自己造轮子,是不是傻,商店里不都是别人造好的吗,又好又方便,只需一点money,你没有money,那你只能做个安静的美男子 ...

  6. Java数组(初学者必看)

    数组无论在哪种编程语言中都算是最重要的数据结构之一,同时不同语言的实现及处理也不尽相同.但凡写过一些程序的人都知道数组的价值及理解数组的重要性,与链表一道,数组成为了基本的数据结构.尽管Java提供了 ...

  7. Java, C#, Swift语法对比速查表

    原文:Java, C#, Swift语法对比速查表   Java 8 C# 6 Swift 变量 类型 变量名; 类型 变量名; var 变量名 : 类型; 变量(类型推断) N/A var 变量名= ...

  8. Java集合ArrayList源码解读

    最近在回顾数据结构,想到JDK这样好的代码资源不利用有点可惜,这是第一篇,花了心思.篇幅有点长,希望想看的朋友认真看下去,提出宝贵的意见.  :) 内部原理 ArrayList 的3个字段 priva ...

  9. JDK1.8源码(五)——java.util.ArrayList 类

    关于 JDK 的集合类的整体介绍可以看这张图,本篇博客我们不系统的介绍整个集合的构造,重点是介绍 ArrayList 类是如何实现的. 1.ArrayList 定义 ArrayList 是一个用数组实 ...

随机推荐

  1. oracle 错误 TNS-01190与oracle 登入没反应操作

    1,问题描述 [oracle@node2 ~]$ lsnrctl stop LSNRCTL - Production on -MAY- :: Copyright (c) , , Oracle. All ...

  2. python使用rdflib创建rdf,在jena fuseki上执行SPARQL查询

    建立并启动jena fuseki服务 参考:https://www.cnblogs.com/bincoding/p/11223372.html 使用rdflib创建rdf文件 import rdfli ...

  3. kubernetes-harbor 私有仓库 帐号与密码 配置

    如harbor地址:   harbor.qing.cn #docker login harbor.classba.cn #cat /root/.docker/config.json | base64 ...

  4. Azure Devops (VSTS) Extensions 开发小记

    我在使用tfx-cli打包Azure Devops插件时,输出了很黄很黄很亮瞎眼的(尤其是在Visual Studio Code采用了Dark Black Theme的情况下)警告warning: P ...

  5. Java连载15-boolean类型&类型转换&++运算符

    一.boolean类型 1.说明: (1)在java语言中,boolean类型只有两个值:true.false,没有其他的值.在C语言中,是有0代表false和1代表true的 (2)在底层存储的时候 ...

  6. 【记录】【idea】【mysql】Server returns invalid timezone. Go to 'Advanced' tab and set 'serverTimezone' property manually.解决问题

    idea连接mysql报错Server returns invalid timezone. Go to 'Advanced' tab and set 'serverTimezone' property ...

  7. 关于i7 8700以上系列主机,安装虚拟机Win7下连接U盘,故障处理的补充说明

    正如前文“虚拟机下怎么连接U盘,如何使用U盘?一策书(湘岳阳万江波)的随笔”所言,我在win10下的虚拟机win7(i7 9700),而且听说了是不支持Win7的,其原因是不支持USB的驱动问题. 我 ...

  8. 基础知识---const、readonly、static

    const:静态常量,也称编译时常量(compile-time constants),属于类型级,通过类名直接访问,被所有对象共享! a.叫编译时常量的原因是它编译时会将其替换为所对应的值: b.静态 ...

  9. C++分治策略实现二分搜索

    问题描述: 给定已排好序的n个元素组成的数组,现要利用二分搜索算法判断特定元素x是否在该有序数组中. 细节须知: (1)由于可能需要对分治策略实现二分搜索的算法效率进行评估,故使用大量的随机数对算法进 ...

  10. Java 8——保存参数名称

    一.详述 在很多情况下,程序需要保存方法参数名称,如Mybatis中的mapper和xml中sql的参数绑定.但是在java 8之前的编译器是不支持保存方法参数名至class文件中的. 所以很多框架都 ...