本文共 4115 字,大约阅读时间需要 13 分钟。
突然感觉好久没有学习Java和写Java代码了,工作中使用的Groovy来源其实大部分和Java是一样,有时比Java风格要简写。对于很多初级程序员来说,不管什么开发写代码,关于数组,字符串的处理,肯定是最多的。这个系列,我来学习下Java中的数据结构和算法课程。有时候,面试看到了什么二叉树,红黑树,完全不知道是什么鬼,希望学习了这个课程之后,能掌握基本的,或者能够用在面试上面。
数组是学习数据结构和算法的基础,所以,我们需要花大量时间去弄懂数组和和数组的常用方法,甚至有些方法是需要我们去看源代码是如何实现的。关于数组,我们先复习下曾经在Java SE中的知识。
1、如何创建数组
package array;public class TestArray { public static void main(String[] args) { // 创建数组格式: 类型[] 数组名称 = new 类型[初始大小] int[] arr = new int[10]; }}
创建数组之前,需要想好数组的类型,是int还是long还是String,还需要给数组起一个名字,例如arr,使用关键字new来创建数组对象,而且需要指定数组的初始大小,例如上面10,表示这个数组最多有10个元素。
2、访问数组中数据项
数组的数据项也叫数组中的元素,是通过元素的索引来查找元素。数字0表示第一个元素,数字1表示第二个元素,数字-1表示最后一个元素,数字-2表示倒数第二个元素。
package array;public class TestArray { public static void main(String[] args) { // 创建数组格式: 类型[] 数组名称 = new 类型[初始大小] int[] arr = new int[10]; // 访问数组的数据项 arr[0] = 1; System.out.println(arr[0]); }}
3、数组的初始化
前面我们只是初始化了数组的大小,并没有对数据项初始化。如果想在声明数组的时候并初始化数组内容,需要如下做,并不需要给出数组大小。
package array;public class TestArray { public static void main(String[] args) { int[] arr = new int[]{1,2,3,4,5}; System.out.println(arr[2]); }}
4、经典的数组下标越界异常
在上面部分,我们初始化了数组,里面有{1,2,3,4,5}五个元素,如果我们想访问arr[5],这个时候就会报错:java.lang.ArrayIndexOutOfBoundsException
因为,元素下标是从数字0开始,而arr[6]是访问第六个元素,但是数组只有五个元素,所以报数组索引越界异常。
5、创建一个MyArray自定义封装数组方法类
package array;public class MyArray { private long[] arr; // 表示有效元素的长度 private int elements; public MyArray() { arr = new long[50]; } public MyArray(int maxsize) { arr = new long[maxsize]; }}
这个封装的类,写了一个属性,数组的元素大小,还写了两个构造方法,一个是无参数构造,默认元素大小是50,第二个是有参数构造,支持传进来的元素大小为参数。
6、添加类方法(数组操作)
我们先来添加数据方法和打印整个数组内容的方法,第二个打印方法需要掌握并能写出来。
package array;public class MyArray { private long[] arr; // 表示有效元素的长度 private int elements; public MyArray() { arr = new long[10]; } public MyArray(int maxsize) { arr = new long[maxsize]; } /** * 添加数据 */ public void insert(long value) { arr[elements] = value; elements++; } /** * 打印数组内容 */ public void print() { System.out.print("["); for (int i = 0; i < elements; i++) { System.out.print(arr[i] + " "); } System.out.println("]"); }}
测试类代码
package array;public class TestMyArray { public static void main(String[] args) { MyArray arr = new MyArray(3); arr.insert(13); arr.insert(24); arr.insert(96); arr.print(); }}
第一个方法insert()中,为什么要使用arr[elements]=value,然后elements++, 因为elements这个类属性,没有进行初始化,默认的值就是0,第一个添加元素进入数组,这个元素的索引就是0,第二次添加元素索引就是1,所以elements要自增。
第二个方法,这个方法可能在面试中会遇到,算是比较简单的送分题。一般题目会要求你使用自己的方法去打印数组内容,而且明确指出不能用JDK自带的API去实现。这个方法注意换行就是,还有最后一个元素后面空格,我们可以再次进行优化。
public void print() { System.out.print("["); for (int i = 0; i < elements; i++) { if(i == elements - 1) { System.out.print(arr[i]); }else { System.out.print(arr[i] + " "); } } System.out.println("]"); }
增加根据元素值找索引方法。
/** * 元素查找,根据value查key */ public int search (long value) { int i; for (i = 0; i < elements; i++) { if(value == arr[i]) { break; // 找到了就不再查了 } } //做判断,考虑查不到就返回-1 if(i == elements) { return -1; }else { return i; } }
测试代码
package array;public class TestMyArray { public static void main(String[] args) { MyArray arr = new MyArray(3); arr.insert(13); arr.insert(24); arr.insert(96); arr.print(); System.out.println(arr.search(96)); System.out.println(arr.search(102)); }}
运行结果:
[13 24 96]2-1
添加根据索引查找元素值方法
/** * 查找元素:根据元素索引查找值,需要考虑索引越界异常 */ public long search(int index) { if(index >= elements || index < 0) { throw new ArrayIndexOutOfBoundsException(); } else { return arr[index]; } }
下面来测试一下
package array;public class TestMyArray { public static void main(String[] args) { MyArray arr = new MyArray(3); arr.insert(13); arr.insert(24); arr.insert(96); arr.print(); System.out.println(arr.search(2)); System.out.println(arr.search(3)); }}
运行结果:
[13 24 96]96Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException at array.MyArray.search(MyArray.java:63) at array.TestMyArray.main(TestMyArray.java:13)
下一篇,继续学习这个数组类封装其他的操作方法。
转载地址:http://pkows.baihongyu.com/