首页 / JAVA / Java学习笔记Part10-数组
Java学习笔记Part10-数组
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Java学习笔记Part10-数组,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含10303字,纯文字阅读大概需要15分钟。
内容图文
9 数组
9.1 什么是数组
数组(Array)是一种引用数据类型,可以解决大量数据的命名问题和大量数据存储和传递问题。
9.2 数组的创建
数组的创建分为静态创建和动态创建两种
静态创建;
数据类型[] 数组名={数据};
数据类型[] 数组名=new 数据类型[]{数据};
数组中的每一个数据叫元素,数组中的元素类型都是相同或者相近的。(可以在double[]里面放个float,但不可以在String[]中放个float)(隐式类型转换)
动态创建:
动态:当数组创建时,我们还不确定里面对的值是什么,仅仅知道数据的个数
数据类型[] 数组名 = new 数据类型[数据的长度];
数组的长度:数组的元素个数
code:
public class code01 {
public static void main(String[] args) {
int[] stuCNScore = {100,98,115,72,96};
int[] stuENScore = new int[]{101,120,119,118,95};
int[] stuMathsScore = new int [5];
}
}
9.3 数组的属性,特点,使用细节
数组的索引机制:
索引:多个数据虽然使用同一个标识符,但每个数据默认都有自己的编号。索引由数组自动生成并维护,默认第一个元素的索引为0,后面的索引依次递增。索引本身是整数 int。
访问数组中的元素:数组名[索引值]
修改数组中的元素:数组名[索引值] = 新值
或许数组长度属性:数组名.length
确定索引范围:0~(数组长度-1)
数组的特点:
-
内存特点:内存分为栈内存和堆内存,栈内存主要用于执行方法,存储量相对较小;堆内存用于存出大量数据,存储量相对较大。创建数组的时候,在堆内存上开辟出一段连续空间,用于存储数组中的元素,栈内存上实际存储的是数组首元素的地址,栈内存存储机制其实就是引用堆内存中的数据。
基本数据类型创建的变量存储在栈内存中,是方法中的,内部的局部的变量。数据量比较小,一种临时的使用。
引用数据类型创建的变量存储在堆内存中,栈内存引用堆内存上的地址,占用两块。数据量比较大,一种持久的使用。 -
数组一旦创建,长度是不可改变的。
-
数组存储数据增加和删除数据比较麻烦。但是根据索引访问数据非常快。
数组根据索引查询数据的方式是计算得来的。目标元素的地址=首元素地址+索引+数据长度,通过较少次数的运算就可以快速定位元素,即使数组元素非常多,依据索引查询数据也是极快的。 -
数组存储数据的特点
数组的数据在内存上是连续的
根据索引查询数据快
面对数据的增加和删除 需要大量移动元素或者重新创建数组
一般经常修改或者查询,但是基本不会增加和删除的数据适合使用数组存储
9.4 数组的遍历
-
使用for循环遍历
-
使用增强型for循环——foreach循环遍历
针对于数组的增强型for循环,简化了for循环
for(数据类型 临时变量名:数组名){循环体}
foreach循环在写法上更为简单,没有索引
而for循环通过索引查询元素,在循环内部可以通过索引修改元素
code:
public class code03 {
public static void main(String[] args) {
int[] array = {13,54,24,76,45,53,23};
//for循环
for (int index = 0; index < array.length; index++){
System.out.print(array[index]+"\t");
}
//foreach循环
System.out.println();
for (int i:array){
System.out.print(i+"\t");
}
}
}
9.5 查找数组中的最大值,最小值及其索引
code:
public class code04 {
public static void main(String[] args) {
int[] arr = {12,45,78,35,49,65,33,1};
int max=arr[0];
int maxIndex=0;
int min = arr[0];
int minIndex= 0;
for (int i = 0; i < arr.length; i++) {
if(max<=arr[i]){
max=arr[i];
maxIndex=i;
}
if(min>=arr[i]){
min=arr[i];
minIndex=i;
}
}
System.out.println("最大值为:"+max);
System.out.println("最大值索引为"+maxIndex);
System.out.println("最小值为:"+min);
System.out.println("最小值索引为"+minIndex);
}
}
9.6 查找数组中元素的索引
code:
public class code05 {
public static void main(String[] args) {
int target = 1;
int index = -1, _index = -1;
int[] arr = {455,123,4,1,3,6545,8,689,1,864,18648,385,86};
//查找元素第一次出现位置
for (int i = 0; i < arr.length; i++){
if (arr[i] == target){
index = i;
break;
}
}
for (int i = arr.length-1; i>=0; i--){
if(arr[i] == target){
_index = i;
break;
}
}
System.out.println("数据第一次出现索引为"+index);
System.out.println("数据最后一次出现索引为"+_index);
System.out.println(index==_index?"数据仅出现一次":"数据出现多次");
}
9.7 数组的合并(向数组中追加元素)
code:
public class code06 {
public static void main(String[] args) {
int[] a={1,2,3,4,5,6,7,8,9};
int[] b={11,22,33,44,55,66,77,88,99};
int[] c = new int[a.length+b.length];
for(int i =0;i<a.length;i++){
c[i]=a[i];
}
for(int i=0;i<b.length;i++){
c[a.length+i]=b[i];
}
for(int x:c){
System.out.print(x+"\t");
}
}
}
练习:在arr数组中索引为x 的位置 插入一个元素 n(arr为int[])
code:
public class code07 {
public static int[] addEle(int[]arr, int x, int n){
int[] nArr = new int[arr.length+1];
for (int i = 0; i < x; i++){
nArr[i] = arr[i];
}
nArr[x] = n;
for (int i = x+1; i < nArr.length; i++){
nArr[i] = arr[i-1];
}
return nArr;
}
public static void main(String[] args) {
int[] array = {1,2,3,4,5,7,8,9,10};
for (int i:array){
System.out.print(i+" ");
}
System.out.println();
array = addEle(array,5,6);
for (int i:array){
System.out.print(i+" ");
}
}
}
9.8 数组的缩容(删除数组中的元素)
- 移动元素方案:
好处:不需要创建新数组,省内存,快。坏处:容易造成数组结尾有闲置元素位。单独与需要一个变量来统计数组中有效元素的个数。 - 创建新数组方案:
好处:不会有空余元素位。坏处:需要重新创建数组。
code:
public class code08 {
public static void main(String[] args) {
int[] array1 = {1,2,3,4,5,6,7,8,9,10};
int size_array1 = array1.length;
int[] array2 = {1,2,3,4,5,6,7,8,9,10};
int delIndex = 4;
//移动元素方案
for (int i = delIndex;i < array1.length-1;i++){
array1[i] = array1[i+1];
}
array1[array1.length-1] = 0;
size_array1-=1;
for (int i = 0; i < size_array1; i++){
System.out.print(array1[i] + "\t");
}
System.out.println();
//创建新数组方案
int[] nArr = new int[array2.length-1];
for (int i = 0; i < delIndex; i++){
nArr[i] = array2[i];
}
for (int i = delIndex; i < array2.length-1; i++){
nArr[i] = array2[i+1];
}
array2 = nArr;
for (int i : array2){
System.out.print(i + "\t");
}
}
}
9.9 练习
int[] arr={12,4,5,6,85,54,74,95,65,82,26,34};
将上述数组中的奇数和偶数分别存放于不同的两个数组
code:
public class code09 {
private static void printArr(int[] arr){
for(int i: arr){
System.out.print(i+"\t");
}
System.out.println();
}
public static void main(String[] args) {
int[] arr={12,4,5,6,85,54,74,95,65,82,26,34};
int a_size = 0, b_size = 0; //偶数个数
for(int i:arr){
if(i % 2 == 0){
b_size++;
}
else {
a_size++;
}
}
int[] a = new int[a_size], b = new int[b_size];
int aIndex = 0, bIndex = 0;
for(int i:arr){
if(i % 2 == 0){
b[bIndex] = i;
bIndex++;
}
else {
a[aIndex] = i;
aIndex++;
}
}
printArr(arr);
System.out.print("奇数:");
printArr(a);
System.out.print("偶数:");
printArr(b);
}
}
9.10 Arrays 工具类
Arrays是JRE中Java基本类库提供的一个数组工具类,封装了一些排序,查找极值,遍历输出等操作。
Arrays.sort
:排序Arrays.binarySearch
:二分查找:如果找到元素返回索引,没找到返回负数,使用时要求数组必须是升序的。Arrays.toString
返回1给定数组的字符串表达式Arrays.copyOf
复制数组
code:
import java.util.Arrays;
public class code10 {
public static void main(String[] args) {
int[] arr={12,4,5,6,85,54,74,95,65,82,26,34};
System.out.println(Arrays.toString(arr));
Arrays.sort(arr);
System.out.println(Arrays.toString(arr));
System.out.println("元素74的索引是"+Arrays.binarySearch(arr,74));
System.out.println(Arrays.toString(arr));
int[] arr2 = Arrays.copyOf(arr,6);
System.out.println(Arrays.toString(arr2));
}
}
9.11 数组的复制
数组名是数组的引用地址,这就导致当赋值的时候,只是把引用地址拷贝过去,而不是创建新数组。
数据类型 新数组 = Arrays.copyOf(旧数组,目标长度);
System.arraycopy(旧数组,起始索引,目标数组,目标索引,数据长度);
其实Arrays.copyOf内部还是System.arraycopy实现的啦
code:
import java.util.Arrays;
public class code11 {
public static void main(String[] args) {
int[] arr = {1,2,3,4,5,6,7,8,9,10};
System.out.println(Arrays.toString(arr));
int[] arr2 = Arrays.copyOf(arr,5);
System.out.println(Arrays.toString(arr2));
int[] arr3 = new int[6];
System.arraycopy(arr,2,arr3,1,5);
System.out.println(Arrays.toString(arr3));
}
}
9.12 数组的冒泡排序算法
从第一个元素开始,一次对比相邻的两个元素,如果发现前边的元素比后边的元素大,那么进行位置互换,第一轮对比互换结束,可以保证最大的元素一定在最后;第二轮对比互换,能够保证次大的元素一定在倒数第二位。以此类推,进行到第length-1轮,排序完成
code:
import java.util.Arrays;
public class code12 {
public static void main(String[] args) {
int[] arr = {5,9,6,7,1,4,8,3,2,1};
System.out.println(Arrays.toString(arr));
//j:控制对比互换执行轮数
for (int j = 0; j < arr.length-1; j++){
//完成一轮元素的对比互换
for (int i = 0; i < arr.length-1-j; i++){
//如果发现前面的元素比后面的元素大
if(arr[i] > arr[i+1]){
//前后元素位置互换
int temp = arr[i];
arr[i] = arr[i+1];
arr[i+1] = temp;
}
}
}
System.out.println(Arrays.toString(arr));
}
}
练习 从键盘录入学生人数和每个学生的姓名以及分数 按照分数降序输出 学生名次 学生姓名 学生分数
code:
import java.util.Scanner;
public class code13 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("请输入学生人数: ");
int stuNum = sc.nextInt();
String[] stuName = new String[stuNum];
int[] stuScore = new int[stuNum];
for (int i = 0; i < stuNum; i++){
System.out.print("请输入第"+(i+1)+"个学生的姓名:");
stuName[i] = sc.next();
System.out.print("请输入第"+(i+1)+"个学生的分数:");
stuScore[i] = sc.nextInt();
}
sc.close();
for (int j = 0; j < stuScore.length-1; j++){
for (int i = 0; i < stuScore.length-1-j; i++){
if (stuScore[i]<stuScore[i+1]){
int temp = stuScore[i];
stuScore[i] = stuScore[i+1];
stuScore[i+1] = temp;
String temp1 = stuName[i];
stuName[i] = stuName[i+1];
stuName[i+1] = temp1;
}
}
}
for (int i = 0; i < stuName.length; i++){
System.out.println("第"+(i+1)+"名 "+stuName[i]+" 分数:"+stuScore[i]+"分");
}
}
}
9.12 二维数组
一个元素是数组的数组。
二维数组的创建:
-
静态创建:
数据类型 [][] 数组名={{},{},}{}....};
数据类型[][] 数组名=new 数据类型[][]{{},{},{}......};
-
动态创建:
数据类型 [][] 数组名=new 数据类型[外围数组长度][内部数组长度];
二维数组的遍历:
使用循环。
二维数组应用:
? 从键盘录入学生人数 考试科目数 以及每个学生的每科分数
? 输出每个学生的最高分 最低分 总分 平均分
code:
import java.util.Scanner;
public class code14 {
public static void main(String[] args) {
Scanner sc =new Scanner(System.in);
System.out.println("请录入学生人数");
int r=sc.nextInt();
System.out.println("请录入考试科目数");
int k =sc.nextInt();
int[][] grade=new int[r][k];
// 录入分数的过程
/*控制录入的学生*/
for (int i = 0; i <r ; i++) {
System.out.println("请录入第"+(i+1)+"个学生的成绩");
// 控制录入的科目
for (int j = 0; j <k ; j++) {
System.out.println("请录入第"+(i+1)+"个学生的第"+(j+1)+"科成绩");
grade[i][j]=sc.nextInt();
}
}
// 计算和输出分数的过程
for (int i = 0; i <r ; i++) {
// 计算一个学生所有科目的分数
int sum=0;
int max=grade[i][0];
int min=grade[i][0];
for (int j = 0; j <k ; j++) {
// 求一个学生的分数和
sum+=grade[i][j];
/*求一个学生的最高分*/
if (max < grade[i][j]) {
max=grade[i][j];
}
/*求一个学生的最低分*/
if (min > grade[i][j]) {
min=grade[i][j];
}
}
System.out.println("第"+(i+1)+"个学生的总分为:"+sum+"\t最高分:"+max+"\t为最低分:"+min+"\t为平均分为:"+(sum*1.0/k));
}
sc.close();
}
}
内容总结
以上是互联网集市为您收集整理的Java学习笔记Part10-数组全部内容,希望文章能够帮你解决Java学习笔记Part10-数组所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。