摘要:这篇Java开发技术栏目下的“Java基础学习笔记之数组详解”,介绍的技术点是“java基础学习笔记、基础学习笔记、Java基础、数组详解、学习笔记、Java”,希望对大家开发技术学习和问题解决有帮助。

本文实例讲述了Java基础学习笔记之数组。分享给大家供大家参考,具体如下:

数组的定义于使用

1:数组的基本概念

一组相关变量的集合;在Java里面将数组定义为引用数据类型,所以数组的使用一定要牵扯到内存分配;想到了用new 关键字来处理。

2:数组的定义格式

区别:

动态初始化后数组中的每一个元素的内容都是其对应数据类型的默认值,随后可以通过下标进行数组内容的修改;

如果希望数组定义的时候就可以提供内容,则采用静态初始化的方式;

a:数组的动态初始化(声明并初始化数组):

数据类型 数组名称 【】 = new 数据类型 【长度】;

数据类型 【】 数组名称 = new 数据类型 【长度】

b:数组的静态初始化(在数组定义的时候就为其设置好了里面的内容)

简化格式:数据类型 数组 数组名称 【】 = {数据1,数据2,数据3,。。。};

完整格式:数据类型 数组名称【】 = new 数据类型【】{ 数据1,数据2,数据3,。。。};

3:数组的特点

通过脚标访问:0~n-1;

进行数组操作的时候往往会利用for循环来完成;

数组的长度:“数组名称.length”;

4:数组的引用传递

数组定义时用到了new,所以这里存在有内存关系匹配。

public class ArrayDemo {

public static void main(String args[]) {

// 使用数组的静态初始化

int data [] = new int [3] ;

data [0] = 10 ;// 为数组设置内容

data [1] = 20 ;// 为数组设置内容

data [2] = 30 ;// 为数组设置内容

for (int x = 0 ; x < data.length ; x ++) {

System.out.println(data[x]) ;

}

}

}

一个堆内存可以被多个栈内存所指向

public class ArrayDemo {

public static void main(String args[]) {

int data [] = new int [] {10,20,30} ;// 静态初始化

int temp [] = data ;// 引用传递

temp [0] = 99 ;

for (int x = 0 ; x < data.length ; x ++) {

System.out.println(data[x]) ;

}

}

}

由于数组是引用数据类型,所以一定要为其开辟堆内存空间(也就是实例化对象)才可以使用,如果使用了未开辟堆内存空间的数组则一定会出现“NullPointerException”异常

5foreach迭代输出

JDK1.5之后为了减轻下标对程序的影响(以为下标处理不当则会出现数组越界异常),参考了.NET的设计,引入了增强型for循环:foreach

for(数据类型 变量 :数组名) { }

特点:可以自动将数组中的每一个元素的内容取出保存到变量里,这样就可以直接通过变量获取数组的内容,避免了数组越界。

public class ArrayDemo {

public static void main(String args[]) {

int data [] = new int [] {1,2,3,4,5} ;

for (int temp : data) {// 自动循环,将data数组每一个内容交给temp

System.out.println(temp) ;

}

}

}

6:二维数组

定义格式:

a:动态初始化:数据类型 数组名称【】【】 = new 数据类型【行个数】【列个数】;

b:静态初始化:数据类型 【】【】 new 数据类型 【】【】 { { 数据,数据 …},{ 数据,数据…},… }

public class ArrayDemo {

public static void main(String args[]) {

int data [][] = new int [][] {

{1,2,3,4,5} , {1,2,3} , {5,6,7,8}} ;

for (int x = 0 ; x < data.length ; x ++) {

for (int y = 0 ; y < data[x].length ; y ++) {

System.out.println("data["+x+"]["+y+"] = " + data[x][y]) ;

}

System.out.println() ;// 换行

}

}

}

//输出结果:

data[0][0] = 1

data[0][1] = 2

data[0][2] = 3

data[0][3] = 4

data[0][4] = 5

data[1][0] = 1

data[1][1] = 2

data[1][2] = 3

data[2][0] = 5

data[2][1] = 6

data[2][2] = 7

data[2][3] = 8

同一个二维数组通过foreach输出

public class ArrayDemo {

public static void main(String args[]) {

int data [][] = new int [][] {

{1,2,3,4,5} , {1,2,3} , {5,6,7,8}} ;

for (int temp [] : data) {

for (int num : temp) {

System.out.print(num + "、") ;

}

System.out.println() ;

}

}

}

//输出结果

1、2、3、4、5、

1、2、3、

5、6、7、8

7数组与方法

对于引用数据类型,主要的特点是可以于方法进行引用传递,数组本身也是引用数据类型,所以自然也可以通过方法实现引用传递的操作。

public class ArrayDemo {

public static void main(String args[]) {

int data [] = new int [] {1,2,3,4,5} ;

printArray(data) ;// 传递数组

}

// 要求接收一个int型的数组

public static void printArray(int temp []) {

for (int x = 0 ; x < temp.length ; x ++) {

System.out.println(temp[x]) ;

}

}

}

//通过方法来接收一个数组

public class ArrayDemo {

public static void main(String args[]) {

int data [] = initArray() ;// 通过方法可以获得数组内容

printArray(data) ;// 传递数组

}

public static int [] initArray() {

int arr [] = new int [] {1,2,3,4,5} ;

return arr ;// 返回一个数组

}

// 要求接收一个int型的数组

public static void printArray(int temp []) {

for (int x = 0 ; x < temp.length ; x ++) {

System.out.println(temp[x]) ;

}

}

}

//通过方法返回一个数组对象

public class ArrayDemo {

public static void main(String args[]) {

int data [] = new int [] {1,2,3,4,5} ;

changeArray(data) ;// 修改数组内容

printArray(data) ;// 传递数组

}

public static void changeArray(int arr[]) {

for (int x = 0 ; x < arr.length ; x ++) {

arr[x] *= 2 ;// 每个元素的内容乘2保存

}

}

// 要求接收一个int型的数组

public static void printArray(int temp []) {

for (int x = 0 ; x < temp.length ; x ++) {

System.out.println(temp[x]) ;

}

}

}

//通过方法修改数组内容。

下面写一个案例,总结上面内容

案例;定义一个int数组,要求计算出这个数组元素的总和,最大值,最小值,平均值。

//此程序的基本实现

public class ArrayDemo {

public static void main(String args[]) {

int data [] = new int [] {1,2,3,4,5} ;

int sum = 0 ; ;

double avg = 0.0 ;

int max = data[0] ; // 假设第一个是最大值

int min = data[0] ;// 假设第一个是最小值

for (int x = 0 ; x < data.length ; x ++) {

if (data[x] > max) {// max地位改变了

max = data[x] ;

}

if (data[x] < min) {

min = data[x] ;

}

sum += data[x] ;

}

avg = sum / data.length ;

System.out.println("数组内容总和:" + sum) ;

System.out.println("数组内容平均值:" + avg) ;

System.out.println("数组内容最大值:" + max) ;

System.out.println("数组内容最小值:" + min) ;

}

public static void printArray(int temp []) {

for (int x = 0 ; x < temp.length ; x ++) {

System.out.println(temp[x]) ;

}

}

}

问题:主函数所在的类往往被称为主类,那么既然是主类中不希望涉及过多复杂的功能;在开发的过程中,主方法本身就相当于是一个客户端,而对于客户端的代码尽量简单一些,所以这个时候是将一系列的计算过程交给单独的程序类去完成。

//改善操作设计

class ArrayUtil {// 是一个操作工具的类

private int sum ; // 保存总和

private double avg ; // 保存平均值

private int max ; // 保存最大值

private int min ; // 保存最小值

public ArrayUtil(int data[]) {// 进行数组计算

this.max = data[0] ; // 假设第一个是最大值

this.min = data[0] ;// 假设第一个是最小值

for (int x = 0 ; x < data.length ; x ++) {

if (data[x] > max) {// max地位改变了

this.max = data[x] ;

}

if (data[x] < min) {

this.min = data[x] ;

}

this.sum += data[x] ;

}

this.avg = this.sum / data.length ;

}

public int getSum() {

return this.sum ;

}

public double getAvg() {

return this.avg ;

}

public int getMax() {

return this.max ;

}

public int getMin() {

return this.min ;

}

}

public class ArrayDemo {

public static void main(String args[]) {

int data [] = new int [] {1,2,3,4,5} ;

ArrayUtil util = new ArrayUtil(data) ;// 数据计算

System.out.println("数组内容总和:" + util.getSum()) ;

System.out.println("数组内容平均值:" + util.getAvg()) ;

System.out.println("数组内容最大值:" + util.getMax()) ;

System.out.println("数组内容最小值:" + util.getMin()) ;

}

}

8:数组操作案例:数组反转

做法一:定义一个新的数组而后按照逆序的方式保存(会产生无用的垃圾空间)

class ArrayUtil {

public static void printArray(int temp []) {

for (int x = 0 ; x < temp.length ; x ++) {

System.out.print(temp[x] + "、") ;

}

System.out.println() ;

}

}

public class ArrayDemo {

public static void main(String args[]) {

int data [] = new int [] {1,2,3,4,5,6,7,8,9} ;

int temp [] = new int [data.length] ;// 第二个数组

int foot = temp.length - 1; // 第二个数组的脚标

for (int x = 0 ; x < data.length ; x ++) {

temp[foot --] = data[x] ;

}

data = temp ;

ArrayUtil.printArray(data) ;

}

}

做法二:在一个数组上进行转置

class ArrayUtil {

public static void printArray(int temp []) {

for (int x = 0 ; x < temp.length ; x ++) {

System.out.print(temp[x] + "、") ;

}

System.out.println() ;

}

}

public class ArrayDemo {

public static void main(String args[]) {

int data [] = new int [] {1,2,3,4,5,6,7,8,9} ;

int center = data.length / 2 ; // 确定转换的次数

int head = 0 ;// 操作脚标

int tail = data.length - 1 ; // 操作脚标

for (int x = 0 ; x < center ; x ++) {

int temp = data [head] ;

data [head] = data [tail] ;

data [tail] = temp ;

head ++ ;

tail -- ;

}

ArrayUtil.printArray(data) ;

}

}

比较两种方式:第一种循环次数较多,会产生垃圾;第二种实现循环次数较低,但是存在if判断增加了

时间复杂度,可是减少了无用对象的产生,提升了性能。

//将转换功能变为类定义

class ArrayUtil {

public static void reverse(int data[]) {

int center = data.length / 2 ; // 确定转换的次数

int head = 0 ;// 操作脚标

int tail = data.length - 1 ; // 操作脚标

for (int x = 0 ; x < center ; x ++) {

int temp = data [head] ;

data [head] = data [tail] ;

data [tail] = temp ;

head ++ ;

tail -- ;

}

}

public static void printArray(int temp []) {

for (int x = 0 ; x < temp.length ; x ++) {

System.out.print(temp[x] + "、") ;

}

System.out.println() ;

}

}

public class ArrayDemo {

public static void main(String args[]) {

int data [] = new int [] {1,2,3,4,5,6,7,8,9} ;

ArrayUtil.reverse(data) ;// 转置处理

ArrayUtil.printArray(data) ;

}

}

9数组相关类操作方法

Java语言本身提供有数组的相关支持处理。

a:数组排序:Java.util.Arrays.sort(数组名称)

class ArrayUtil {

public static void printArray(int temp []) {

for (int x = 0 ; x < temp.length ; x ++) {

System.out.print(temp[x] + "、") ;

}

System.out.println() ;

}

}

public class ArrayDemo {

public static void main(String args[]) {

int data [] = new int [] {23,12,1,234,2,6,12,34,56} ;

java.util.Arrays.sort(data) ;// 排序

ArrayUtil.printArray(data) ;

}

}

b:数组拷贝:System.arraycopy(源数组,源数组开始点,目标数组,目标数组开始点,拷贝长度)

class ArrayUtil {

public static void printArray(int temp []) {

for (int x = 0 ; x < temp.length ; x ++) {

System.out.print(temp[x] + "、") ;

}

System.out.println() ;

}

}

public class ArrayDemo {

public static void main(String args[]) {

int dataA [] = new int [] {1,2,3,4,5,6,7,8,9} ;

int dataB [] = new int [] {11,22,33,44,55,66,77,88,99} ;

System.arraycopy(dataA,5,dataB,3,3) ;

ArrayUtil.printArray(dataB) ;

}

}

//结果:

11、22、33、6、7、8、77、88、99、

10方法可变参数

需求:定义一个方法,可以实现任意多个整型数据的相加处理。

传统实现。

class ArrayUtil {

public static int sum(int [] data) {

int sum = 0 ;

for (int temp : data) {

sum += temp ;

}

return sum ;

}

}

public class ArrayDemo {

public static void main(String args[]) {

System.out.println(ArrayUtil.sum(new int [] {1,2,3})) ;

}

}

上述代码可以实现任意多个数字的参数内容传递,但是与实际的要求并不符合,实际要求的是可以传递任意多个参数,而不是一个数组。

从JDK1.5开始为了方便开发组进行可变参数的定义。

class ArrayUtil {

public static int sum(int ... data) {// 变种数组

int sum = 0 ;

for (int temp : data) {

sum += temp ;

}

return sum ;

}

}

public class ArrayDemo {

public static void main(String args[]) {

System.out.println(ArrayUtil.sum(1,2,3,4)) ;

System.out.println(ArrayUtil.sum(new int [] {1,2,3})) ;

}

}

//输出

10

6

总结:可变参数的最大作用:在以后进行一些程序类设计或者开发者调用的时候,利用次种形式可以避免数组的传递操作;可变参数的本质:依然属于数组。

11对象数组(重点)

之前接触到的都是基本数据类型定义的数组;Java程序中各种数据类型都可以成为数组类型,所以类也可以成为数组类型:对象数组。

动态初始化: 类 对象数组名称 【】 = new 类 【长度】;

静态初始化: 类 对象数组名称 【】 = new 类 【】{实例化对象,实例化对象,… };

动态初始化每个元素为null;

//动态初始化

class Person {

private String name ;

private int age ;

public Person(String name,int age) {

this.name = name ;

this.age = age ;

}

public String getInfo() {

return "姓名:" + this.name + "、年龄:" + this.age ;

}

// setter、getter略

}

public class ArrayDemo {

public static void main(String args[]) {

Person per [] = new Person[3] ; // 对象数组

per[0] = new Person("张三",20) ;

per[1] = new Person("李四",20) ;

per[2] = new Person("王五",20) ;

for (int x = 0 ; x < per.length ; x ++) {

System.out.println(per[x].getInfo()) ;

}

}

}

//静态初始化

class Person {

private String name ;

private int age ;

public Person(String name,int age) {

this.name = name ;

this.age = age ;

}

public String getInfo() {

return "姓名:" + this.name + "、年龄:" + this.age ;

}

// setter、getter略

}

public class ArrayDemo {

public static void main(String args[]) {

Person per [] = new Person[] {

new Person("张三",20) ,

new Person("李四",20) ,

new Person("王五",20)} ; // 对象数组

for (int x = 0 ; x < per.length ; x ++) {

System.out.println(per[x].getInfo()) ;

}

}

}

对于对象数组而言,上述代码只是更换了一种所谓的数组定义的类型,但是内存图变得复杂:

总结

数组最大缺陷:

长度是固定的;

优势:线性保存,根据索引访问,速度较块。(时间复杂度为“1”)。

面试题:定义类的时候什么情况下会考虑使用static方法?

在类中不提供任何成员属性的情况下,如果定义的是普通方法,那么就必须通过实例化对象来进行调用,这样就会产生许多无用的实例化对象。那么在这样的情况下会考虑直接定义static方法,这样可以由类名称直接调用。

希望本文所述对大家java程序设计有所帮助。

Java中大数据数组,Java基础学习笔记之数组详解相关推荐

  1. ELK学习笔记之Logstash详解

    0x00 Logstash概述 官方介绍:Logstash is an open source data collection engine with real-time pipelining cap ...

  2. Python基础学习之 os 模块详解

    Python基础学习之 os 模块详解 文章目录 Python基础学习之 os 模块详解 1. 路径操作 1.1 os.chdir(),切换当前工作目录: 1.2 os.getcwd(),返回工作目录 ...

  3. oracle scn 重置,学习笔记:Oracle SCN详解 SCN与Oracle数据库恢复的关系

    天萃荷净 分享一篇关于Oracle SCN的详解,介绍SCN与Oracle数据库恢复的关系和SCN在数据库中的作用 一.为什么需要System checkpoint SCN号与Datafile Che ...

  4. expect学习笔记及实例详解【转】

    1. expect是基于tcl演变而来的,所以很多语法和tcl类似,基本的语法如下所示: 1.1 首行加上/usr/bin/expect 1.2 spawn: 后面加上需要执行的shell命令,比如说 ...

  5. Java基础学习笔记 -- 9(数组)

    1. 数组 程序 = 算法 + 数据结构: 前面学过的if...else....switch....while循环.for循环等都是解决流程问题,即算法方面的问题. 数据结构:就是把数据按照特定的某种 ...

  6. java同步锁售票_Java基础学习笔记: 多线程,线程池,同步锁(Lock,synchronized )(Thread类,ExecutorService ,Future类)(卖火车票案例)...

    学习多线程之前,我们先要了解几个关于多线程有关的概念. 进程:进程指正在运行的程序.确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于运行过程中的程序,并且具有一定独立功能. 线程:线程是 ...

  7. JAVA与DOM解析器基础 学习笔记

    要求 必备知识 JAVA基础知识.XML基础知识. 开发环境 MyEclipse10 资料下载 源码下载 文件对象模型(Document Object Model,简称DOM),是W3C组织推荐的处理 ...

  8. java大数据最全课程学习笔记(6)--MapReduce精通(二)--MapReduce框架原理

    目前CSDN,博客园,简书同步发表中,更多精彩欢迎访问我的gitee pages MapReduce精通(二) MapReduce框架原理 MapReduce工作流程 流程示意图 流程详解 上面的流程 ...

  9. point类型的数组java_Java基础学习之引用类型数组访问NullPoint问题

    以题目引入: 面试题:int[] a = new int[10];Student[] a = new Student[10];的区别? 解析: 第一反应就是内存空间方面的保存位置不同,因为Java中保 ...

最新文章

  1. hashmap是线程安全的吗?怎么解决?_解决SimpleDateFormat线程安全问题
  2. 再谈 查询长期未登录AD的用户
  3. java parseexception_Java ParseException类代码示例
  4. 信息学奥赛一本通(1405:质数的和与积)
  5. 如何使用PowerShell从SQL Server数据创建图表
  6. mysql sum 对应_ASK MySQL查询SUM不同的表
  7. 怎样给计算机做屏幕保护,如何制作电脑屏保?XP系统中怎么制作动态屏幕保护?...
  8. dasBlog-1.8.5223.1中文版
  9. app营销实训报告_市场营销模拟软件实训报告
  10. 博士论文-基于生成对抗网络的图像合成-阅读笔记
  11. 银行招考计算机专业考什么,银行笔试一般都考什么?
  12. Tanzu Observability by Wavefront Spring Boot Starter
  13. java创建Shape类,求子类circle,圆形rectangle矩形,rhombus菱形的周长和面积
  14. android3d画廊自动切换,Android实例(一)—— 3D画廊
  15. 什么是前端框架与后端框架
  16. 央视网采用国产8K摄像机直播2022年度最大超级月亮
  17. Java实现阿姆斯特朗数
  18. it是什么?(详细解释)
  19. 黑莓9930/9900开启电信4g网络,电信卡+3g上网
  20. codeup27978 除法算式(NOIP1995普及组第1题)

热门文章

  1. 企业微信接收消息服务器配置php,微信企业号配置及在公众号里获取用户信息
  2. php设计模式课程---4、观察者模式的好处是什么
  3. webpack4+vue打包简单入门
  4. ThinkJS入门+实例(实现认证权限等基本功能)
  5. vue如何在手机上查看vue-cli构建的项目
  6. 访问通信录 适配iOS7
  7. 在Mac中用快捷键快速插入日期时间
  8. cisco 2610 2950 单臂路由得一些心得
  9. poj 1469(二分图最大匹配)
  10. 系出名门Android(9) - 数据库支持(SQLite), 内容提供器(ContentProvider)