五、 java中数组
定义数组的两种方式
class myarray1 {
public static void main(String[] args) {
//1.如何定义一个数组
//1.1数组的声明
String[] names;
int scores[];
//1.2初始化
//第一种:静态初始化:初始化数组与给数组元素赋值同时进行。
names = new String[]{"jeff","frank","xixi"}; //第二种:动态初始化:初始化数组与给数组元素赋值分开进行。
scores = new int[4];
//2.如何调用相应的数组元素:通过数组元素的下角标的方式来调用。
//下角标从0开始,到n -1 结束。其中n表示的数组的长度。
scores[0] = 87;
scores[1] = 89;
scores[3] = 98;
//3.数组的长度:通过数组的length属性。
System.out.println(names.length);//
System.out.println(scores.length);//4
//4.如何遍历数组元素
// System.out.println(names[0]);
// System.out.println(names[1]);
// System.out.println(names[2]);
for(int i = 0;i < names.length;i++){
System.out.println(scores[i]);
System.out.println(names[i]);
}
}
}
运行结果
3
4
87
jeff
89
frank
0//未赋值为0
xixi
未赋值的数组结果会打印什么
public class weifuzhi { public static void main(String[] args) {
// TODO Auto-generated method stub
//对于基于基本数据类型的变量创建的数组:byte short int long float double char boolean
//1.对于byte short int long 而言:创建数组以后,默认值为0
int[] scores = new int[4]; scores[0] = 89;
scores[3] = 90;
for(int i = 0;i < scores.length;i++){
System.out.println(scores[i]);
} byte[] scores1 = new byte[4];
scores1[0] = 89;
scores1[3] = 90;
for(int i = 0;i < scores1.length;i++){
System.out.println(scores1[i]);
}
} }
运行结果:
89
0
0
90
89
0
0
90
public class weifuzhi { public static void main(String[] args) {
//2.对于float double而言:默认值是0.0
float[] f = new float[3];
f[0] = 1.3f;
for(int i = 0;i < f.length;i++){
System.out.println(f[i]);
}
System.out.println();
} }
运行结果:
1.3
0.0
0.0
public class weifuzhi { public static void main(String[] args) {
//3.对于char而言:默认为空格
char[] c = new char[3];
c[0] = 'a';
for(int i = 0;i < c.length;i++){
System.out.println(c[i]);
}
System.out.println(); } }
运行结果:
a
public class weifuzhi { public static void main(String[] args) {
//4.对于boolean而言:默认为false
boolean[] b = new boolean[3];
for(int i = 0;i < b.length;i++){
System.out.println(b[i]);
}
} }
运行结果:
false
false
false
public class weifuzhi { public static void main(String[] args) {
//5.对于引用类型的变量构成的数组而言:默认初始化值为null。以String为例
String[] strs = new String[3];
strs[0] = "aa";
strs[1] = "bb";
//遍历数组的元素
for(int i = 0;i < strs.length;i++){
System.out.println(strs[i]);
}
System.out.println();
} }
运行结果:
aa
bb
null
那么,数组未定义和已定义在内存中是如何表现的呢。
借一张图,上图为内存结构的抽象图,在栈中存放局部变量和堆中变量实际引用的值的内存地址。堆中存放new开辟的内存空间及空间存放的值。
数组的生成
比如现在我们定义一个int[] scores = new int[4],这里做了两步操作,先在栈中生成局部变量scores,再在堆中开辟一块4个int大小的内存空间,在栈中将定义变量scores指向开辟的内存的起始地址。int类型开辟内存默认值为0。接下来要将我们动态赋值的数值放入指定的堆空间中,未赋值部分就是默认值。
静态初始化的操作步骤与上述基本一致,也是有默认开辟相应类型默认值的步骤,然后将后面的赋值部分存入堆的内存空间。
当我们之前定义的数组长度不够用了该怎么办。
public class short_array { public static void main(String[] args) {
// TODO Auto-generated method stub
int[] i = new int[]{12, 13, 14};
int[] j = new int[10]; for(int k = 0; k<i.length; k++){
j[k] = i[k];
} j[3] = 15;
j[4] = 16; for(int k = 0;k < j.length;k++){
System.out.println(j[k]);
} } }
运行结果:
12
13
14
15
16
0
0
0
0
0
例题:1.(1)定义类Pritimive,在类中定义一个有3个元素的boolean类型的数组t作为其成员变量。数组元素未赋值。
定义类TestPritimive,在TestPritimive的main()方法中创建Pritimive对象d,输出其成员变量t的三个元素值。
(2)给对象d的成员变量t赋值为{true,true,true},并输出t的三个元素值。
public class array_class {
public static void main(String[] args) {
//创建Pritimive的对象d
Pritimive d = new Pritimive();
//遍历d的数组元素
for(int i = 0;i < d.t.length;i++){
System.out.println(d.t[i]);
}
//给d的数组元素重新赋值
d.t[0] = true;
d.t[1] = true;
d.t[2] = true;
for(int i = 0;i < d.t.length;i++){
System.out.println(d.t[i]);
} }
}
class Pritimive{
boolean[] t = new boolean[3];
}
运行结果
false
false
false
true
true
true
从键盘读入学生成绩,找出最高分,并输出学生成绩等级。
{成绩>=最高分-10 等级为’A’
成绩>=最高分-20 等级为’B’
成绩>=最高分-30 等级为’C’
其余 等级为’D’}
import java.util.Scanner;
public class students_scores { public static void main(String[] args) {
// 创建scanner对象,键入学生个数
Scanner s = new Scanner(System.in);
System.out.println("student人数");
int count = s.nextInt();//count用来计数
//根据键入人数创建数组
int[] scores = new int[count];
int maxScore = scores[0];
//一次键入学生成绩,赋给相应数组元素,并获取最高分
System.out.println("请输入第" + count + "个成绩:");
for(int i=0; i<scores.length;i++){
int score = s.nextInt();
scores[i] = score;
if(scores[i]>maxScore){
maxScore = scores[i];
}
}
//遍历学生成绩的数组,并根据学生成绩与最高分的差值,赋予相应的等级,并输出
System.out.println("最高分为:" + maxScore);
for(int i = 0;i < scores.length;i++){
char level;
if(scores[i] >= maxScore - 10){
level = 'A';
}else if(scores[i] >= maxScore - 20){
level = 'B';
}else if(scores[i] >= maxScore - 30){
level = 'C';
}else{
level = 'D';
} System.out.println("student " + i + " score is " + scores[i] + " grade is " + level); } }
}
二维数组
初始化
public class array2 { public static void main(String[] args) {
// TODO Auto-generated method stub
//定义一个二维数组
int[][] scores;
//二维数组初始化
//静态初始化
scores= new int[][]{{1,2},{2,8},{6,6,6,6}};
String[][] names;
//动态初始化1
names = new String[3][2];
//动态初始化2
names = new String[3][];
names[0] = new String[2];
names[1] = new String[1];
names[2] = new String[3]; } }
赋值操作
public class array2 { public static void main(String[] args) {
//引用具体的某一个元素
int[][] fuzhi = new int[3][2];
fuzhi[0][1] = 12;
fuzhi[2][1] = 33;
} }
二维数组的长度
public class array2 { public static void main(String[] args) {
// TODO Auto-generated method stub
//定义一个二维数组
int[][] scores;
//二维数组初始化
//静态初始化
scores= new int[][]{{1,2},{2,8},{6,6,6,6}};
String[][] names;
//动态初始化1
names = new String[3][2];
//动态初始化2
names = new String[3][];
names[0] = new String[2];
names[1] = new String[1];
names[2] = new String[3]; //引用具体的某一个元素
int[][] fuzhi = new int[3][2];
fuzhi[0][1] = 12;
fuzhi[2][1] = 33; //二维数组的长度:length属性
System.out.println(fuzhi.length);//3
//二维数组中元素的长度
System.out.println(fuzhi[0].length);//
System.out.println(names.length);//3
System.out.println(names[2].length);//3
System.out.println();
}
}
遍历二维数组
public class array2 { public static void main(String[] args) {
// TODO Auto-generated method stub
//定义一个二维数组
int[][] scores;
//二维数组初始化
//静态初始化
scores= new int[][]{{1,2},{2,8},{6,6,6,6}}; //for循环遍历数组
for(int m = 0;m < scores.length;m++){//控制行数
for(int n = 0;n < scores[m].length;n++){
System.out.print(scores[m][n] + " ");
}
System.out.println();
}
} }
二维数组的内存结构
二维数组的存储与一维数组并没有什么区别,只是在第一层的数组中存的是下一层数组的内存地址,真实存储数据的是在第二层数组中。
public class TestException {
public static void main(String[] args) {
//1.数组下标越界的异常:java.lang.ArrayIndexOutOfBoundsException
int[] i = new int[10];
// i[0] = 90;
// i[10] = 99; // for(int m = 0;m <= i.length;m++){
// System.out.println(i[m]);
// }
//2.空指针的异常:NullPointerException
//第一种:
// boolean[] b = new boolean[3];
// b = null;
// System.out.println(b[0]); //第二种:
// String[] str = new String[4];
// //str[3] = new String("AA");//str[3] = "AA";
// System.out.println(str[3].toString()); //第三种:
int[][] j = new int[3][];
j[2][0] = 12;
}
}
数组常见异常
声明:int[] x,y[]以下能允许通过编译的是:
首先分析,一维数组的定义方式为:int[]x或int x[]。
二维数组的定义方式为int[][] y 或int[] y[] 或 int y[][]。
本题定义的为int[] x与,int[] y[]。所以x是一维数组,y是二维数组。
public class yanghui { public static void main(String[] args) {
// TODO Auto-generated method stub
//每层的个数
int[][] yanghui = new int[10][];
for(int i =0;i<yanghui.length;i++){
yanghui[i] = new int[i+1];
} for(int i = 0;i<yanghui.length;i++){
for(int j = 0;j<yanghui[i].length;j++){
yanghui[i][0] = yanghui[i][i] = 1; if(i>1 && j>0 && j<i){
yanghui[i][j] = yanghui[i-1][j]+yanghui[i-1][j-1];
}
} } //遍历二维数组
for(int i = 0;i < yanghui.length;i++){
for(int j = 0;j < yanghui[i].length;j++){
System.out.print(yanghui[i][j] + "\t");
}
System.out.println();
}
} }
杨辉三角
java中的数组array1=array2,array2的栈存入array1的内存地址。
所以数组的复制不能这样操作
int[] arr1 = new int[arr.length];
for (int i = 0; i < arr1.length; i++) {
arr1[i] = arr[i];
}
排序部分
public class array_sort { public static void main(String[] args) {
// TODO Auto-generated method stub
int[] array1 = new int[]{-2, 4, 32, 44, 0, 10, -5}; for(int i = 1;i<array1.length; i++){
for(int j=0;j<array1.length-i;j++){
if(array1[j]>array1[j+1]){
int temp = array1[j+1];
array1[j+1] = array1[j];
array1[j] = temp;
}
} }
for(int m=0;m<array1.length; m++){
System.out.print(array1[m]+"\t");
}
System.out.println();
} }
冒泡排序
public class array_sort1 { public static void main(String[] args) {
// TODO Auto-generated method stub
//直接选择排序
int[] array1 = new int[]{-2, 4, 32, 44, 0, 10, -5};
for(int i = 0;i<array1.length; i++){
for(int j=i;j<array1.length;j++){
// int array_min=array1[i];
if(array1[i]>array1[j]){
int temp = array1[j];
array1[j] = array1[i];
array1[i] = temp;
}
} }
for(int m=0;m<array1.length; m++){
System.out.print(array1[m]+"\t");
}
System.out.println();
} }
直接选择排序
//使用直接选择排序使数组元素从小到大排列
for(int i = 0; i < arr.length - 1; i++){
int t = i;//默认i处是最小的
for(int j = i;j < arr.length;j++){
//一旦在i后发现存在比其小的元素,就记录那个元素的下角标
if(arr[t] > arr[j]){
t = j;
}
}
if(t != i){
int temp = arr[t];
arr[t] = arr[i];
arr[i] = temp;
}
}
直接选择排序优化版
附:
System.arraycopy的使用方法(使用它可以快速得到一个pop(某索引值)的新数组),java中没有pop()所以使用它可以快速的实现pop方法。
int[] a = new int[]{123, 31, 656, 12, 43, 5};
int[] b = new int[5];
System.arraycopy(a, 0, b, 0, 1);// [123, 0, 0, 0, 0]
System.arraycopy(a, 0, b, 0, 2);// [123, 31, 0, 0, 0]
System.arraycopy(a, 2, b, 1, 4);// [123,656,12,43, 5],前面已经修改了这个数组所以第一位不是0是,123了
System.out.println(Arrays.toString(b));
System.arraycopy的Demo
五、 java中数组的更多相关文章
- java中数组的相关知识
1. 2.数组的命名方法 1)int[]ages=new int[5]; 2) int[]ages; ages=new int[5]; 3)int[]ags={1,2,3,4,5}; 4)int[ ...
- Java中数组的特性
转载:http://blog.csdn.net/zhangjg_blog/article/details/16116613 数组是基本上所有语言都会有的一种数据类型,它表示一组相同类型的数据的集合,具 ...
- 在java 中,数组与 List<T> 类型的相互转换
在java中,数组与List<T> 之前进行互相转换,转换方法可总结为以下几种: 一. 将 数组转换成List<T> 1. 使用 Collections 的addAll 方法 ...
- Java中数组的初始化方式
Java中数组的初始化方式 初始化方式有两种: 1.静态初始化:初始化时由程序猿显式指定每一个数组元素的初始值,由系统指定数组长度 2.动态初始化:初始化时由程序猿仅仅指定数组长度,由系统为数组 ...
- java中数组复制的两种方式
在java中数组复制有两种方式: 一:System.arraycopy(原数组,开始copy的下标,存放copy内容的数组,开始存放的下标,需要copy的长度); 这个方法需要先创建一个空的存放cop ...
- Java中数组的插入,删除,扩张
Java中数组是不可变的,但是可以通过本地的arraycop来进行数组的插入,删除,扩张.实际上数组是没变的,只是把原来的数组拷贝到了另一个数组,看起来像是改变了. 语法: System.arrayc ...
- java中数组、集合、字符串之间的转换,以及用加强for循环遍历
java中数组.集合.字符串之间的转换,以及用加强for循环遍历: @Test public void testDemo5() { ArrayList<String> list = new ...
- Java 中数组的内存分配
Java 中数组的内存分配 1.Java 程序在运行时,需要在内存中分配空间.为了提高运算效率,就对空间进行了不同区域的划分,因为每一片区域都有特定的处理数据和内存管理方式. 2.数组基本概念 数组是 ...
- 将java中数组转换为ArrayList的方法实例(包括ArrayList转数组)
方法一:使用Arrays.asList()方法 1 2 String[] asset = {"equity", "stocks", "gold&q ...
- 【Java面试题】18 java中数组有没有length()方法?string没有lenght()方法?下面这条语句一共创建了多少个对象:String s="a"+"b"+"c"+"d";
数组没有length()这个方法,有length的属性.String有有length()这个方法. int a[]; a.length;//返回a的长度 String s; s.length();// ...
随机推荐
- js中charAt()与charCodeAt()区别
1. str.charAt(index); 返回指定位置的字符 字符串中第一个字符的下标是 0.如果参数 index 不在 0 与 string.length 之间,该方法将返回一个空字符串. ind ...
- 【转】嵌入式操作系统VxWorks中TFFS文件系统的构建
时间:2005-02-20 来源:21IC中国电子网 作者:771所加固机工程部 蔡本华 高文炜 关键字:VxWorks TFFS 嵌入式操作系统 文件系统 摘要:目前的嵌入式 ...
- An Intuitive Explanation of Convolutional Neural Networks
https://ujjwalkarn.me/2016/08/11/intuitive-explanation-convnets/ An Intuitive Explanation of Convolu ...
- pandas实践——美国人口分析
1.导入文件,并查看数据样本 abbr = pd.read_csv("./state-abbrevs.csv")areas =pd.read_csv("./state-a ...
- k8s搭建WebUI--Dashborad管理界面
k8s的webUI管理界面可以更好更直观更便捷的让我们去管理我们的k8s集群. 我们知道,由于某些原因我们无法直接拉取dashboard的镜像,但是国内有些人已经将镜像下载到dockerhub中可以给 ...
- java中常用的集合的一些区别 (2013-10-07-163写的日志迁移
java中的以下几大集合: List结构的集合类: ArrayListl类,LinkedList类,Vector类,stack类 Map结构的集合类: HashMap类,Hashtable类(此是以k ...
- SimpleDateFormat优化写法
在一个读取数据库数据导出到excel文件的例子当中,每次处理一个时间信息的时候,就需要创建一个SimpleDateFormat实例对象,然后再丢弃这个对象.大量的对象就这样被创建出来,占用大量的内存和 ...
- Nordic Collegiate Programming Contest 2015 B. Bell Ringing
Method ringing is used to ring bells in churches, particularly in England. Suppose there are 6 bells ...
- poj 3614 奶牛美容问题 优先队列
题意:每头奶牛需要涂抹防晒霜,其中有效的范围 min~max ,现在有L种防晒霜,每种防晒霜的指数为 f 瓶数为 l,问多少只奶牛可以涂上合适的防晒霜?思路: 优先队列+贪心 当奶牛的 min< ...
- day37-- &MySQL step1
m1.客户端与数据库服务器端是通过socket来交互数据,对数据库的理解:数据库就是一个文件夹,表就类比文件.m2.常用语句#查看数据库show databases:#创建数据库create data ...