【Java总结】-【入门篇(第二周)】 后续每周总结一次
JAVA中数组的介绍与使用
一、概述
1.1 定义
- 数组是一种数据结构,用来存储同一类型值的集合。简单说,就是一个存放同种类型的容器。
- 数组是指一组数据的集合,数组中的每个数据称为元素。但同一个数组里只能存放类型相同的元素。
- 数组存放于一段连续的内存空间
1.2 使用数组的益处:
- 数组可将其中的每一个值自动添加对应的编号,每一个值称为一个元素,元素从0开始编号,方便对每个元素的管理
二、数组的创建和使用
2.1数组的创建步骤
- 声明一个数组类型的引用变量,简称数组变量。
- 用关键字new语句构造数组的实例,new语句为数组分配内存,并且为数组中每个元素赋一个默认值。
- 初始化,即为数组的每个元素设置合适的初始值
2.2数组的声明与初始化
数组的初始化就是给其分配空间
- 方式一: 先声明再初始化
public class ArraysDemo {
public static void main() {
// 这里举例子都用 `int` 类型
/*
先声明再初始化,必须明确的指定的容量大小
,进行动态赋值
*/
int[] arr;
arr = new int[10];
// 先声明再初始化,进行静态赋值
int[] arr1;
arr1 = new int[]{1,2,3,...1};
}
}
- 方式二: 声明的同时初始化
public class ArraysDemo {
public static void main() {
// 这里举例子都用 `int` 类型
/*声明的同时进行初始化*/
int[] arr = new int[10];
// 声明同时初始化,进行静态赋值
int[] arr1 = new int[]{1,2,3,...1};
// 声明同时初始化,进行静态赋值,java内部猜测右边的数据类型
int[] arr2 = {1,2,3,...1};
}
}
2.3数组的默认初始值
- byte,short,int,long 类型 的初始值默认为 0
- char 类型 的初始值为 Unicode 万国码 0对应的值
- float,double 类型 的初始值为 0.0
- boolean 类型的初始值为false
- String 等应用类型的初始化值为null
public class ArraysDemo {
public static void main() {
// 整形
byte[] arrByte = new byte[10];
short[] arrShort = new short[10];
int[] arrInt = new int[10];
long[] arrLong = new long[10];
// 浮点类型
float[] arrFloat = new float[10];
double[] arrDouble = new double[10];
// 字符类型
char[] arrChar = new char[10];
// 布尔类型
boolean[] arrBoolean = new boolean[10];
// 引用类型的代表
String[] arrString = new String[10];
System.out.println(
"byte数组的初始化值:" + arrByte[0] +
"short数组的初始化值" + arrShort[0] +
"int数组的初始化值" + arrInt[0] +
"long数组的初始化值" + arrLong[0] +
"float数组的初始化值" + arrFloat[0] +
"double数组的初始化值" + arrDouble[0] +
"char数组的初始化值" + arrChar[0] +
"boolean数组的初始化值" + arrBoolean[0] +
"String数组的初始化值" + arrString[0] );
}
}
三、数组的赋值与遍历输出
3.1数组的赋值
注意:
1.这里数组的下标是从0开始的,所以10个空间就是0~9.因为计算机底层就是0,1编码为了不浪费最开始的一个空间,就设定为从0开始。
2.数组的length属性能够表示数组的长度 通过 数组名.length 表示
- 方式一:
普通赋值法:
public class ArraysDemo {
public static void main() {
int[] arr = new int[10];
arr[0] = 1;
arr[1] = 2;
...
arr[9] = 10;
}
}
- 方式二:
循环赋值法:
public class ArraysDemo {
public static void main() {
int[] arr = new int[10];
for(int i = 0;i < arr.length;i++) {
arr[i] = i;
}
}
}
- 方式三:
数组赋值给数组
public class ArraysDemo {
public static void main() {
int[] arr = {1,2,3,4,5,6,7,8,};
int[] arr1;
arr1 = arr; // 这里使得arr1的指向arr的引用地址
}
}
3.2数组的遍历输出
- for循环输出
public class ArraysDemo {
public static void main() {
int[] arr = {1,2,3,4,5,6,7,8,};
for(int i = 0; i < arr.length; i++){
System.out.print(arr[i] + "\t");
}
}
}
- 增强for循环输出
public class ArraysDemo {
public static void main() {
int[] arr = {1,2,3,4,5,6,7,8,};
for(int number : arr){
System.out.print(number + "\t");
}
}
}
- while,do-while也能循环遍历只要设置个标志位
public class ArraysDemo {
public static void main() {
int[] arr = {1,2,3,4,5,6,7,8,};
int i = 0;
// while循环
while( i < arr.length){
System.out.print(arr[i] + "\t");
i++;
}
// do-while循环
do{
System.out.print(arr[i] + "\t");
i++;
}while(i< arr.length);
}
}
四、多维数组
4.1声明加创建
注意: 多维数组与二维数组类似,这里只列举二维。
public class ArraysDemo {
public static void main() {
// 方式一:
int[][] arr = {{1,2},{2,1}};
// 方式二:
int[][] arr1 = new int[5][4];
// 方式三:
int[][] arr2 ;
arr2 = new int[4][5];
// 方式三:
int[][] arr3 = new int[][]{{3,2},{2,3},{4,5}};
// 方式四:
int[][] arr4;
arr4 = new int[][]{{3,2},{2,3},{4,5}};
// 方式五:
int[][] arr5 = new int[5][];
}
}
4.2赋值加遍历输出
public class ArraysDemo {
public static void main() {
int[][] arr1 = new int[5][4];
// 多重for循环 遍历
for(int i = 0; i < arr1.length; i++) {
for(int j = 0; j < arr1[i].length; j++) {
arr[i][j] = i*j;
}
}
// 当然这里也可以用while do-while 嵌套循环 不在一一举例
}
}
五、数组的排序算法
5.1冒泡排序法
算法思想: 首先我们要有一个数组,里面存放着待排序的元素列表,我们如果需要把比较大的元素排在前面,把小的元素排在后面,那么需要从尾到头开始下面的比较操作:
- 从尾部开始比较相邻的两个元素,如果尾部的元素比前面的大,就交换两个元素的位置。
- 往前对每个相邻的元素都做这样的比较、交换操作,这样到数组头部时,第 1 个元素会成为最大的元素。
- 重新从尾部开始第 1、2 步的操作,除了在这之前头部已经排好的元素。
- 继续对越来越少的数据进行比较、交换操作,直到没有可比较的数据为止,排序完成。
public class ArraysDemo {
public static void main() {
int[] arr = {10,2,3,41,2,24,4};
/*
从小到大排序
*/
for(int i = 1; i < arr.length; i++) {
for(int j = 0; j < arr.length-i; j++) {
if(arr[j] > arr[j+1] ) {
int temp = array[j];
array[j] = array[j + 1];
array[j + 1] = temp;
}
}
}
}
}
5.2选择排序法
算法思想:
- 快速排序的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据比另一部分的所有数据要小,再按这种方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,使整个数据变成有序序列。
public class ArraysDemo {
public static void main() {
int[] arr = {10,2,3,41,2,24,4};
/*
从小到大排序
*/
for (int j=0; j < arr.length; j++)
{
//i=j,每比较一轮就减少一个数,比较后,再用第二个数获得后面的最小值
for (int i=j+1;i < arr.length; i++)
{
//换值
if (arr[j] > arr[i])
{
int temp = 0;
temp = arry[j];
arr[j] = arry[i];
arr[i] = temp;
}
}
}
}
}
5.2JDK排序法
JDK内部提供了一个排序算法 Arrays.sort()
public class ArraysDemo {
public static void main() {
int[] arr = {10,2,3,41,2,24,4};
/*
从小到大排序
*/
Arrays.sort(arr);
}
}
六、数组的拷贝与扩容
6.1数组的拷贝
- 1、普通拷贝法
public class ArraysDemo {
public static void main() {
int[] arr = {10,2,3,41,2,24,4};
int[] arr1=new int[arr.length];
for(int i = 0;i < arr.length; i++) {
arr1[i] = arr[i];
}
}
}
- 2、arraycopy(Object src,int srcPos,Object dest,int destPos,int length)
/*
参数1,需要被复制的目标数组
参数2,从这个数组的哪一个位置开始复制
参数3,需要把数据复制到的另外的那一个新的数组对象
参数4,复制到新数组里面哪个位置(从这个位置开始算)
参数5,复制的目标数组的长度
*/
public class ArraysDemo {
public static void main() {
int[] arr = {10,2,3,41,2,24,4};
int[] arrs = new int[7];
System.arraycopy(arr,0,arrs,0,arr.length);
}
}
- 3、copyOf(Object src)
public class ArraysDemo {
public static void main() {
int[] arr = {10,2,3,41,2,24,4};
int[] arrs;
arrs = Arrays.copyOf(arr);
}
}
数组的总结与心得:
- 数组在大部分高级语言中都有定义是一个数据结构之一,具有很好的存储数据方式。本周梳理构建数组在Java基础中十分重要,后续数组还有许多的java定义好的方法在java.util.Arrays;包里,使用可见JDK 1.8官方文档。本期就总结到这里