java数组总结_Java知识点总结 (数组)

Java知识点总结 (数组)

@(Java知识点总结)[Java, Java数组]

[toc]

一维数组

定义

用于存储同一类型数据的一个容器

可以对该容器中的数据从0开始进行编号

数组是对象

声明数组

元素类型 [ ] 变量名 等价 元素类型 变量名 [ ]

元素类型 [ ] 变量名 = new 元素类型 [元素的个数];

元素类型 [ ] 变量名 = {元素1,元素2...};

元素类型 [ ] 变量名 = new 元素类型[ ]{元素1,元素2...};

数组元素的个数:__length__

下标运算:[ ]

数组的元素是通过索引访问的。数组索引从 0 开始,所以索引值从 0 到 length-1.

场景异常

ArrayIndexOutOfBoundsException(数组下标越界异常)

二维数组

二维数组可以看成以数组为元素的数组,例如:

01569344519fe9b02c0130fc7c983442.png

Java中多维数组的声明和初始化应从高维到低维的顺序进行,例如:

ae089238f181881d63de72a7d61db2e7.png

需要两次下标运算才能取出元素

30566caada770fcc35f3743148c9ff52.png

应用:表格、矩阵、棋盘、地图

数组相关算法

数组拷贝

import java.util.Arrays;

/**

* 数组拷贝

* @author Administrator

*

*/

public class ArrayTest2 {

//这样拷贝数组间没有隔离性

public static void test1(){

String[] ss1 = {"1","2","3"};

String[] ss2 = ss1; //把ss1对数组的引用传递给变量ss2,两个变量指向的是同一个数组

ss2[0] = "张三";

System.out.println(ss1[0]); //张三

}

public static void test2(){

String[] ss1 = {"1","2","3"};

String[] ss2 = new String[ss1.length];//通过new关键字在内存中开辟一块空间,ss2指向的是新的数组对象

for (int i = 0; i < ss2.length; i++) {

ss2[i] = ss1[i];

}

ss2[0] = "张三";

System.out.println(ss1[0]); //1

}

//API提供的方式,底层用C++写的,所以速度很快,比for循环的效率高

public static void test3(){

String[] ss1 = {"1","2","3"};

String[] ss2 = new String[ss1.length];

System.arraycopy (ss1, 0, ss2, 0, ss1.length);

System.out.println(Arrays.toString(ss2)); // [1, 2, 3]

}

public static void test4(){

String[] ss1 = {"1","2","3"};

String[] ss2 = Arrays.copyOf (ss1, ss1.length);

System.out.println(Arrays.toString(ss2)); //[1, 2, 3]

}

public static void main(String[] args) {

test1();

test2();

test3();

test4();

}

}

数组扩容

import java.util.Arrays;

/**

* 数组扩容

* @author Administrator

*

*/

public class ArrayTest3 {

public static void test1(){

String[] arry1 = {"张三","李四","王五"};

arry1 = Arrays.copyOf (arry1, arry1.length+2);

System.out.println(arry1.length); //5

System.out.println(Arrays.toString(arry1)); //[张三, 李四, 王五, null, null]

}

public static void test2(){

String str = "统计一个字符在字符串中的所有位置";

//int[] arry = countAll(str, '字'); // [4, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

int[] arry = countAll2(str, '字'); // [4, 7]

System.out.println(Arrays.toString(arry));

}

//浪费内存

private static int[] countAll(String str,char ch){

char[] charArray = str.toCharArray();

int[] array = new int[charArray.length];

int index = 0;

for (int i = 0; i < charArray.length; i++) {

if (ch == charArray[i]) {

array[index] = i;

index ++;

}

}

return array;

}

private static int[] countAll2(String str,char ch){

int[] array = {}; //创建一个空数组

for (int i = 0; i < str.length(); i++) {

if (ch == str.charAt(i)) {

array = Arrays.copyOf(array, array.length+1);

array[array.length-1] = i;

}

}

return array;

}

public static void main(String[] args) {

test1();

test2();

}

}

数组排序

import java.util.Arrays;

/**

* 排序

* @author Administrator

*

*/

public class ArrayTest4 {

// java 提供的排序方法

public static void arraySort(int[] array) {

Arrays.sort(array);

System.out.println(Arrays.toString(array));

}

// 冒泡排序,前一个数与后一个数进行比较

public static void bubbleSort(int[] array) {

int temp = 0;

for (int i = 0; i < array.length - 1; i++) {

for (int j = i + 1; j < array.length; j++) {

if (array[j] < array[i]) {

temp = array[i];

array[i] = array[j];

array[j] = temp;

}

}

}

System.out.println(Arrays.toString(array));

}

// 选择排序

public static void selectSort(int[] array) {

int temp = 0;

for (int i = 0; i < array.length - 1; i++) {

int min = i;

for (int j = i + 1; j < array.length; j++) {

if (array[min] > array[j]) {

min = j;

}

}

if (min != i) {

temp = array[i];

array[i] = array[min];

array[min] = temp;

}

}

System.out.println(Arrays.toString(array));

}

// 插入排序

public static void insertSort(int[] array) {

int temp = 0;

for (int i = 1; i < array.length; i++) {

for (int j = i; j > 0; j--) {

if (array[j]

temp = array[j];

array[j] = array[j-1];

array[j-1] = temp;

}else break;

}

}

System.out.println(Arrays.toString(array));

}

public static void main(String[] args) {

int[] array = getArray();

bubbleSort(array);

arraySort(array);

selectSort(array);

insertSort(array);

}

private static int[] getArray() {

int[] array = new int[10];

for (int i = 0; i < array.length; i++) {

array[i] = (int) (Math.random() * 100);

}

return array;

}

}

数组查找

import java.util.Arrays;

/**

* 无序数组 - 顺序查找

* 有序数组 - 二分查找

* @author Administrator

*

*/

public class ArrayTest5 {

//有序数组,二分查找

public static int binarySerarch(int[] array ,int num){

int low = 0;

int high = array.length-1;

while(low <= high){

int mid = (low+high)/2;

if (num>array[mid]) {

low = mid + 1;

}else if (num

high = mid - 1;

}else {

return mid;

}

}

return -1;

}

//Java 提供的查找方式。查看源码,它的本质就是二分查找

public static void test(int[] array ,int num){

int index = Arrays.binarySearch (array, 8);

System.out.println(index);

}

//无序数组,采用遍历,也可以先排序,后采用二分查找

public static int search(int[] array ,int num){

int index = -1;

for (int i = 0; i < array.length; i++) {

if (num==array[i]) {

index = i;

}

}

return index;

}

public static void main(String[] args) {

int[] array = {2,4,6,8,11,24,45,56,78,92,102};

int index = binarySerarch(array, 8);

System.out.println(index); // 3

test(array, 8); // 3

int[] array1 = {34,21,56,22,1,7,8,3,0,21};

System.out.println(search(array1, 1)); // 4

}

}

Arrays工具类

java.util.Arrays类能方便地操作数组,它提供的所有方法都是静态的

import java.util.Arrays;

import java.util.List;

public class ArrayTest6 {

public static void main(String[] args) {

int[] nums = new int[10];

//填充数组

Arrays.fill (nums, 3);

System.out.println(Arrays.toString(nums)); //[3, 3, 3, 3, 3, 3, 3, 3, 3, 3]

//将第4个元素到低8个元素的值,赋值为0

Arrays.fill (nums,3,8,0);

System.out.println(Arrays.toString(nums)); //[3, 3, 3, 0, 0, 0, 0, 0, 3, 3]

// 将第3到第5之间的元素进行排序

char[] ch = {'a','d','f','c','j','e'};

Arrays.sort (ch,2,5);

System.out.println(Arrays.toString(ch)); //[a, d, c, f, j, e]

// 比较元素是否相等

char[] ch2 = ch.clone();

System.out.println(Arrays.equals (ch, ch2)); //true 数组元素内容相等

System.out.println(ch == ch2); //false 不是同一个对象

//二分查找

Arrays.sort(ch); //必须先排好序,否则结果不正确

int index = Arrays.binarySearch (ch, 'c');

System.out.println(index); // 1

//数组转为list集合

int[] array1 = {34,21,56,22,1,7,8,3,0,21};

List list1 = Arrays.asList(array1);

System.out.println(list1.size()); //1

Integer[] array2 = {34,21,56,22,1,7,8,3,0,21};

List list2 = Arrays.asList (array2);

System.out.println(list2.size()); //10

for (Integer i : list2) {

System.out.print(i+","); // 34,21,56,22,1,7,8,3,0,21,

}

}

}

数组内存

int score[]; //声明一个整数数组score

此时这个变量并没有包含任何内容,编译器仅仅会分配一块内存给它,用来保存指向数组实体的地址,如图:

ddea53b47e1e6258f7e0b6f44de9c8f3.png

声明之后,接着要进行内存分配的操作。这一行代码会开辟3个可供保存整数的内存空间,并把此内存空间的参考地址赋给score变量。如图:

aa178cda132aaa65ceee06967c9ad597.png

二维数组内存:

160652b882e3ccb7a38b38a791adf64e.png

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值