Java_数组
数组
1.概念
需求:现在需要统计软件技术1班47名同学的成绩情况,例如计算平均成绩、最高成绩等。如果只能使用变量的话,那么需要定义100个变量,这样就比较复杂了。这时我们就可以使用数组
来记住这47名同学的成绩,然后使用数组来操作就可以了。
概念:数组(Array)是用于存储多个相同数据类型的集合。想要获取数组的值,可以通过下标来获取,下标是从0开始的。

2.创建数组
创建数组的方式一般分为:动态初始化和静态初始化两种方式。
2.1.动态初始化
-
新建int[],长度是5
-
刚创建好的数组都是默认值0,int类型的数据默认值是0
-
把数组的地址值给变量a保存
int[] a = new int[5];
2.2.静态初始化
静态初始化只创建有初始值的方式,分为以下两种方式:
int[] a ={1,2,3,4,5,6,7,8};
int[] a =new int[]{1,2,3,4,5};
创建好的数组可以通过length()
方法获取它的长度,数组一旦创建,长度不可改变,允许0长度的数组。
练习:数组存入hello。
package cn.sccs.array;//这个类用来测试 数组的创建
public class Test6_Array {public static void main(String[] args) {//1、创建数组 ,存入hello//--静态初始化 :一开始刚创建好时,存的都是默认值,char类型默认值是\u0000。char[] a = new char[] { 'h' , 'e' , 'l' ,'l' ,'o' } ;char[] b = { 'h' , 'e' , 'l' ,'l' ,'o' } ; //--动态初始化,需要在创建数组的同时,指定长度!!char[] c = new char[5];c[0] = 'h' ; //把下标为0的数据,从默认值\u0000改为'h'c[1] = 'e' ;//把下标为1的数据,从默认值\u0000改为'e'c[2] = 'l' ;//把下标为2的数据,从默认值\u0000改为'l'c[3] = 'l' ;//把下标为3的数据,从默认值\u0000改为'l'c[4] = 'o' ;//把下标为4的数据,从默认值\u0000改为'o'//数组的长度如果是5,下标最大值是4的话,有没有下标为5的元素---没有!!!//java.lang.ArrayIndexOutOfBoundsException:原因就是访问了不存在的下标5//c[5] = 'x';System.out.println(a.length);System.out.println(b.length);System.out.println(c.length);}
}
public class ArrayTest01 {public static void main(String[] args) {/** 数组的索引从下标0开始,访问元素通过数组名[index]* 数组都具有默认值: * int:0* float:0.0* string: '\u0000'* boolean:false* 引用类型:null* 数组注意事项:* 1.直接打印数组名是一个地址值* 2.访问数组元素时,不能下标越界* 3.如果数组没有任何引用,那么数组将出现空指针异常* */int[] arr = new int[5];System.out.println(arr); // [I@776ec8dfSystem.out.println(arr[0]);arr[0] = 10;System.out.println(arr[0]);arr = null;System.out.println(arr[0]); // NullPointerException}
}
以上代码对应内存:
3.数组的常见操作
3.1.数组的遍历
遍历指:从头到尾,依次访问数组中元素的位置。
- 形式:
for(int i=0;i<a.length;i++){syso(a[i]);
}
练习1:输出每个月的天数。
public static void method() {//1、创建数组,存放12个数字int[] a = { 31,28,31,30,31,30,31,31,30,31,30,31 };
// System.out.println(a[0]);
// System.out.println(a[1]);
// System.out.println(a[2]);
// System.out.println(a[3]);//2、遍历数组//int i = 0 是指从下标0开始 ,i表示下标// i <= a.length-1 是指下标最大值是数组的长度-1//i++ 是指下标依次递增,向后遍历数据for( int i = 0 ; i <= a.length-1 ; i++ ){ //3、a[i]是指根据下标i获取a数组中的元素
// System.out.println( a[i] );//数组一共12个数字,i的变化就是0-11,那么i+1就能获取1-12月了System.out.println( i+1 +"月有"+a[i]+"天" );}}
练习2:遍历数组,存入1到10。
public class Test7_数组遍历 {public static void main(String[] args) {int[] arr=new int[10];for (int i = 0; i < arr.length; i++) {arr[i]=i+1;}System.out.println(Arrays.toString(arr));}
}
练习3:创建随机数组。
import java.util.Arrays;
import java.util.Random;public class t {public static void main(String[] args) {int[] a = new int[5];for (int i = 0; i < a.length; i++) {a[i]=1+new Random().nextInt(100);}System.out.println(Arrays.toString(a));}
}
3.2.求数组中的最大值
求数组中的最大值的思路:
- 创建一组数组;
- 定义零时变量max,假定它是数组的第一个元素,且是最大的;
- 判断它和下一个元素谁大,将最大值交给变量max。
// 求数组最大值
public class ArrayTest02 {public static void main(String[] args) {int[] arr = {123,456,99,111,88,223};// 定义初始化变量int max = arr[0];for (int i = 0; i < arr.length; i++) {// 判断最大值if (arr[i] > max) {max = arr[i];}}System.out.println("数组中最大值是:" + max);}
}
3.3.数组的排序
数组常用的排序方式有3种:选择法排序、冒泡法排序、快速排序(工具类Arrays)。
- **冒泡排序:**相邻位置比较,从小到大排序,如果小就往前换。i代表从头到尾遍历循环数据。
// 冒泡排序
public class ArrayTest03 {public static void main(String[] args) {int[] arr = {4,1,5,2,3};// 升序 1,2,3,4,5 比较次数=元素个数-1for (int i = 0; i < arr.length - 1; i++) {// -i是随着i的自增而减少for (int j = 0; j < arr.length -1 - i; j++) {// 判断相邻元素的比较if (arr[j] > arr[j+1]) {// 定义临时变量记住j上的元素int temp = arr[j];arr[j] = arr[j+1];arr[j+1] = temp;}}}for (int i = 0; i < arr.length; i++) {System.out.println(arr[i]);}// 降序?--将大于改为小于}
}
4.多维数组
在程序中可以通过一个数组来保存某个班级学生的成绩,试想一下,如果要统计一下一个学校各个班级学生的成绩,又该如何实现呢?
这种场景我们就要使用多维数组的方式去实现了。而最常见的多维数组是二维数组。
4.1.定义格式
与一维数组相同,二维数组的定义格式也分为静态初始化和动态初始化。格式为:
- 动态初始化:
数据类型[][] 数组名 = new 数据类型[长度1][长度2];
- 静态初始化:
数据类型[][] 数组名 = {{元素1,元素2},{元素3,元素4},{元素5,元素6}};
// 二位数组
public class ArrayTest04 {public static void main(String[] args) {// 创建长度为3的二维数组,保存了3个一维数组,每个一位数组有2个元素int[][] arr = {{1,2},{3,4},{5,6}};System.out.println(arr); // [[I@776ec8dfSystem.out.println(arr[0]); // [I@4eec7777 通过0索引拿到第一个一维数组// 通过索引获取元素System.out.println(arr[0][0]);}
}
以上代码内存示意图:
4.2.二维数组的常用操作
- 遍历
// 遍历
for (int i = 0; i < arr.length; i++) {for (int j = 0; j < arr[i].length; j++) {System.out.println(arr[i][j]);}
}
- **练习:**需求如下:
- 定义一个二维数组,二维数组中每个一维数组保存了每个班级的分数
- 统计每个班级的总分数
- 统计所有班级的总分数
// 二维数组统计班级总分数
public class ArrayTest05 {public static void main(String[] args) {int[][] arr = {{89,78,90,100},{98,97,67,88},{76,83,88,95}};int total = 0; // 定义所有班级的总分数求和变量for (int i = 0; i < arr.length; i++) {int sum = 0; // 定义求和初始化变量for (int j = 0; j < arr[i].length; j++) {sum += arr[i][j]; }// 单个班级的总分数System.out.println("第"+ (i+1) + "班的总分数为" + sum);total += sum;}System.out.println("所有班级的总分数为:" + total);}
}
5.数组API–Arrays
关于数组的操作,Java给我们提供了一个工具类Arrays
,我们可以用它实现一些关于数组的简便操作。Arrays
在java.util.Arrays;
包中。它的常用方法如下:
5.1.toString()方法
Arrays.toString()
方法:快速以字符串的形式输出数组元素。
int[] a = {3,4,1,2,5,6};
System.out.println(Arrays.toString(a)); // [3, 4, 1, 2, 5, 6]
5.2.sort()方法
-
**
Arrays.sort()
方法:**给数组排序,默认升序。该方法有如下两种重载方式:Arrays.sort(数组名):
以升序方式给数组排序
int[] a = {3,4,1,2,5,6}; Arrays.sort(a); System.out.println(Arrays.toString(a)); // [1, 2, 3, 4, 5, 6] / 降序-需要使用包装类 Integer[] arr01 = {3,4,1,2,5,6}; Arrays.sort(arr01, Collections.reverseOrder()); System.out.println(Arrays.toString(arr01));
Arrays.sort(数组名,起始下标,排序个数):
自定义区间排序
// 区间排序 int[] arr = {1,4,3,8,2,9,11,3}; Arrays.sort(arr,2,5); System.out.println(Arrays.toString(arr)); // [1, 4, 2, 3, 8, 9, 11, 3]
5.3.equals()方法
- **
Arrays.equals()
方法:**比较两个数组内容是否相等。
int[] x = {1,2,3};
int[] y = {3,2,1};
System.out.println(Arrays.equals(x,y)); // false
注意:Arrays.equals()是比较数组内容,而a.equals(b) 这样的方法是比较地址值。
以后使用java提供的引用数据内容(数组、字符串、各种集合....)时,一定要用equals()方法比较内容是否相等,而不是傻傻的用 ==了!因为官方已经把equals()给重写了。如果你要比较你自己写的类,例如学生按成绩排序,就要自己重写equals()方法
5.4.binarySearch()方法
Arrays.binarySearch(数组名,要查找的值)
方法:在数组中查找元素,只要返回值>=0就表示已经找到,若没找到,则返回插入点-1_(插入点为这个数值应放入的位置)。
int[] arr03 = {1,5,6,7};
System.out.println(Arrays.binarySearch(arr03,1)); // 0
System.out.println(Arrays.binarySearch(arr03,3)); // -2
5.5.copyOf()方法
Arrays.copyOf()
方法:拷贝数组。参数有两个,第一个为原数组,第二个为拷贝长度。返回值为新数组。
int[] arr04 = {1,3,5,7,8,9,10};
int[] arr05 = Arrays.copyOf(arr04,5);
System.out.println(Arrays.toString(arr05));
若没找到,则返回插入点-1_(插入点为这个数值应放入的位置)。
int[] arr03 = {1,5,6,7};
System.out.println(Arrays.binarySearch(arr03,1)); // 0
System.out.println(Arrays.binarySearch(arr03,3)); // -2
5.5.copyOf()方法
Arrays.copyOf()
方法:拷贝数组。参数有两个,第一个为原数组,第二个为拷贝长度。返回值为新数组。
int[] arr04 = {1,3,5,7,8,9,10};
int[] arr05 = Arrays.copyOf(arr04,5);
System.out.println(Arrays.toString(arr05));
IDE
相关文章:

Java_数组
数组 1.概念 需求:现在需要统计软件技术1班47名同学的成绩情况,例如计算平均成绩、最高成绩等。如果只能使用变量的话,那么需要定义100个变量,这样就比较复杂了。这时我们就可以使用数组来记住这47名同学的成绩,然…...

list与vector的区别
相信大家已经学过list与vector,关于它们的不同,我做了一些总结,如下表: vector list底层结构动态顺序表,一段连续的空间带头结点的双向链表随机访问支持随机访问,访问某个元素的效率…...

【C++、数据结构】位图、布隆过滤器、哈希切割(哈希思想的应用)
文章目录📖 前言1. 位图1.1 海量数据处理思路分析:1.2 位图的具体实现:1.3 用位图解决问题:应用一:应用二:应用三:2. 布隆过滤器2.1 布隆过滤器的概念:2.2 布隆过滤器的测试…...

计算机网络安全基础知识3:网站漏洞,安装phpstudy,安装靶场漏洞DVWA,搭建一个网站
计算机网络安全基础知识3:网站漏洞,安装phpstudy,安装靶场漏洞DVWA,搭建一个网站 2022找工作是学历、能力和运气的超强结合体,遇到寒冬,大厂不招人,可能很多算法学生都得去找开发,测…...

大话数据结构-迪杰斯特拉算法(Dijkstra)和弗洛伊德算法(Floyd)
6 最短路径 最短路径,对于图来说,是两顶点之间经过的边数最少的路径;对于网来说,是指两顶点之间经过的边上权值之和最小的路径。路径上第一个顶点为源点,最后一个顶点是终点。 6.1 迪杰斯特拉(Dijkstra&am…...

2023年全国最新食品安全管理员精选真题及答案10
百分百题库提供食品安全管理员考试试题、食品安全员考试预测题、食品安全管理员考试真题、食品安全员证考试题库等,提供在线做题刷题,在线模拟考试,助你考试轻松过关。 91.实施日常检查,如果违反关键项的,应当即作出如…...

Unity常见面试题详解(持续更新...)
一丶声明、定义、实例化、初始化 1、首先我们来讨论在C/C中的声明和定义.. 1)我们先从函数声明和定义说起... 一般我们在C里都会先定义一个函数,然后再Main函数前将函数声明,比如: //函数声明 int Add(int);int Main {} //函数…...

java高级篇之三大性质总结:原子性、可见性以及有序性
1. 三大性质简介 在并发编程中分析线程安全的问题时往往需要切入点,那就是两大核心:JMM抽象内存模型以及happens-before规则(在这篇文章中已经经过了),三条性质:原子性,有序性和可见性。关于sy…...

真涨脸,我用 Python 为朋友自动化整理表格
今天,在工作的时候,我的美女同事问我有没有办法自动生成一个这样的表格: 第一列是院校科目,第二列是年份,第三列是数量。 这张表格是基于这一文件夹填充的,之前要一个文件夹一个文件夹打开然后手动填写年份…...

MySQL学习笔记(1.操作数据库与数据的SQL)
1. 下载安装 参照:MySQL8.0下载安装_凯尔萨厮的博客-CSDN博客 2. MySQL启动与停止 方式(1).我的电脑>右键>管理>服务和应用程序>服务>(或在windows搜索栏输入services.msc) 找到MySQL80,右键启动或停止 方式(2…...

C++——特殊类设计
目录 不能被拷贝的类 只能在堆上创建对象的类 只能在栈上创建对象的类 不能被继承的类 只能创建一个对象的类(单例模式) 饿汉模式 懒汉模式 单例对象释放问题 不能被拷贝的类 C98:将拷贝构造函数与赋值运算符重载只声明不定义,并且将其访问权…...

Scratch少儿编程案例-植物大战僵尸-趣味角色版
专栏分享 点击跳转=>Unity3D特效百例点击跳转=>案例项目实战源码点击跳转=>游戏脚本-辅助自动化点击跳转=>Android控件全解手册点击跳转=>Scratch编程案例👉关于作者...

Vue的路由守卫
对于绝大部分的网站而言,都是有个人主页的,但是你如果没登陆的话,还能访问个人主页吗? 从逻辑上来讲,那肯定是不行的。 所以,要怎么阻止没登录状态下去访问个人主页呢? 就是利用路由守卫&#x…...

【算法】151. 反转字符串中的单词
链接:https://leetcode.cn/problems/reverse-words-in-a-string/给你一个字符串 s ,请你反转字符串中 单词 的顺序。单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。返回 单词 顺序颠倒且 单词 之间用单个空格连接的结…...

Azure AI基础到实战(C#2022)-认知服务(2)
目录 ComputerVisionClient Class定义构造函数属性上一节例子Task.Wait 方法其它部分分析winform调用认知服务代码剖析1、调用参数2、定义ComputerVisionClient对象,准备调用 REST API3、Authenticate4、调用REST API,这是重点和关键(1)Lambda 表达式和匿名函数(2)async(3)…...

并发就一定快吗?答:肯定不是啊
文章目录一、多线程概念1.1 程序的并发与并行1.1.1 程序的并行1.1.2 程序的并发1.2 进程与线程1.2.1 进程1.2.2 线程1.2.3 多线程并发就一定快吗?答案直接戳这里👉:多线程并发就一定快吗? 一、多线程概念 在实际应用中ÿ…...

前端的学习路线和方法
一些前端工程师面临的现状 1.没有系统的的学习基础知识 2.技术上存在短板,说句不好听的话,大多数开发者的上升通道都没有明确的路线,大公司还好,小公司基本都是后端作为开发组组长 3.前端各种技术层出不穷,需要花费…...

用C语言写一个自己的shell-Part Ⅱ--execute commands
Part Ⅱ–execute commands Exec This brings us to the exec family of functions. Namely, it has the following functions: execlexecvexecleexecveexeclpexecvp For our needs,we will use execvp whose signature looks like this int execvp(const char *file, cha…...

案例实践|运营腾讯游戏,Proxima Beta 使用 Apache Pulsar 升级团队协作与数据治理...
文章摘要本文整理自 Pulsar Summit Asia 2022 上,Proxima Beta 软件工程师施磊的分享《How to achieve better team integration and data governance by using Apache Pulsar》。本文首先将为大家介绍 CQRS 和 Event Sourcing 概念,便于了解为何 Proxim…...

Hudi的7种索引
1、Bloom Index Bloom Index (default) 使用根据记录键构建的bloom过滤器,也可以使用记录键范围修剪候选文件.原理为计算RecordKey的hash值然后将其存储到bitmap中,为避免hash冲突一般选择计算3次 HoodieKey 主键信息:主要包含recordKey 和p…...

Linux内核(十三)系统软中断 software
文章目录中断概述Linux内核中断软中断相关代码解析软中断结构体软中断类型软中断两种触发方式函数__do_softirq解析定时器的软中断实现解析定时器相关代码总结Linux版本:linux-3.18.24.x 中断概述 中断要求 快进快出,提高执行效率,…...

Linux -- 查看进程 PS 命令 详解
我们上篇介绍了, Linux 中的进程等概念,那么,在Linux 中如何查看进程呢 ??我们常用到的有两个命令, PS 和 top 两个命令,今天先来介绍下 PS 命令~!PS 命令 :作用 &#x…...

C2科一考试道路通行规定
目录 低能见度等恶劣环境下的通行规定 驾驶机动车禁止行为 停车规定 通行常识 高速公路限速规定 三观不一样的人,无论重来多少次,结果都一样 他不会懂你的委屈 只是觉得自已没错 两个人真正的可悲连吵架都不在一个点上 有句话说得好 我要是没点自我…...

进程概念(详细版)
进程的概念本文主要介绍进程的相关知识 文章目录认识冯诺依曼体系结构操作系统的基本概念操作系统的作用是什么系统调用和库函数相关概念进程基本概念描述进程进程控制块(PCB)task_struct 结构体进程是如何被操作系统管理起来的先描述再组织描述好,组织好࿰…...

学习大数据应该掌握哪些技能
想要了解大数据开发需要掌握哪些技术,不妨先一起来了解一下大数据开发到底是做什么的~ 1、什么是大数据? 关于大数据的解释,比较官方的定义是指无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合,是需要新处理模…...

【spring】Spring Data --Spring Data JPA
Spring Data 的委托是为数据访问提供熟悉且符合 Spring 的编程模型,同时仍保留着相关数据存储的特殊特征。 它使使用数据访问技术、关系和非关系数据库、map-reduce 框架和基于云的数据服务变得容易。这是一个伞形项目,其中包含许多特定于给定数据库…...

mysql数据库之视图
视图(view)是一种虚拟的存在,视图中的数据并不在数据库中实际存在,行和列数据来自定义视图的查询中使用的表,并且是在使用视图时动态生成的。 通俗的讲,视图之保存了查询的sql逻辑,不保存查询结…...

数据库事务详解
概述事务就是数据库为了保证数据的原子性,持久性,隔离性,一致性而提供的一套机制, 在同一事务中, 如果有多条sql执行, 事务可以确保执行的可靠性.数据库事务的四大特性一般来说, 事务是必须满足 4 个条件(ACID):原子性(Atomicity&…...

Nessus: 漏洞扫描器-网络取证工具
Nessue 要理解网络漏洞攻击,应该理解攻击者不是单独攻击,而是组合攻击。因此,本文介绍了关于Nessus历史的研究,它是什么以及它如何与插件一起工作。研究了Nessus的特点,使其成为网络取证中非常推荐的网络漏洞扫描工具…...

操作系统实战45讲之现代计算机组成
我以前觉得计算机理论不让我感兴趣,而比较喜欢实践,即敲代码,现在才发现理论学好了,实践才能有可能更顺利,更重要的是理论与实践相结合。 在现代,几乎所有的计算机都是遵循冯诺依曼体系结构,而遵…...