带你快速搞定java数组

目录
  • 1、数组的定义
  • 2、array 遍历
  • 3、List和array 之间的转换
    • 1、数组转list
    • 2、list 转数组
    • 3、Arrays工具类
  • 4、可能遇到的问题
  • 总结

1、数组的定义

  • 先声明后使用

数据类型 [] 数组名称 = new 数据类型[长度];String[] arr3 = new String[5];

数据类型 数组名称[] = new 数据类型[长度];String arr[] = new String[5];

  • 直接初始化

String[] arrs = {"1","2","3"};

  • 声明并初始化
String[] sarr = new String[]{"a","b"};

2、array 遍历

  • 流遍历

将数组封装成流进行操作,所有的操作都和列表一样操作

public static void main(String[] args) {
      String[] arrs = {"1","2","3"};
      Arrays.stream(arrs).forEach(System.out::println);
  }
  • 普通遍历

普通遍历有三种方式,建议使用第一种,

如果需要使用索引可以使用第三种

如果想要倒序,则使用第三种

3、List和array 之间的转换

list 和 array 之间大有联系,list 的实现形式有链表和 数组,我们开发中经常需要对两者进行转换

1、数组转list

  • 使用循环 转换为list
  • 借助工具方法

代码展示:

   public static void main(String[] args) {
       String[]  arrs = {"1","2","3"};
       // 循环转换
       List<String> list1 = new ArrayList<>();
       for (String arr : arrs) {
           list1.add(arr);
      }
       // 借助数组工具类
       List<String> list2 = Arrays.asList(arrs);
       // 借助集合工具类
       List<String> list3 = new ArrayList<>();
       Collections.addAll(list2,arrs);
  }

2、list 转数组

  • list 内置方法 toArray
  • 直接循环

代码展示

   public static void main(String[] args) {
       List<String> list = Arrays.asList("1","2");
       String[] arr1 = new String[list.size()];
       // 循环遍历赋值
       for (int i = 0; i < list.size(); i++) {
           arr1[i] = list.get(i);
      }
       // 调用list 方法
       String[] arr2 = (String[]) list.toArray();
  }

3、Arrays工具类

  • toString()

打印数组的方法,如果不调用这个方法打印的是内存地址

  • stream()

将数组转换为流操作,具体就不演示了

  • sort()

对数组进行排序,注意这个排序是数组内部排序,没有返回值,原数组会被改变

  • setAll

对数组内的元素进行操作,需要提供一个function,具有不同的数据类型

String[] arrs = {"1","2","3"};
      Arrays.setAll(arrs, e->e+"0");
      for (String arr : arrs) {
          System.out.println(arr);
      }
  • binarySearch

看名字都知道这是二分查找,具体的算法也很简单,如果你还不会,可以补一下了,如果你懂二分查找应该知道,在调用这个方法之前要保证数组是有序的!

  • copyOf

名字也很直白,拷贝数组,扩展就是增加一些长度限制,或者填充数据的设置

  • equals

看起来不需要解释

  • deepEquals

判断两个数组的深度是否相同,也就是数组嵌套了几层

    public static void main(String[] args) {
          String[] arrs = {"1","2","3"};
          String[][] arr2 = {{"1"},{"2"},{"3"}};
          boolean b = Arrays.deepEquals(arr2, arrs);
          System.out.println(b);
      }

  • fill

认识英语的话基本上都懂,就是如何填充数组,当然你也可以自己进行循环操作

  • hashCode

计算数组的hash code

  • parallelPrefix

这个有些意思的,并行的累计操作数组内的元素,看个例子你就知道了

public static void main(String[] args) {
       String[]  sarr = new String[]{"a","b","c"};
       Arrays.parallelPrefix(sarr, (sum,e1)->e1 + sum);
       System.out.println(Arrays.toString(sarr));
  }

看下执行结果:

4、可能遇到的问题

1、索引越界问题,数组的下标索引是从0 开始的,最后一个索引是length -1 ,注意不要越界

2、下面的方式创建的列表不支持添加

因为Arrays中的ArrayList并没有实现remove()和add()方法,所以抛出了异常。所以说 Arrays.asList 返回的 List 是一个不可变长度的列表,此列表不再具备原 List 的很多特性,因此慎用 Arrays.asList 方法。

String[] arr = {"1", "2", "3"};
       List list = Arrays.asList(arr);
       arr[1] = "4";
       try {
           list.add("5");
      } catch (Exception ex) {
           ex.printStackTrace();
      }

3、一个小技巧,将数组绕成圈进行遍历

使用对数组长度取余即可

   public static void main(String[] args) {
       String[] arr = {"a", "b", "c"};
       int i = 0;
       int j = 0;
       int length = arr.length;
       while (j++ <10){
           System.out.println(arr[i%length]);
           i++;
      }
  }

可以看到多次遍历了数组

总结

本篇文章就到这里了,希望能给你带来帮助,也希望你能够多多关注我们的更多内容!

(0)

相关推荐

  • Java 数组内置函数toArray详解

    java.util.List中的toArray函数 java.util.List<E> @NotNull public abstract <T> T[] toArray(@NotNull T[] a) Returns an array containing all of the elements in this list in proper sequence (from first to last element); the runtime type of the returned

  • 新手了解java 集合基础知识(二)

    目录 三.Map 1.HashMap 2.TreeMap 3.ConcurrentHashMap 总结 三.Map ​ 存储的双列元素,Key是无序的,不可重复,而Value是无序,可重复的. 1.HashMap public class HashMapDemo { private Map map = null; public void init() { map = new HashMap(); map.put("a", "aaa"); map.put("

  • java对象数组实现学生信息管理系统

    本文实例为大家分享了Java实现学生信息管理系统,供大家参考,具体内容如下 一.功能需求 case 10:添加学生 case 11:查找一个学生 case 12:根据编号更新学生基本信息 case 13:根据编号删除学生 case 14:根据编号录入成绩 case 15:根据某门成绩排序 case 16:根据总成绩排序 case 99:退出系统 二.代码框架 一共有三个文件: 1.Student.java(学生类) //学生的基本信息 2.StudentAdmin.java(学生管理类) //用

  • Java实现二维数组和稀疏数组之间的转换

    前言 用Java实现二维数据和稀疏数组之间的转换 1. 需求和思路分析 1.1 以二维数组的格式模拟棋盘.地图等类似的二维结构为基础,与稀疏数组之间进行转化. 1.2 思路分析 二维数组转化为稀疏数组 遍历原始的二维数组,得到有效数据个数 sum 根据sum就可以创建稀疏数组sparseArr int[sunm+1][3] 将二维数组的有效数据存入到稀疏数组 稀疏数组转为二维数组 先读取稀疏数组的第一行,根据第一行的数据,创建原始的二维数组 再读取稀疏数组后几行的数据,并赋给原始的二维数组即可.

  • Java数组与堆栈相关知识总结

    一.数组创建 1.1 声明并赋值 int[] a = {1,2,3}; 1.2 声明数组名开辟空间并且赋值 int[] a; a = new int[]{1,2,3}; 1.3 声明数组时指定元素个数然后赋值 int[] a= new int[3]; 这里Java会默认数组元素值为0 1.4 在以上的基础上创建多维数组 int[][] a = {{1,2,3},{4,5,6},{7,8,9}}; //每个子数组元素个数不要求均相同 int[][] a = new int[m][n]; //其中n

  • 带你快速搞定java数组

    目录 1.数组的定义 2.array 遍历 3.List和array 之间的转换 1.数组转list 2.list 转数组 3.Arrays工具类 4.可能遇到的问题 总结 1.数组的定义 先声明后使用 数据类型 [] 数组名称 = new 数据类型[长度];String[] arr3 = new String[5]; 数据类型 数组名称[] = new 数据类型[长度];String arr[] = new String[5]; 直接初始化 String[] arrs = {"1",

  • 带你快速搞定java多线程

    目录 1.什么是线程 2.线程的状态 3.怎么通俗理解进程,线程? 4.线程和进程的区别 5.什么是线程安全 6.如何创建线程 总结: 1.什么是线程 线程是操作系统调度的最小单元,也叫轻量级进程.它被包含在进程之中,是进程中的实际运作单位.同一进程可以创建多个线程,每个进程都有自己独立的一块内存空间.并且能够访问共享的内存变量. 2.线程的状态 线程的状态一般看到的也就是Runable 和blocked ,最多的还是blocked,因为cpu的时间片很短,切换的很快等待IO,等待临界资源.大概

  • 带你快速搞定java IO

    目录 一.IO底层是怎么回事? 二.梳理类的结构 三.IO类大点兵 四.来波实例展示 1.访问操作文件(FileInputStream/FileReader ,FileOutputStream/FileWriter) 2.缓存流的使用(BufferedInputStream/BufferedOutputStream,BufferedReader/BufferedWriter) 3.获取键盘输入 总结: 一.IO底层是怎么回事? 操作系统就是管家,电脑的设备就是资源,如果进程先要操作资源,必须要进

  • 带你快速搞定java多线程(4)

    目录 1.AQS 是什么? 2.AQS 模型 3.AQS state 4.AQS 两种资源共享方式: 5.模板方式实现自定义 6.锁的分类:公平锁和非公平锁,乐观锁和悲观锁 7.CAS 8.总结 1.AQS 是什么? AQS 是类 AbstractQueuedSynchronizer的简称,也是常用锁的基类,比如常见的ReentrantLock,Semaphore,CountDownLatch 等等. AQS提供了一种实现阻塞锁和一系列依赖FIFO等待队列的同步器的框架.是Java提供的一种模板

  • 带你快速搞定java多线程(3)

    目录 一.锁的概念 二.synchronized 的使用方式 三.synchronized 的实现原理列 小结 四.线程池是什么 五.为什么要用线程池? 六.看下类图,从整体上理解下 七.线程池的创建 八.线程池核心参数说明 九.几个疑问点 9.1.是怎么保证线程不销毁的? 9.2 提交任务有哪几种方式? 9.3 拒绝策略都有哪些? 9.4 线程池的关闭 9.5 初始化线程池时线程数的选择 十.总结 一.锁的概念 先来聊聊这几个概念,总不能聊起来的时候啥也不知道,只知道干活也没有用. 公平锁:当

  • 带你快速搞定java并发库

    目录 一.总览 二.Executor总览 三.继承结构 四.怎么保证只有一个线程 五.怎么保证时间可以定时执行 六.使用 总结 一.总览 计算机程序 = 数据 + 算法. 并发编程的一切根本原因是为了保证数据的正确性,线程的效率性. Java并发库共分为四个大的部分,如下图 Executor 和 future 是为了保证线程的效率性 Lock 和数据结构 是为了维持数据的一致性. Java并发编程的时候,思考顺序为, 对自己的数据要么加锁.要么使用提供的数据结构,保证数据的安全性 调度线程的时候

  • 带你快速搞定java多线程(5)

    目录 1.介绍 2.countdownlantch的用法. 3.如何利用AQS 实现 CountDownLatch 4.总结 1.介绍 CountDownLantch 倒数计时器,一个同步辅助类,一个线程(或者多个),等待另外N个线程完成某个事情后才能执行.用给定的计数初始化CountDownLatch,其含义是要被等待执行完的线程个数. 每次调用CountDown(),计数减1,执行到await()函数会阻塞等待线程的执行,直到计数为0. CountDownLantch 无法重置 2.coun

  • 带你快速搞定java多线程(2)

    目录 1.Future的类图结构,从整体上看下Future的结构 2.future的使用,说的再多都么什么用,来个例子悄悄怎么用的. 3.通俗理解 4.原理 5.总结 1.Future的类图结构,从整体上看下Future的结构 首先看下future接口的函数,共有5个方法. get() 获取执行的结果,另外一个重载是有时间限制的get ,如果超时会有异常 isDone() 判断future 结果是否处理完成 cancel 取消任务 2.future的使用,说的再多都么什么用,来个例子悄悄怎么用的

  • 带你轻松搞定Java面向对象的编程--数组,集合框架

    目录 一.数组 1.数组的定义 2.数组的声明 3.数组的初始化 二.集合概述 三.Collection接口 1.Collection接口概述 2.集合框架的三个组件 3.Iterator接口 四.List接口 1.ArrayList类 2.LinkedList类 五.Set接口 1.HashSet类 六.Map接口 1.HashMap类 七.泛型 总结 一.数组 1.数组的定义 数组是为了解决同类数据整合摆放而提出的,可以理解为一组具有相同类型的变量的集合,它的每个元素都具有相同的数据类型.

  • 带你快速搞定Mysql优化

    目录 1.查询语句的执行顺序 2.数据类型的选择 3.索引优化 主键索引 多列索引 4.查询性能优化 1.查询的生命周期 2.SELECT语句尽量指明查询字段名称 3.小表驱动大表 总结 1.查询语句的执行顺序 select[distinct]   from   join(如left join)   on   where   group by   having   union   order by   limit 执行顺序: from where 聚 having order limit 1.f

随机推荐