首页 网络编程 正文

Javaindexof “全栈2019”Java第二十八章:数组详解(上篇)

“全栈2019”Java第二十八章:数组详解(上篇)

难度

初级

学习时间

30分钟

适合人群

零基础

开发语言

Java

开发环境

JDK v11IntelliJ IDEA v2018.3

1.什么是数组?

抛砖引玉:

我们前面学过8大基本数据类型,如int x:

但是,这个变量x只能存储一个数字,要么存储1,要么存储2,它不能存1、2、3等等很多数字。那你为什么要存很多数字呢?有什么样的需求呢?

需求:

有一家网店,获得了3个评分,请先显示输出这个3个评分,然后求平均评分是几分。

思路:

定义三个变量分别对应三个评分将三个评分加起来,然后除以3求平均评分

实现:

结果:

讨论:

从运行结果来看,完全正确没有错误,但是从代码上来看就有问题,为什么呢?

这是3个评分,算少的,假如有100个评分呢?

定义变量从star1、star2一直到star100?

首先,评分的名字我们需要知道吗?不需要!

也就说我们只需要找一个地方将这些评分存储起来,到时候要用拿出就行。

也就是说,我们需要一个容器?

对,需要一个容器。

接下来,给大家介绍一个容器,它叫数组

定义:

数组是相同类型的、用一个标识符名称封装到一起的一个对象序列或基本类型数据序列。

2.数组的声明

数组是通过中括号[]来定义和使用的。要定义一个数组,只需在类型名后加上一个中括号[]即可。 如:

或者,中括号[]置于标识符后面:

推荐使用第一种:float[] stars;

3.数组的初始化

要使用数组,除了声明以外,还必须得初始化。

数组初始化有三种初始化方式。

数据类型[] 标识符 = {元素1,元素2...};new 数据类型[];new 数据类型{元素1,元素2...};

无论使用哪种初始化方式,非常重要的一点是:数组初始化必须明确数组的长度!!!

我们先来看第一种方式。

大家可以看到的是,stars数组是一个float类型数组,它里面有三个初始值3.5、4.0、3.0。

结论:

使用大括号{}初始化数组的时机是你已经知道数组有哪几个元素。换言之,就是你已经知你创建的这个数组要存储的元素是什么的时候,你就可以使用大括号{}初始化。

前面不是说数组初始化必须明确数组的长度吗?我怎么没看见指定数组长度的操作?那是因为当数组使用大括号{}初始化数组时,大括号{}里面写多少元素,那么数组的长度就是多少。

上面例子中,starts数组的长度是3。

再来看第二种数组初始化方式。

new是一个新关键字,用于创建对象。new关键字后续文章会有详细讲解。暂时理解为它可以开辟一块存储空间,供数组存放数据。

我们看到new float[3],其中中括号表示数组,3表示数组长度。

接下来,我们来看第三种方式:

代码实现:

和第一种定义数组的方式很类似,其实,第一种就是上面这种方式的简写形式。

4.获取数组中的元素

现在数组初始化了,怎么获取数组中的元素?什么叫元素?来看下图:

绿色的那一行是元素序列,里面的每一个值都称之为元素。如第一个元素为3.5,第二个元素为4.0,第三个元素3.0。

灰色的那一行是下标序列,里面的每一个值都称之为下标,数组的下标默认是从0开始的。

怎么获取数组里面的元素呢?

可以通过数组下标来获取对于的元素。

格式:

例如,获取第一个元素:stars[0];第二个元素:stars[1];

实现:

结果:

5.数组最大下标

需求:

定义一个数组,初始值为1、2、3,依次显示输出它们,然后计算数组内所有元素之和并显示输出。

思路:

定义一个int类型的数组。已经知道存储1、2、3三个数字,所以可以使用大括号{}初始化数组。使用下标取出数组内所有元素并显示输出,然后计算它们之和并显示输出。

实现:

结果:

从运行结果来看,正确无误。

该例中,我们从0开始取下标,取了0、1、2,如果我们取下标为3的元素会是什么?我们来看一下。

实现:

结果:

错误信息:

文字版:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3

意思是发生了一个java.lang.ArrayIndexOutOfBoundsException异常,异常原因是:Index 3 out of bounds for length 3。

异常是什么意思?

异常暂时先没讲解到,大家先理解为程序发生错误,代码写的不对。

ArrayIndexOutOfBoundsException是什么意思?

数组索引超出界限异常,索引就是下标,超出界限就是下标超出最大下标界限。

最大下标怎么获取?

最大下标 = 数组长度 - 1。

比如本例中的numbers数组的长度为3,那么它的最大下标是3-1=2,numbers数组最大下标为2。

6.数组的长度length

需求:

定义一个存储正整数的数组,数字是10以内的正整数,显示输出数组长度和最后一个元素。

思路:

定义一个int类型的数组。既然已经知道是10以内的正整数,那么就使用大括号{}初始化数组。获取最大下标。

实现:

结果:

从运行结果来看,正确无误。

但是从书写程序的思路来看,有点不妥,哪里不妥呢?

计算数组长度的地方不妥,本例中,我们知道大括号里面有多少个元素,所以可以很快通过数数得到数组的长度。

假如有更多的元素,我们还能通过数数得到数组的长度吗?能肯定能,就是不知道数到猴年马月去了。

有没有一种简单快速地获取数组长度方式呢?

答案是有的。

在数组对象中,有一个叫“length”的成员,它专门记录数组的长度。

下面我们来试试它吧:

结果:

从运行结果来看,正确无误。

而且我们还能显示输出一下数组的长度:

结果:

数组长度为9,也是正确的。

以后大家获取数组的长度请使用数组的length成员变量。

6.遍历数组

7.for循环遍历数组

8.while循环遍历数组

9.do-while遍历数组

11.数组的引用

12.大括号{}初始化数组的妙用

new String({'a','b','c'});

本章总结:

数组是一系列相同类型的序列。数组的定义方式一:数据类型 标识符[]数组的定义方式二:数据类型[] 标识符数组的初始化方式一:数据类型[] 标识符 = {元素1,元素2......}数组的初始化方式二:数据类型[] 标识符 = new 数据类型[长度];数组的初始化方式三:数据类型[] 标识符 = new 数据类型[]{元素1,元素2......}数组的初始化必须指定长度。数组的长度通过length成员获取。数组的最大下标 = 数组的长度 - 1。数组下标越界异常是ArrayIndexOutOfBoundsException。下标的取值范围在0-最大下标之间,请勿越界。

至此,Java中数组详解相关内容讲解先告一段落,更多内容请持续关注。

答疑

如果大家有问题或想了解更多前沿技术,请在下方留言或评论,我会为大家解答。

上一章

“全栈2019”Java第二十七章:流程控制语句中循环语句for

下一章

“全栈2019”Java第二十九章:数组详解(中篇)

学习小组

加入同步学习小组,共同交流与进步。

方式一:关注头条号gorhaf,私信“Java学习小组”。 方式二:关注公众号gorhaf,回复“Java学习小组”。

全栈工程师学习计划

关注我们,加入“全栈工程师学习计划”。

版权声明

原创不易,未经允许不得转载!

java项目中获取路径以及读写文件

在项目中一般都会遇到文件的读写,

一般有两个问题要进行处理

1路径问题

2读写问题

路径的解决方法

路径之间的连接"//"="\\"="/"

eg1:D盘下面file文件夹里面的1.txt

path="D://file//1.txt"

path="D:/file/1.txt"

path="D:\\file\\1.txt"

这三种都可以

1绝对路径(坚决不推荐使用)

就是从电脑的根目录开始C盘D盘,详情参考eg1

2相对路径

java项目中默认是从项目的根目录开始的 如下图

获取到该目录下的所有文件(获取的是一个目录)

./ 获取到当前根目录

String path="./"; File f=new File(path);File[] files=f.listFiles();for(int i=0;i<files.length;i++){System.out.println(files[i].getName());}

../ 获取到根目录下的父目录 想要获取到多级的父目录只需要../ 写n个就好了(需要注意的是这种方法最大只能获取到 Windows盘下面的根目录,就是最多只能获取到 C盘 或者D盘,不可能和Linux 那种 /root/D)web 项目中

主要是分清楚 工作空间和发布空间就好了

比如当初使用struts2文件上传的时候

定义接受文件的目录

ServletContext servletContext = ServletActionContext.getServletContext();

String str=servletContext.getRealPath("/files/"+fileFileName);

eclipse暂时出了点小问题等会再写这个

读写文件(如果不正确欢迎积极指出,一起进步)

因为文件有不同的格式,就文本文件来说有utf-8 GBK 等等

建议使用字节流 ( InputStream是所有字节输入流的祖先,而OutputStream是所有字节输出流的祖先)进行读取而不是字符流( Reader是所有读取字符串输入流的祖先,而writer是所有输出字符串的祖先)

其实就是内部一个使用byte[]实现,一个是用char[] 这个可以看一下 JDK的源码就了解了

具体 字符流字节流之间的区别请看转载处

http://blog.csdn.net/zxman660/article/details/7875799 http://blog.csdn.net/cynhafa/article/details/6882061读写文件package com.wzh.utils; import java.io.BufferedInputStream;import java.io.BufferedOutputStream;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.InputStream;import java.io.OutputStream; public class InOutFile {/** * @param file null、一个文件、一个文件目录、 * <pre> * fileToByte(null)=null * fileToByte(file)=null file>2G * fileToByte(文件目录)=null * fileToByte(file)=byte[] * </pre> * @return null(文件不存在,null,文件目录,文件太大>2G) byte[](转换成功) */public byte[] fileToByte(File file) {byte[] buffer = null;if (file == null) {throw new IndexOutOfBoundsException();}if (file.isDirectory())return buffer;if (file.length() > Integer.MAX_VALUE)return buffer;if (file.isFile()) {int filelength = (int) file.length();InputStream inputStream = null;BufferedInputStream bufferedInputStream = null;OutputStream outputStream=null;BufferedOutputStream bufferedOutputStream=null;File outfile=new File("files//out//"+file.getName());int n = 0;int off = 0;int length = 4096;try {if(!outfile.exists())outfile.createNewFile();inputStream = new FileInputStream(file);outputStream=new FileOutputStream(outfile, true);bufferedInputStream = new BufferedInputStream(inputStream);bufferedOutputStream=new BufferedOutputStream(outputStream);buffer = new byte[filelength];/* * 添加(length <= filelength - off) ? length : filelength - off)的比较 * 为了防止读到最后buffer 剩余的长度没有4096 装不下那么多会导致读取不了IndexOutOfBoundsException() * 当filelength - off=0时表示文件读取完毕但是read内部认为是其他线程占用io导致堵塞并不会认为文件读取完毕 * 所以要添加上filelength - off>0 */while ((filelength - off) > 0 && (n = bufferedInputStream.read(buffer, off,((length <= filelength - off) ? length : filelength - off))) >= 0) {bufferedOutputStream.write(buffer, off, n);off += n;}}catch (Exception e) {}finally {closeInputStream(bufferedInputStream);closeInputStream(inputStream);closeOutputStream(bufferedOutputStream);closeOutputStream(outputStream);System.out.println("end");}}return buffer;} /** * close inoutstream * @param inputStream null or the inputstream's child */private void closeInputStream(InputStream inputStream) {if (inputStream == null)return;try {inputStream.close();}catch (Exception e) {}}/** * close outputStream * @param outputStream null or the outputStream child */private void closeOutputStream(OutputStream outputStream) {if (outputStream == null)return;try {outputStream.flush();outputStream.close();}catch (Exception e) {}}}

当然字符流也可以进行读取文件

字符流也可以进行读取文件只不过要指定文件(文本文件)的编码

/** * 创建不同格式的文本文件 * @throws Exception */private void createFile() throws Exception {File file = new File("files//kindsformat//utf//1.txt");//File file = new File("files//kindsformat//gbk//1.txt");if (!file.exists())file.createNewFile();Writer writer = new OutputStreamWriter(new FileOutputStream(file, true), "UTF-8");//Writer writer = new OutputStreamWriter(new FileOutputStream(file), "GBK");BufferedWriter bufferedWriter = new BufferedWriter(writer);bufferedWriter.write("我是中文测试啊测试啊");bufferedWriter.flush();bufferedWriter.close();writer.close();}

有不对的地方欢迎指出,谢谢

相关问答

java index =-1是什么意思,弄不清概念?

1,第一种情况某些查询方法中,如果没有查找到你想要的结果,就会返回-1,表示没有查找到。例:String中的indexOf()2,在做数组的遍历时,有一个小技巧,就是...1,第...

(”Olympicgame”);B.“WelcometoGuangzhou”. indexOf (‘o...

[最佳回答]C错了String哪有delete方法

()和the indexOf ()结果的效果:Pleaseenterthefilteringkey:...

[最佳回答]importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStreamReader;publiccla...

如何深入理解 java 异常处理机制?

首先,我们知道Java有3种抛出异常的形式:throw(执行的时候一定抛出某种异常对象),throws(出现异常的可能性,不一定会发生),系统自动抛异常。throw用在一...参...

java 记事本的查找功替换能怎么实现,请说的具体点! - 懂得

查找功能String里面不是有个indexOf("")吗?这样找到第一个出现的位置,然后再从这个位置开始找下面的第一个出现的位置知道文章结束。返回找就应last...

最好的软件开发工具是什么?

在我认识的所有程序员里,每个人几乎都有专属于自己的常用工具和相关资源,今天给大家奉上数十个程序员硬核工具,我相信这里总有一款工具是属于你的!程序员生...

java 截取指定字符串中的某段字符如何实现?

java中提供了一个函数叫substring(),其中,substring函数有两个参数:1、第一个参数是开始截取的字符位置。(从0开始)2、第二个参数是结束字符的位置+1。...

java 在String对象中。如何得到一个指定字符的下标?

Strings="abc";inttemp=s.indexOf('a');System.out.println(temp);Strings=...

测试 netty 多个客户端,轮询发送消息,容易产生异常 - OSCHI...

packageorg.jboss.netty.example.length;importjava.net.InetSocketAddress...publicMessageDecoder(...

win10运行软件出现索引超出数组界限怎么解决?

方法/步骤定义一个int整形类型的数组,初始化10个整数,从1到10;然后循环依次输出11次,由于数组里只有10个数,第11次是抛出了数据越界的错误:java.lang.Array...