java中Arrays类的讲解

介绍

java.util中有一个Arrays类,此类包含用于操纵数组的各种方法,例如:二分查找(binarySearch)、拷贝操作(copyOf)、比较(equals)、填充(fill)、排序(sort)等,功能十分强大。

随便写一下Collections 工具类的讲解

Arrays工具类常见方法

1.binarySearch

代码:

public static void main(String[] args) {int dataA[] = new int[] {1,2,5,4,3};System.out.println(Arrays.binarySearch(dataA,5));
}

输出:2

2.toString

代码:

public static void main(String[] args) {int dataA[] = new int[] {1,2,5,4,3};System.out.println(Arrays.toString(dataA));
}

输出:[1, 2, 5, 4, 3]

3.copyOf

代码:

public static void main(String[] args) {int []dataA = new int[] {1,2,5,4,3};int []dataB = Arrays.copyOf(dataA, 3);System.out.println(Arrays.toString(dataB));
}

输出[1, 2, 5]

4.equals

代码:

public static void main(String[] args) {int []dataA = new int[] {1,2,5,4,3};int []dataB = new int[] {1,2,5,4,3};int []dataC = new int[] {1,2,3};System.out.println(dataA.equals(dataB));System.out.println(Arrays.equals(dataA,dataB));System.out.println(Arrays.equals(dataA,dataC));
}

输出:

false
true
false

5.fill

代码:

public static void main(String[] args) {int []dataA = new int[] {1,2,5,4,3};Arrays.fill(dataA, -1);System.out.println(Arrays.toString(dataA));
}

输出:

[-1, -1, -1, -1, -1]

6.sort

代码:

public static void main(String[] args) {int []dataA = new int[] {1,3,5,4,-1};Arrays.sort(dataA);System.out.println(Arrays.toString(dataA));
}

输出:

[-1, 1, 3, 4, 5]

7.asList()

// *************转列表 asList()****************
/*
* 返回由指定数组支持的固定大小的列表。
* (将返回的列表更改为“写入数组”。)该方法作为基于数组和基于集合的API之间的桥梁,与	Collection.toArray()相结合 。
* 返回的列表是可序列化的,并实现RandomAccess 。
* 此方法还提供了一种方便的方式来创建一个初始化为包含几个元素的固定大小的列表如下:
*/
List<String> stooges = Arrays.asList("Larry", "Moe", "Curly");
System.out.println(stooges);		

JDK 源码对于这个方法的说明:

/***返回由指定数组支持的固定大小的列表。此方法作为基于数组和基于集合的API之间的桥梁,与           Collection.toArray()结合使用。返回的List是可序列化并实现RandomAccess接口。*/ 
public static <T> List<T> asList(T... a) {return new ArrayList<>(a);
}

7.1《阿里巴巴Java 开发手册》对其的描述

Arrays.asList()将数组转换为集合后,底层其实还是数组,《阿里巴巴Java 开发手册》对于这个方法有如下描述:

也就是说我们在使用的时候不能进行add、remove、clear等方法

7.2使用时的注意事项总结

传递的数组必须是对象数组,而不是基本类型。

Arrays.asList()是泛型方法,传入的对象必须是对象数组。

int[] myArray = { 1, 2, 3 };
List myList = Arrays.asList(myArray);
System.out.println(myList.size());//1
System.out.println(myList.get(0));//数组地址值,即把myArray当成一个元素
System.out.println(myList.get(1));//报错:ArrayIndexOutOfBoundsException
int [] array=(int[]) myList.get(0);
System.out.println(array[0]);//1

当传入一个原生数据类型数组时,Arrays.asList() 的真正得到的参数就不是数组中的元素,而是数组对象本身!此时List 的唯一元素就是这个数组,这也就解释了上面的代码。

我们使用包装类型数组就可以解决这个问题。

Integer[] myArray = { 1, 2, 3 };

使用集合的修改方法:add()remove()clear()会抛出异常。

List myList = Arrays.asList(1, 2, 3);
myList.add(4);//运行时报错:UnsupportedOperationException
myList.remove(1);//运行时报错:UnsupportedOperationException
myList.clear();//运行时报错:UnsupportedOperationException

Arrays.asList() 方法返回的并不是 java.util.ArrayList ,而是 java.util.Arrays 的一个内部类,这个内部类并没有实现集合的修改方法或者说并没有重写这些方法。

List myList = Arrays.asList(1, 2, 3);
System.out.println(myList.getClass());//class java.util.Arrays$ArrayList

下图是java.util.Arrays$ArrayList的简易源码,我们可以看到这个类重写的方法有哪些。

  private static class ArrayList<E> extends AbstractList<E>implements RandomAccess, java.io.Serializable{...@Overridepublic E get(int index) {...}@Overridepublic E set(int index, E element) {...}@Overridepublic int indexOf(Object o) {...}@Overridepublic boolean contains(Object o) {...}@Overridepublic void forEach(Consumer<? super E> action) {...}@Overridepublic void replaceAll(UnaryOperator<E> operator) {...}@Overridepublic void sort(Comparator<? super E> c) {...}}

我们再看一下java.util.AbstractListremove()方法,这样我们就明白为啥会抛出UnsupportedOperationException

public E remove(int index) {throw new UnsupportedOperationException();
}

7.3如何正确的将数组转换为ArrayList?

1. 自己动手实现(教育目的)

//JDK1.5+
static <T> List<T> arrayToList(final T[] array) {final List<T> l = new ArrayList<T>(array.length);for (final T s : array) {l.add(s);}return (l);
}
Integer [] myArray = { 1, 2, 3 };
System.out.println(arrayToList(myArray).getClass());//class java.util.ArrayList

2. 最简便的方法(推荐)

List list = new ArrayList<>(Arrays.asList("a", "b", "c"))

3. 使用 Java8 的Stream(推荐)

Integer [] myArray = { 1, 2, 3 };
List myList = Arrays.stream(myArray).collect(Collectors.toList());
//基本类型也可以实现转换(依赖boxed的装箱操作)
int [] myArray2 = { 1, 2, 3 };
List myList = Arrays.stream(myArray2).boxed().collect(Collectors.toList());

4. 使用 Apache Commons Collections

List<String> list = new ArrayList<String>();
CollectionUtils.addAll(list, str);

Collections 工具类常用方法

1.排序操作

void reverse(List list)//反转
void shuffle(List list)//随机排序
void sort(List list)//按自然排序的升序排序
void sort(List list, Comparator c)//定制排序,由Comparator控制排序逻辑
void swap(List list, int i , int j)//交换两个索引位置的元素
void rotate(List list, int distance)//旋转。当distance为正数时,将list后distance个元素整体移到前面。当distance为负数时,将 list的前distance个元素整体移到后面。

示例代码:

 ArrayList<Integer> arrayList = new ArrayList<Integer>();arrayList.add(-1);arrayList.add(3);arrayList.add(3);arrayList.add(-5);arrayList.add(7);arrayList.add(4);arrayList.add(-9);arrayList.add(-7);System.out.println("原始数组:");System.out.println(arrayList);// void reverse(List list):反转Collections.reverse(arrayList);System.out.println("Collections.reverse(arrayList):");System.out.println(arrayList);Collections.rotate(arrayList, 4);System.out.println("Collections.rotate(arrayList, 4):");System.out.println(arrayList);// void sort(List list),按自然排序的升序排序Collections.sort(arrayList);System.out.println("Collections.sort(arrayList):");System.out.println(arrayList);// void shuffle(List list),随机排序Collections.shuffle(arrayList);System.out.println("Collections.shuffle(arrayList):");System.out.println(arrayList);// void swap(List list, int i , int j),交换两个索引位置的元素Collections.swap(arrayList, 2, 5);System.out.println("Collections.swap(arrayList, 2, 5):");System.out.println(arrayList);// 定制排序的用法Collections.sort(arrayList, new Comparator<Integer>() {@Overridepublic int compare(Integer o1, Integer o2) {return o2.compareTo(o1);}});System.out.println("定制排序后:");System.out.println(arrayList);

2.查找,替换操作

int binarySearch(List list, Object key)//对List进行二分查找,返回索引,注意List必须是有序的
int max(Collection coll)//根据元素的自然顺序,返回最大的元素。 类比int min(Collection coll)
int max(Collection coll, Comparator c)//根据定制排序,返回最大元素,排序规则由Comparatator类控制。类比int min(Collection coll, Comparator c)
void fill(List list, Object obj)//用指定的元素代替指定list中的所有元素。
int frequency(Collection c, Object o)//统计元素出现次数
int indexOfSubList(List list, List target)//统计target在list中第一次出现的索引,找不到则返回-1,类比int lastIndexOfSubList(List source, list target).
boolean replaceAll(List list, Object oldVal, Object newVal), 用新元素替换旧元素

示例代码:

ArrayList<Integer> arrayList = new ArrayList<Integer>();arrayList.add(-1);arrayList.add(3);arrayList.add(3);arrayList.add(-5);arrayList.add(7);arrayList.add(4);arrayList.add(-9);arrayList.add(-7);ArrayList<Integer> arrayList2 = new ArrayList<Integer>();arrayList2.add(-3);arrayList2.add(-5);arrayList2.add(7);System.out.println("原始数组:");System.out.println(arrayList);System.out.println("Collections.max(arrayList):");System.out.println(Collections.max(arrayList));System.out.println("Collections.min(arrayList):");System.out.println(Collections.min(arrayList));System.out.println("Collections.replaceAll(arrayList, 3, -3):");Collections.replaceAll(arrayList, 3, -3);System.out.println(arrayList);System.out.println("Collections.frequency(arrayList, -3):");System.out.println(Collections.frequency(arrayList, -3));System.out.println("Collections.indexOfSubList(arrayList, arrayList2):");System.out.println(Collections.indexOfSubList(arrayList, arrayList2));System.out.println("Collections.binarySearch(arrayList, 7):");// 对List进行二分查找,返回索引,List必须是有序的Collections.sort(arrayList);System.out.println(Collections.binarySearch(arrayList, 7));

3.Collection.toArray()方法使用的坑&如何反转数组

该方法是一个泛型方法:T[] toArray(T[] a); 如果toArray方法中没有传递任何参数的话返回的是Object类型数组。

String [] s= new String[]{"dog", "lazy", "a", "over", "jumps", "fox", "brown", "quick", "A"
};
List<String> list = Arrays.asList(s);
Collections.reverse(list);
s=list.toArray(new String[0]);//没有指定类型的话会报错

由于JVM优化,new String[0]作为Collection.toArray()方法的参数现在使用更好,new String[0]就是起一个模板的作用,指定了返回数组的类型,0是为了节省空间,因为它只是为了说明返回的类型。详见:https://shipilev.net/blog/2016/arrays-wisdom-ancients/

总结

Arrays功能比较多,上面列举出一些,如果还想知道一些其他的功能可以自行翻阅文档。Arrays平时刷题的时候可以适当使用,节约自己写代码的时间。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/555308.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql 1055 解决方案_MySQL报错1055解决方案 - 树懒学堂

相信大家在使用MySQL数据库的过程中&#xff0c;或多或少都遇到报错。在mysql版本更新到5.7之后&#xff0c;有一个新的报错出现的次数越来越频繁&#xff0c;它就是MySQL 1055 报错。本文就给大家介绍一下MySQL 1055报错的原因以及解决的思路&#xff0c;并给出两种具体的解决…

SpringBoot 3.0最低版本要求的JDK 17,这几个新特性不能不知道

最近&#xff0c;有很多人在传说 SpringBoot要出3.0的版本了&#xff0c;并且宣布不再支持 Java 8&#xff0c;最低要求是 Java 17了。 其实&#xff0c;早在2021年9月份&#xff0c;关于 Spring Framework 6.0的消息出来的时候&#xff0c;Spring 官方就已经明确了不会向下兼…

jmeter mysql数据导出_Jmeter连接mysql

一、下载添加jar包image.png添加方法&#xff1a;1.拷贝到jmeter/lib目录下&#xff0c;此方法需重启jmeter2.直接在jmeter的测试计划中导入image.png二、连接mysql数据库添加配置元件-JDBC Connection Configurationimage.pngimage.png1.Variable Name for created pool&#…

判断一个坐标点是否在不规则多边形内部的算法

参考&#xff1a;https://wrf.ecse.rpi.edu//Research/Short_Notes/pnpoly.html 在GIS&#xff08;地理信息管理系统&#xff09;中&#xff0c;判断一个坐标是否在多边形内部是个经常要遇到的问题。乍听起来还挺复杂。根据W. Randolph Franklin 提出的PNPoly算法&#xff0c;…

cos7安装mysql_centos7 安装 mysql

centos7 安装 mysql1. 卸载MariaDB, centos 7 自带的[rootesbu-cos7-01 /]# rpm -qa|grep -i mariadb用命令卸载 rpm -e --nodeps2. 官网下载https://dev.mysql.com/downloads/mysql/5.7.html#downloads3. 解压 tar -xvf#tar -xvf mysql-5.7.22-1.el7.x86_64.rpm-bundle由于是…

MySQL中LIMIT的使用方法

一、任务描述 搜索表结构中的某些部分的数据&#xff0c;比如&#xff0c;最后面三个&#xff0c;最前面三个&#xff0c;第2到8条记录&#xff0c;等等。 二、实战演练 1、 select * from tablename order by orderfield desc/asc limit position&#xff0c; counter&#…

mysql++多版本安装_MySQL多版本多实例安装启动

多版本&#xff0c;大版本不同测试多实例&#xff0c;一个MySQL5.7.30一个MySQL8.0.20解压8.0tar -xvf mysql-8.0.20-linux-glibc2.12-x86_64.tartar -xJf mysql-8.0.20-linux-glibc2.12-x86_64.tar.xz改名移动/mysql8.0.20mv mysql-8.0.20-linux-glibc2.12-x86_64 /mysql8.0.2…

MySQL数据库查询优化技巧

1.对查询进行优化&#xff0c;应尽量避免全表扫描&#xff0c;首先应考虑在 where 及 order by 涉及的列上建立索引。 2.应尽量避免在 where 子句中对字段进行 null 值判断&#xff0c;否则将导致引擎放弃使用索引而进行全表扫描&#xff0c;如&#xff1a; select id from t…

cheungssh mysql密码_CheungSSH安装及基本使用

CheungSSH比Ansible的使用更简单&#xff0c;尤其是配置方面&#xff01;而Ansible有的功能&#xff0c; 我的这个程序一样有&#xff0c;和Ansible一样是python开发&#xff0c; 所以跟Ansible的模式一样&#xff0c; 但是CheungSSH 操作更简单&#xff01;配置更轻量&#xf…

MySQL100万条数据的一张表,如何查询优化?

1.两种查询引擎查询速度&#xff08;myIsam 引擎 &#xff09; InnoDB 中不保存表的具体行数&#xff0c;也就是说&#xff0c;执行select count(*) from table时&#xff0c;InnoDB要扫描一遍整个表来计算有多少行。 MyISAM只要简单的读出保存好的行数即可。 注意的是&…

mysql增删改查操作语句_学习笔记-mysql增删改查操作语句

1.mysql增删改查操作语句&#xff1a;1)如果想在一个已经建好的表中添加一列&#xff0c;可以用以下代码&#xff1a;alter table t1 add column addr varchar(20) not null;2)这条语句会向已有的表t1中加入一列&#xff0c;这一列在表的最后一列位置。如果我们希望添加在指定的…

mybatis group by 分组查询:将返回结果封装为map

文章目录1. 最简单但性能最差的做法2. 使用group by分组查询&#xff0c;将查询结果封装成类3.group by分组查询&#xff0c;将结果封装为map。直接封装为map&#xff1f;List1. 最简单但性能最差的做法 在逻辑层分多次对数据库进行查询。伪代码如下。 List<String> na…

esl证明函 oracle_强弱分明 Astralis证明之战—ESL科隆B组浅析

HLTV排名前16名中的13支队伍(缺席的是G2和North)将齐聚这座坐落在莱茵河畔的城市进行厮杀&#xff0c;争夺比赛的最高荣誉。这项赛事也是继今年卡托维茨Major以来含金量最高&#xff0c;强队参赛最多的线下赛事。下面我们就来分析一下B组的出线形势。B组分组*本次比赛的赛制依旧…

关于new ArrayList()和Collections.emptyList()

很明显 new ArrayList()是创建一个Collection实例&#xff0c;它是Collection集合下面的一个实现类&#xff08;中间继承了AbstractList&#xff09;&#xff0c;它的实例有Collection的增加&#xff0c;删除&#xff0c;修改等方法&#xff0c; ArrayList平常用的很多&#x…

mysql 1418错误_mysql 1418错误原因及解决

摘自 http://blog.sina.com.cn/s/blog_6f68845001013k8a.html具体错误&#xff1a;使用mysql创建、调用存储过程&#xff0c;函数以及触发器的时候会有错误符号为1418错误。ERROR 1418 (HY000): This function has none of DETERMINISTIC, NO SQL,or READS SQL DATA in its dec…

ArrayList()和Collections.emptyList()的区别emptyList()、emptySet()、emptyMap()的作用和好处以及要注意的地方

前言 Java中ArrayList或许是我们平时开发最常用的一个集合类了&#xff0c;其次是HashMap&#xff0c;基本上满足了业务开发的绝大多数场景。今天要说的就是Collections.emptyList()和new ArrayList()的区别以及注意事项。 先来一段代码 运行main方法&#xff0c;会有如下输出…

mysql 5.6加用户_Mysql 5.6添加修改用户名和密码的方法

先登录MySQLshell> mysql --userroot mysql有密码的需要添加 –password 或-p 选项添加用户mysql>CREATE USER finleylocalhost IDENTIFIED BY some_pass;mysql>GRANT ALL PRIVILEGES ON *.* TO finleylocalhost WITH GRANT OPTION;mysql>CREATE USER finley% IDEN…

java中SimpleDateFormat线程安全问题及解决方案

最近看到一篇文章提到了SimpleDateFormat这个类。说这个类在单线程程序中没问题&#xff0c;但是在多线程环境下会线程安全的问题。 出于兴趣对这个问题进行了查证。网上有很多关于这个问题的文章&#xff0c;也解析了其中的原因。主要原因是因为SimpleDateFormat转换日期是通…

基于mysql搭建框架环境搭建_Maven+Spring+Spring MVC+MyBatis+MySQL,搭建SSM框架环境

项目建设完成之后的结构&#xff1a;数据库的表结构如下&#xff1a;环境建设&#xff1a;搭建Maven环境、Tomcat环境、需要MySql 数据库支持&#xff0c;使用的编程工具Eclipse (这些是前期准备)&#xff1b;开始创建工程&#xff1a;1.创建一个Maven工程&#xff1a;选择weba…

DataIntegrityViolationException: Error attempting to get column处理方案汇总

项目背景 项目整体采用的是springbootmybatis 方式。有一次做数据查询的时候。console突然报&#xff1a;DataIntegrityViolationException: Error attempting to get column ‘xx’…异常。起初没在意。以为是xml中的SQL写错了&#xff0c;排查了没问题。百度一下这个报错&…