数组

1. 什么是数组?

数组是相同数据类型的元素组成的集合。这些元素按线性顺序排列。所谓线性顺序是指除第一个元素外,每一个元素都有唯一的前驱元素;除最后一个元素外,每一个元素都有唯一的后继元素。(“一个跟着一个”)。

2. 数组变量数组对象  数组元素

数组变量:是引用数组的变量,是引用变量。

数组(数组对象):数组整体对象

数组元素:数组中每个元素

羊村的全体羊,他们打败了灰太狼。 他们 和 羊村的全体羊 之间是引用的关系,他们是变量,他们相当于 数组变量;羊村的全体羊相当于 数组(数组对象);喜洋洋是数组元素

3.数组的声明

int[] arr;
int arr[]; //不常用,很少使用

int[] 是数组类型,是引用类型。int[]表示数组中的每一个元素都是int类型。arr是变量(引用变量),类型是数组类型int[]。

int[] arr=new int[10];new int[10]是创建数组对象,将对象的引用赋值给ary变量。ary变量就引用了数组对象,这个对象有10个元素。10表示数组的长度,即数组中元素的个数。

java数组元素是自动初始化的,初始化为零值。有: 0  0.0  \u0000  null false

int[]  arr=new int[10],创建数组对象,有10个元素,每个元素的初始值是0;

double[] arr=new double[3],数组对象有3个元素,每个元素的初始值是0.0;

char[] arr=new char[3],每个元素的初始值是\u0000;\u0000--\ufffff,\u开头的是一个Unicode码的字符, \u0000字符是数值0对应的字符

boolean[] arr=new boolean[3],,每个元素的初始值是false;

4. 数组对象的创建和初始化

动态初始化

1)new 类型[长度]    new int[4]    类型是任何类型:基本类型、类类型(String,Integer)  长度:变量或常量 值:0 ~ Integer.MAX_VALUE

2)new 类型[]{元素0,元素1,元素2}  直接给出元素,元素直接初始化,元素的长度就是长度。

静态初始化  

类型[] 变量={元素0,元素1,元素2}。这种方式可以看做是 new int[]{4,5,6} 的简化版。只能用于声明时的初始化,不能用于赋值。

注意

new int[length] 适合创建不知道具体的元素,数量很多。new int[]{2,3,4} 适合已经知道具体元素了,元素比较少。{4,5,6} 只是适合知道元素,并只能使用在声明变量直接初始化。

5. 数组的访问

数组一旦创建后,数组的长度是不可以改变的。

调用数组的length属性可以获取数组的长度;int len=arr.length

可以通过下标的方式访问数组中的每一个元素。注意:数组的下标从0开始,对于长度为n的数组,下标的范围是0~n-1。

数组不能越界访问,会出现运行异常。

迭代数组元素,迭代数组,也称为遍历数组,就是逐一处理元素

for(int i=0; i<ary.length; i++){
// i = 0 1 ... ary.length-1
System.out.println(ary[i]);
}

案列 

学生成绩管理

数据模型设计

names = { "Tom", "Jerry", "Andy", "John" }

score = {  85  ,      67,    66,     98  }

0          1       2       3

算法设计,业务功能实现

1. 成绩输入。  迭代显示每个人名,从控制台读取数据填充到对应的分数数组

2. 成绩列表, 并计算平均成绩。  迭代每个人名,并且显示对应的成绩,统计总分。最后计算显示平均分。

3. 查询某人的成绩。  等待输入查询人名,根据人名迭代找人名,如果找到就显示人名和对应的成绩。

public static void main(String[] args) {

        String[] names = {"Tom", "Jerry", "Andy", "John"};
int[] score = new int[names.length];
// 处理控制台命令
Scanner in = new Scanner(System.in);
System.out.println("\t欢迎使用成绩管理");
while(true){
System.out.print("1.成绩录入 2.成绩单 3.查询 0.离开, 选择:");
String cmd = in.nextLine();// 从控制台读取一行字符串
// 比较字符串必须使用equals()方法!最后是字符串字面量与对象比较
if("0".equals(cmd)){
System.out.println("亲,再见了(T_T)!");
break;
}
else if("1".equals(cmd)){// cmd command 命令
// 输入
System.out.println("开始输入成绩");
for(int i = 0; i < names.length; i++){
String name = names[i];// name 代表每个人名
System.out.print((i + 1) + " 输入 " + name + " 的成绩:");
String str = in.nextLine();// "95"
// parseInt 将10进制的字符串转换为整数
score[i] = Integer.parseInt(str);// "95" -> 95(int)
}
}
else if("2".equals(cmd)){
// 成绩单
int sum = 0;
for(int i = 0; i < names.length; i++){
String name = names[i];
System.out.println((i + 1) + "." + name + "的成绩:" + score[i]);
sum += score[i];
}
System.out.println("平均成绩:" + (sum / names.length));
}
else if("3".equals(cmd)){
// 3.查询
System.out.print("输入查询人名:");
String name = in.nextLine();
for(int i = 0; i < names.length; i++){
if(name.equals(names[i])){
System.out.println((i + 1) + "." + name + "的成绩:" + score[i]);
break;
}
}
}
else{
System.out.println("命令错啦!");
}
}
}

Arrays中常用的方法

JDK中的java.utils.Arrays类提供对数组操作的一系列使用方法。使用API方法:API方法封装了常用算法功能,使用这些功能简化开发过程, 提高开发效率。API 封装的算法也是 for if 实现的,也可以不用。

如:使用toString可以便捷输出数组内容,使用equals可以便捷比较 数组内容。

数组类型是引用类型,但是没有覆盖object中的toString ,equals方法。所以要输出比较用Arrays工具类的toString方法,equals方法

Arrays.toString方法

用于字符串表示数组的元素。将数组的内容连接成一个字符串。

String[] str={"Tom", "Andy", "Jerry", "John"};
Arrays.toString(str);--->"[Tom, Andy, Jerry, John]"

Arrays.equals方法

用于比较两个数组的各个元素是否相等。

char[] answer = {'A', 'C', 'D'};
char[] input = {'A', 'C', 'D'};
boolean match = Arrays.equals(answer, input);//true

Arrays.sort方法

用于实现数组的排序。

int[] score = {67, 49, 88, 69, 95};
Arrays.sort(score);//小 -> 大 [49 67 69 88 95]
String[] names = {"Tom", "Jerry", "Andy", "John"};
Arrays.sort(names);//按字典顺序排序 [Andy Jerry John Tom]

Arrays.fill();

填充数组

String[] names=new String[3];
Arrays.fill(names,”aa”);
Arrays.toString(names)//[aa, aa, aa]

Arrays.binarySearch方法

用于实现有序数组的二分法查找。二分查找,在未排序的数组上二分查找结果是不稳定的。在查找之前必须先排序。

String[] names={"Tom","Andy","Jerry","John","Wang",”Andy”};
Arrays.sort(names);// 先排序
int index = Arrays.binarySearch(names,"Jerry");返回下标值
index = Arrays.binarySearch(names,"Lee");// 找不到时,返回负数
index = Arrays.binarySearch(names,"Andy");//有多个相等元素时不确定返回的是哪一个。

数组的复制和赋值

数组的赋值

ary1和ary2都指向同一个数组对象,ary1和ary2相互影响。

int[] ary1 = {4,5,6};
int[] ary2 = ary1;
ary2[1]++;

数组的复制

就是将一个数组(源数组)中的各个元素值复制到另外一个数组(目标数组)中。

1. 使用for循环实现

int[] ary3 = new int[ary1.length];
for(int i=0; i<ary1.length; i++){
ary3[i] = ary1[i];
}
ary3[1]++;

2. 使用API System.arraycopy().

System.arraycopy 是用C代码实现。System.arraycopy(src, srcPos, dest, destPos, length)

src-----要复制的源数组

srcPos--从源数组复制的起始位置

dest----复制到的目标数组

destPos-复制到目标数组的起始位置

length--要复制的元素的个数

int[] ary4 = new int[ary1.length];

System.arraycopy(ary1, 0, ary4, 0, ary1.length);

3. 使用Array.copyOf()

Arrays.copyOf() 方法,底层就是arraycopy

int[] ary5 = Arrays.copyOf(ary1, ary1.length); ary5:复制后的数组  ary1:原数组  ary1.length复制后的长度

数组的扩展

数组的长度在创建后不可改变的。所谓的扩展是指创建一个更大新数组并将原有数组的内容复制到其中。利用复制并更换数组对象,实现数组的变长计算。

1. System.arraycopy

String[] names={"Tom","Andy","Jerry","John","Wang"};
String[] names1=new String[names.length+1];
System.arraycopy(names, 0, names1, 0, names.length);
names1[names1.length-1]="liuyueqin";
System.out.println(Arrays.toString(names1));

2. Arrays.copyOf

String[] names={"Tom","Andy","Jerry","John","Wang"};
String[] names1=Arrays.copyOf(names, names.length+1);
names1[names1.length-1]="liuyueqin";
System.out.println(Arrays.toString(names1));

数组排序算法

选择排序

原理

1)将数组中的每个元素与第一个元素比较,如果这个元素小于第一个元素,则交换这两个元素。

2)循环第一条规则,找出最小元素,放于第一个位置。

3)经过n-1轮比较完成排序。

简单而言,每轮都找到最小的放到前面。

for(int i = 0; i < ary.length - 1; i++){
for(int j = i; j < ary.length; j++){
if(ary[i] > ary[j]){
int temp = ary[i];
ary[i] = ary[j];
ary[j] = temp;
}
}
}

冒泡排序

原理

1)逐一比较数组中相邻的两个元素, 如果后面的数字小于前面的数字,就交换先后元素。

2)经过一个轮次的比较, 一定有一个最大的排在最后的位置.

3)每次比较剩下的元素, 经过n-1次比较, 可以实现排序

简单说: 比较相邻元素,大的向后交换。

for(int i = 0; i < ary.length; i++){
for(int j = 0; j < ary.length - i - 1; j++){
if(ary[j] > ary[j + 1]){
int temp = ary[j];
ary[j] = ary[j + 1];
ary[j + 1] = temp;
}
}
}

插入排序

原理

1)将数组分为两部分, 将后部分的第一张逐一与前部分每一张比较。

2)找到合理位置插入.

 int i,k,j;
for(i=1;i<ary.length;i++){
k=ary[i];
for(j=i-1;j>0;j--){
f(k<ary[j]){
ary[j+1]=ary[j];
}else{
break;
}
}
ary[j+1]=k;
}

系统排序

JDK提供的排序方法Arrays.sort(ary)的效率要比上面三种排序方法高。

int[] ary1 = new int[100000];
Random random = new Random();
for(int i = 0; i < ary1.length; i++){
ary1[i] = random.nextInt();
}
long time1 = System.currentTimeMillis();
Arrays.sort(ary1);
long time2 = System.currentTimeMillis();
System.out.println(time2 - time1);

java基础(6)--数组和方法的更多相关文章

  1. Java基础 之 System.getProperty()方法

    Java基础 之 System.getProperty()方法大全 public static void main(String[] args) { System.out.println(" ...

  2. JAVA基础语法:函数(方法)、类和对象(转载)

    4.JAVA基础语法:函数(方法).类和对象 函数 在java中函数也称为方法,是一段具备某种功能的可重用代码块. 一个函数包括这几部分: 函数头 函数头包括函数访问修饰符,函数返回值类型, 函数名, ...

  3. Java基础(四)方法和数组

    一.方法 1.方法的定义 方法也叫函数,就是一个能独立完成某个功能的一段代码.方法可以看作一个整体. 语法: 修饰符 返回类型 方法名字(数据类型 变量名,数据类型 变量名,……[形式参数(0个到n个 ...

  4. Java基础-反转数组

    /** java基础,如何将一个数组反转,思考方法采用使用临时变量的情况下,将第一个元素与第二个元素进行反转,需要定义两个索引,一个记录数组的第一个元素与最后一个元素,将其两两交换* */public ...

  5. java基础之数组常用操作

    常用的对数组进行的操作 1.求数组中最大值,最小值 思路:假设下标为0的元素是最大值,遍历数组,依次跟max进行比较,如果有元素比这个max还大,则把这个值赋给max.最小值同样 public cla ...

  6. Java基础之 数组详解

    前言:Java内功心法之数组详解,看完这篇你向Java大神的路上又迈出了一步(有什么问题或者需要资料可以联系我的扣扣:734999078) 数组概念 同一种类型数据的集合.其实数组就是一个容器. 数组 ...

  7. java基础(十) 数组类型

    1. 数组类简介   在java中,数组也是一种引用类型,即是一种类. 我们来看一个例子,理解一下数组类: public static void main(String[] args) { Class ...

  8. Java 基础:数组

    一.数组声明: int[] x; int x[]; 在Java中一般使用前者,机把int[]看做一个类型,C++中只能后者 二.数组初始化: 直接提供值: int[] x = {1, 3, 4}; i ...

  9. Java中的数组和方法

    3.1 数组的定义和使用 数组(Array)是用来存储一组相同数据类型数据的集合.数组中的每个数据称为一个元素(element),数组可以分为一维数组,二维数组和多维数组.我们 主要讲解一维数组和二维 ...

随机推荐

  1. 【BZOJ4660】Crazy Rabbit 结论+DP

    [BZOJ4660]Crazy Rabbit Description 兔子们决定在自己的城堡里安排一些士兵进行防守.给出 n 个点的坐标,和城堡里一个圆心在原点的圆形的障碍,兔子们希望从中选出 k 个 ...

  2. App Store App申请审核加速

    有没有遇到上线后发现很严重的bug这种情况,修复bug后提交审核又是漫长的等待,那样会把人逼疯的. 估计是为了对应这样的情况,Apple提供有一个加速审核的通道: https://developer. ...

  3. activeMQ安装与测试

    Apache ActiveMQ简介 activeMQ是JMS的一种具体的实现,是最流行的,能力强劲的开源消息总线.activeMQ具有以下优势: 多种语言和协议编写客户端(java.C.C++.AJA ...

  4. sass学习之一:sass安装compass部署

    主要参考 http://www.jianshu.com/p/5bfc9411f58f -------------------------------------------- sass基于ruby 需 ...

  5. 获取当前日期和农历的js代码

    来自:http://www.cnblogs.com/Gnepner/archive/2011/09/07/2169822.html 获取当前日期 getToday.js: function GetCu ...

  6. JDK源码分析之concurrent包(一) -- Executor架构

    Java5新出的concurrent包中的API,是一些并发编程中实用的的工具类.在高并发场景下的使用非常广泛.笔者在这做了一个针对concurrent包中部分常用类的源码分析系列.本系列针对的读者是 ...

  7. 巨蟒python全栈开发-第4天 列表&元组&range

    今日内容大纲 1. 什么是列表 定义: 能装对象的对象 在python中使用[]来描述列表, 内部元素用逗号隔开. 对数据类型没有要求 列表存在索引和切片. 和字符串是一样的. 2. 相关的增删改查操 ...

  8. 巨蟒python全栈开发flask2

    内容回顾: 上节回顾: Flask .response 三剑客: render_template 模板 redirect 重定向 - URL地址 "" 字符串 HTTPRespon ...

  9. Storm-源码分析-Topology Submit-Task

    mk-task, 比较简单, 因为task只是概念上的结构, 不象其他worker, executor都需要创建进程或线程 所以其核心其实就是mk-task-data, 1. 创建TopologyCo ...

  10. 原!!junit mockito 自定义参数匹配 -- ArgumentMatcher

    前两天写单元测试的时候,发现一个dao对象 mock成功了,但是调用该dao对象的某个方法时,并没有按照设定的值返回,而是返回null. 但是记得之前也都是这么写没有碰到问题,直接mock对象,调用方 ...