第七章 一维数组

7.2 数组的基础知识

  1.一旦数组被创建,它的大小是固定的。使用一个数组引用变量,通过下标来访问数组中的元素。

  2.数组是用来存储数据的集合,但是,通常我们会发现把数组看作一个存储具有相同类型的变量集合会更有用。

7.2.1 声明数组变量

  1.为了在程序中使用数组,必须声明一个引用数组的变量,并指明数组的元素类型

    语法:elementType[] arrayRefVar;(数据类型[] 数组引用变量)

  2.elementType可以是任意数据类型,但是数组中所有的元素都必须具有相同的数据类型。

7.2.2 创建数组

  1.不同于基本数据类型变量的声明,声明一个数组变量时并不在内存中给数组分配任何空间。它只是创建一个对数组的引用的存储位置。如果变量不包含对数组的引用,那么这个变量的值为null。除非数组已经被创建,否则不能给它分配任何元素。

    例子:double[] myList=new double[10];

  2.一个数组变量看起来似乎是存储了一个数组,但实际上它存储的是指向数组的引用。严格来讲,一个数组变量和一个数组是不同的,但多数情况下它们的差别是可以忽略的。

7.2.3 数组大小和默认值

  当数组分配空间时,必须指定该数组能够存储的元素个数,从而确定数组大小。创建数组之后就不能在修改它的大小。

7.2.4 访问数组元素

  1.数组元素可以通过下标访问。数组下标是基于0的,也就是说,其范围从0开始到arrayRefVar.length-1结束。

  2.数组中的每个元素都可以使用下面的语法表示,称为下标变量(indexed variable)

7.2.5 数组初始化语法

  1.Java有一个简捷的标记,称作数组初始化语法,它使用下面的语法将声明数组、创建数组和初始化数组结合到一个语句中:

  elementType[] arrayRefVar={value0,value1,value2,...,valuek};

  (元素类型[] 数组引用变量={值1,值2,...,值k};)

  2.数组初始化语法中不使用操作符new。使用数组初始化语法时,必须声明、创建和初始化数组都放在一条语句中。将他们分开会产生语法错误。因此,下面的语句是错误的:

  double[] myList;

  myList={1.9,2.9,3.4,3.5};

7.2.6 处理数组

  处理数组元素时,经常会用到for循环,理由有以下两点:

  • 数组中所有元素都是同一类型的。可以使用循环以同样的方式反复处理这些元素。
  • 由于数组的大小是已知的,所以很自然地就使用for循环。
7.3 编写一个程序,找到大于所有平均值的那些项

  

  1. package com.chapter7;
  2.  
  3. import java.util.Scanner;
  4.  
  5. public class AnalyzeNumber {
  6.  
  7. /**
  8. * 找到大于所有项大于平均值的那些项
  9. */
  10.  
  11. public static void main(String[] args) {
  12.  
  13. Scanner input=new Scanner(System.in);
  14.  
  15. System.out.println("请输入要存储的个数");
  16. int n=input.nextInt();
  17.  
  18. double[] numbers=new double[n];
  19. double sum=0;
  20.  
  21. System.out.println("请输入您想存储的数字");
  22. for(int i=0;i<numbers.length;i++){
  23. numbers[i]=input.nextDouble();
  24. sum+=numbers[i];
  25. }
  26.  
  27. double avg=sum/n;
  28. System.out.println("平均值为:"+avg);
  29.  
  30. for (int i = 0; i < n; i++) {
  31. if(numbers[i]>avg){
  32. System.out.println(numbers[i]);
  33. }
  34. }
  35.  
  36. }
  37.  
  38. }
  7.5 数组的复制

  1.在Java中,可以使用复制语句复制基本数据类型的变量,但不能复制数组。将一个数组变量赋值给另一个数组变量,实际上是将一个数组的引用复制给另一个变量,使两个变量都指向相同的内存地址。

  2.复制数组的三种方法:

  • 使用循环语句逐个地复制数组的元素。
  • 使用System类中的静态方法arraycopy。
  • 使用clone方法复制数组。
          1.      int[] sourceArray={2,3,1,5,10};
          2. int[] targetArray=new int[sourceArray.length];
          3. for(int i=0;i<sourceArray.length;i++){
          4. targetArray[i]=sourceArray[i];
          5. }
          6.  
          7. System.arraycopy(sourceArray, 0, targetArray, 0, sourceArray.length);
          8.  
          9. for (int i : targetArray) {
          10. System.out.println(i);
          11. }
  7.6 将数组传递给方法

   Java使用按值传递(pass-by-value)的方式将实参传递给方法。传递基本数据类型变量的值与传递数组值有很大的不同。

  • 对于基本数据类型参数,传递的是实参的值。
  • 对于数组类型参数,参数值是数组的引用,给方法传递的这个引用。从语义上来讲,最好的描述就是参数传递的是共享信息(pass-by-sharing),既方法中的数组和传递的数组是一样的。所以,如果改变方法中的数组,将会看到方法外的数组也变化了。 
  7.7 从方法中返回数组
  1. package com.chapter7;
  2.  
  3. public class Reverse {
  4.  
  5. public static void main(String[] args) {
  6.  
  7. int[] list1={1,2,3,4,5};
  8. int[] list2=reverse(list1);
  9. for (int i : list2) {
  10. System.out.println(i);
  11. }
  12.  
  13. }
  14.  
  15. public static int[] reverse(int[] list){
  16.  
  17. int[] result=new int[list.length];
  18.  
  19. for(int i=0,j=list.length-1;i<list.length;i++,j--){
  20. result[j]=list[i];
  21. }
  22. return result;
  23. }
  24.  
  25. }
  7.8 示例学习:统计每个字母出现的次数

  

  1. package com.chapter7;
  2.  
  3. import java.util.Random;
  4.  
  5. import com.chapter6.RandomCharacter;
  6.  
  7. public class CounteLettersInArray {
  8.  
  9. /**
  10. * 统计一个字符数组中每个字母出现的次数
  11. */
  12.  
  13. public static void main(String[] args) {
  14.  
  15. char[] chars=createArray();
  16. displayArray(chars);
  17. int[] counts=countLetters(chars);
  18. displayCounts(counts);
  19. }
  20.  
  21. public static char[] createArray(){
  22.  
  23. char[] chars=new char[100];
  24. for(int i=0;i<chars.length;i++){
  25. chars[i]=RandomCharacter.getRandomCharacter('a', 'z');
  26. }
  27. return chars;
  28. }
  29.  
  30. public static void displayArray(char[] chars){
  31.  
  32. for(int i=0;i<chars.length;i++){
  33. if((i+1)%20==0){
  34. System.out.println(chars[i]);
  35. }else{
  36. System.out.print(chars[i]+" ");
  37. }
  38. }
  39. }
  40.  
  41. public static int[] countLetters(char[] chars){
  42. int[] counts=new int[26];
  43. for(int i=0;i<counts.length;i++){
  44. counts[chars[i]-'a']++;
  45. }
  46. return counts;
  47. }
  48.  
  49. public static void displayCounts(int counts[]){
  50.  
  51. for(int i=0;i<counts.length;i++){
  52. if((i+1)%10==0){
  53. System.out.println((char)(i+'a')+"出现"+counts[i]+"次");
  54. }else{
  55. System.out.print((char)(i+'a')+"出现 "+counts[i]+"次");
  56. }
  57. }
  58. }
  59.  
  60. }
7.9 可变长参数列表

  1.具有同样类型的可变长度的参数可以传递给方法,并将作为数组对待。

  2.可以把类型相同但个数可变的参数传递给方法,方法中的参数声明如下:

    typeName...parameterName(类型名...参数名)

  1. package com.chapter7;
  2.  
  3. public class VarArgsDemo {
  4.  
  5. public static void main(String[] args) {
  6. printMax(34,3,3,2,56.5);
  7. printMax(new double[]{1,2,3});
  8. }
  9.  
  10. public static void printMax(double...numbers){
  11. if(numbers.length==0){
  12. System.out.println("No argument passed");//没有参数传递
  13. return;
  14. }
  15.  
  16. double result=numbers[0];
  17.  
  18. for(int i=1;i<numbers.length;i++){
  19. if(numbers[i]>result){
  20. result=numbers[i];
  21. }
  22. }
  23. System.out.println("The max value is"+result);
  24.  
  25. }
  26.  
  27. }
  7.1 数组的查找

  如果一个数组排好序了,对于寻找数组中的一个元素,二分查找法比线性查找更高效。

  7.10.1 线性查找法

  线性查找法将要查找的关键字key与数组中的元素逐个进行比较。这个过程持续在列表中找到与关键字匹配的元素,或者查完列表也没有找到关键字为止。如果匹配成功,线性查找法返回与关键字匹配的元素在数组中的下标。如果没有匹配成功,则返回-1。

  

  1. package com.chapter7;
  2.  
  3. public class LinearSearch {
  4.  
  5. public static void main(String[] args) {
  6.  
  7. int[] list={1,4,4,2,5,-3,6,2};
  8. int i=linearSearch(list, 4);
  9. System.out.println(i);
  10. int j=linearSearch(list, -4);
  11. System.out.println(j);
  12. }
  13.  
  14. public static int linearSearch(int[] list,int key){
  15. for(int i=0;i<list.length;i++){
  16. if(key==list[i]){
  17. return i;
  18. }
  19. }
  20. return -1;
  21. }
  22. }
  7.10.2 二分查找法

  二分查找法是另一种常见的对数值列表的查找方法。使用二分查找法的前提条件是数组中的元素必须已经排好序。假设数组已按升序排列。二分查找法首先将关键字与数组的中间元素进行比较。考虑下面三种情况:

  • 如果关键字小于中间元素,只需要在数组的前一半元素中继续查找关键字。
  • 如果关键字和中间元素相等,则匹配成功,查找结束。
  • 如果关键字大于中间元素,只需要在数组的后一半元素中继续查找关键字。  

  

  7.11 数组的排序

  选择排序

  

  1. package com.chapter7;
  2.  
  3. public class SelectionSort {
  4.  
  5. public static void main(String[] args) {
  6. int[] list={9,8,7,6,5,4,3,2,1};
  7. SelectionSort.selectionSort(list);
  8. }
  9.  
  10. public static void selectionSort(int[] list){
  11. for(int i=0;i<list.length-1;i++){
  12. for(int j=i+1;j<list.length;j++){
  13. int temp=list[i];
  14. list[i]=list[j];
  15. list[j]=temp;
  16. }
  17. }
  18. for (int i : list) {
  19. System.out.println(i);
  20. }
  21. }
  22. }
  7.12 Arrays类(java.util.Arrays)

  1.Arrays类包含一些实用的方法用于常见的数组操作,,比如排序和查找。

  2.Arrays类包含各种各样的静态方法,用于实现数组的排序和查找、数组的比较和填充数组元素,以及返回数组的字符串表示。这些方法都有对所有基本类型的重载方法。

  3.可以使用sort或parallelsort方法对整个数组或部分数组进行排序。

  4.可以采用二分查找法(binarySearch方法)在数组中查找关键字。数组必须提前按升序排列好。如果数组中不存在关键字,方法返回 -(插入点下标+1)。

  5.可以采用equals方法检测两个数组是否相等。如果他们的内容相同,那么这两个数组相等。

  6.可以使用fill方法填充整个数组或部分数组。

  7.可以是同toString方法来返回一个字符串,该字符串中代表了数组中的所有元素。这是一个显示数组中所有元素的快捷和简便的方法。

Java语言程序设计(基础篇) 第七章 一维数组的更多相关文章

  1. Java语言程序设计(基础篇) 第八章 多维数组

    第八章 多维数组 8.2 二维数组的基础知识 二维数组中的元素通过行和列的下标来访问. 8.2.1 声明二维数组变量并创建二维数组 下面是二维数组的语法: 数据类型[][] 数组名; int[][] ...

  2. Java语言程序设计(基础篇) 第六章 方法

    第六章 方法 6.2 定义方法 1.方法的定义由方法名称.参数.返回值类型以及方法体组成. 2.定义在方法头中的变量称为形式参数(formal parameter)或者简称为形参(parameter) ...

  3. Java语言程序设计(基础篇) 第五章 循环

    第五章 循环 5.2 while循环 1.while循环的语法如下: while(循环继续条件){ //循环体 语句(组); } 2.程序:提示用户为两个个位数相加的问题给出答案 package co ...

  4. Java语言程序设计(基础篇) 第四章 数学函数、字符和字符串

    第四章 数学函数.字符和字符串 4.2 常用数学函数 方法分三类:三角函数方法(trigonometric method).指数函数方法(exponent method)和服务方法(service m ...

  5. Java语言程序设计(基础篇) 第三章 选择

    第三章 选择 3.8 计算身体质量指数 package com.chapter3; import java.util.Scanner; public class ComputeAndInterpret ...

  6. 0031 Java学习笔记-梁勇著《Java语言程序设计-基础篇 第十版》英语单词

    第01章 计算机.程序和Java概述 CPU(Central Processing Unit) * 中央处理器 Control Unit * 控制单元 arithmetic/logic unit /ə ...

  7. Java语言程序设计(基础篇)第一章

    第一章 计算机.程序和Java概述 1.1 引言 什么是程序设计呢? 程序设计就是创建(或者开发)软件,软件也称为程序. 1.2 什么是计算机 计算机是存储和处理数据的电子设备,计算机包括硬件(har ...

  8. Java语言程序设计(基础篇)第二章

    第二章 基本程序设计 2.2 编写简单的程序 1.变量名尽量选择描述性的名字(descriptive name). 2.实数(即带小数点的数字)在计算机中使用一种浮点的方法来表示.因此,实数也称为浮点 ...

  9. Java语言程序设计-助教篇

    1. 给第一次上课(软件工程)的老师与助教 现代软件工程讲义 0 课程概述 给学生:看里面的第0个作业要求 2. 助教心得 美国视界(1):第一流的本科课堂该是什么样?(看里面的助教部分) 助教工作看 ...

随机推荐

  1. Ubuntu下Sublime Text 3解决无法输入中文的方法

    Ubuntu下Sublime Text 3解决无法输入中文的方法_百度经验http://jingyan.baidu.com/article/f3ad7d0ff8731609c3345b3b.html ...

  2. xml Schema 基础

    Schema比DTD好在哪儿? 后者简单易用,前者功能更强大也更复杂.DTD可以定义XML文档的结构,但无法对XML元素的内容进行约束,例如,如果希望某个XML元素的内容只能是日期型的数据,DTD就无 ...

  3. MongoDB 安装

    年初换了个硬盘空间更大的vps,这下终于可以装MongoDB了. 1 配置包管理系统(yum) 建立 /etc/yum.repos.d/mongodb-org-3.2.repo文件.内容如下: [mo ...

  4. Failed creating java D:/jre6/bin/client/jvm.dll

    Failed creating java D:/jre6/bin/client/jvm.dll 标记一下 坑爹啊! 我特么装了一个64位的eclipse 结果报错 目录下确实有这个文件. 我想说  6 ...

  5. C++中随机数和不重复的随机数

    随机数 int rand (); rand函数返回一个0-32767之间的一个伪随机整数,32767可以由宏RAND_MAX表示,该函数需要头文件<stdlib.h>. 常用的是如何生成一 ...

  6. PS 使用的常用命令

    本文记载一些简单的PS使用的命令 1. photoshop 画完矩形调整大小方法: a.画完矩形. b.按下Ctrl+T. c.拖边线上的小正方形就是了. 2. 画圆或者矩形时,按住shift 可以变 ...

  7. python lambda

    匿名函数和lambda: lambda [args1,[args2]] : expression python 使用lambda来创建匿名函数,匿名函数不需要以标准的方式进行创建,但是作为函数,它们也 ...

  8. C#最简单例子

    using System; namespace ConsoleApplication1 { class People { int age; string name; public string get ...

  9. 北京电子科技学院(BESTI)实验报告3

    北京电子科技学院(BESTI)实验报告3 课程: 信息安全系统设计基础 班级:1452.1453 姓名:(按贡献大小排名)周恩德 .郑凯杰 学号:(按贡献大小排名)20145217 .201453 指 ...

  10. SecureCRT 使用 rz 和 sz 命令

    1.下载软件 rzsz-3.34.tar.gz,登录linux,用命令 wget http://freeware.sgi.com/source/rzsz/rzsz-3.48.tar.gz下载. 2.解 ...