Java重修之路(五)数组基本概念,存储方式,遍历,排序,查找,多维数组
来源:互联网 发布:htcg15软件下载 编辑:程序博客网 时间:2024/04/20 01:55
数组遍历,排序,查找,多维数组
数组概念,定义,存储方式
数组在很多编程语言中都是比较重要的一部分,其中主要包含了数组在内存中的存储方式,以及对数组的各种操作:遍历,查找,排序等等,当然还有多维数组
- 数组的定义及内存分配特点
- 概念
数组是同一种类型的数据集合,本质就是一个容器
- 特点
自动给里面的元素编号,编号从0开始,数组里面的数据类型可以是任意的,但是同一个数组里面所有元素类型相同
- 格式
元素类型 [ ] 数组名=new 元素类型[元素个数或数组长度]
如: int[ ] num=new int[5]
元素类型 [ ] 数组名=new 元素类型[ ]{元素1,元素2······}
int[ ] num= new int[ ]{1,3,5,69};
int[ ] num= {1,3,5,69};
这里的中括号可以在元素类型后边,也可以在数组名后边:
type arrayName[ ]=new type[ arraySize];也是符合规范的
内存分配
java在运行程序时一共在内存中划分5块内存区域,分别是 栈内存、堆内存、方法区、本地方法区、寄存器。这里主要先介绍栈内存和堆内存。
简单的说,栈内存存放基本数据类型和对象的引用,用完之后会立即释放,堆内存用于存储对象的实体和数组,数组和对象在没有引用变量指向它的时候,才变成垃圾,不能再被使用,但是仍然占着内存,在随后的一个不确定的时间被垃圾回收器释放掉。
数组的静态赋值和输出public class Hello { public static void main(String[] args) { int arr[] = new int[] { 1, 5, 9, 4, 7 }; for (int i = 0; i < arr.length; i++) { System.out.print(arr[i]+"\t"); } }}
注意角标越界的问题,最大只能访问到arr[arr.length-1]
遍历数组并且获取最大值public class Hello { public static void main(String[] args) { int arr[] = new int[] { 1, 5, 9, 4, 7 }; System.out.println(getMax(arr)); } /** * 获取数组中最大值 * * @param arr * @return */ private static int getMax(int[] arr) { int max = arr[0]; for (int i = 0; i < arr.length; i++) { if (arr[i] > max) { max = arr[i]; } } return max; }}
初始化的问题
public static void main(String[] args) { int arr1[] = new int[5]; char arr2[] = new char[5]; boolean arr3[] = new boolean[5]; System.out.println(arr1[2]); System.out.println(arr2[2]); System.out.println(arr3[2]); }输出结果为:0 //int型默认为0 //char型默认为空false //boolean型默认为false
- 数组排序
- 冒泡排序(从小到大)
基本原理:
对于数组中的每一个元素,都会进行一次遍历,将相邻两个元素比较,最终结果是将大数字放在最后面,例如第一趟循环,将最大的数放在最后一位,第二次遍历,将第二大的数据放在倒数第二位···以此类推。
需要嵌套循环:对于第一个数来说,需要与后边每一个数字比较一次,结果就是将此数组中最大的数放在最后。public static void bubbleSort(int[] array) { int temp; for (int i = 0; i < array.length; i++) {// 趟数 for (int j = 0; j < array.length - i - 1; j++) {// 比较次数 if (array[j] > array[j + 1]) { temp = array[j]; array[j] = array[j + 1]; array[j + 1] = temp; } } }}
- 选择排序
基本思想:在要排序的一组数中,选出最小的一个数与第一个位置的数交换;然后在剩下的数当中再找最小的与第二个位置的数交换,如此循环到倒数第二个数和最后一个数比较为止。
/** * 选择排序 * @param array */public static void selectSort(int[] array) { int position = 0; for (int i = 0; i < array.length; i++) { int j = i + 1; position = i; int temp = array[i]; for (; j < array.length; j++) { if (array[j] < temp) { temp = array[j]; position = j; } } array[position] = array[i]; array[i] = temp; }}
- 插入排序
在要排序的一组数中,假设前面(n-1)[n>=2] 个数已经是排好顺序的,现在要把第n个数插到前面的有序数中,使得这n个数也是排好顺序的。如此反复循环,直到全部排好顺序
public static void insertSort(int[] array) { int temp = 0; for (int i = 1; i < array.length; i++) { int j = i - 1; temp = array[i]; for (; j >= 0 && temp < array[j]; j--) { array[j + 1] = array[j]; // 将大于temp的值整体后移一个单位 } array[j + 1] = temp; }}
还有希尔排序和快速排序,都是需要掌握的,这里就不贴出来了。
系统自带排序: Arrays.sort(arr);
- 数组的折半查找:
前提是该数组是有序的,否则会出错
public static int halfSearch(int[] array, int key) { int min, max, mid; min = 0; max = array.length - 1; mid = (min + max) / 2; while (array[mid] != key) { if (key > array[mid]) min = mid + 1; else if (key < array[mid]) max = mid - 1; mid = (max + min) / 2; } return mid; }
进制转换
- 十进制转换为二进制字符串
/** - 将十进制转换为二进制字符串返回 - - @param num - @return */public static String toBin(int num) { StringBuffer sb = new StringBuffer(); while (num != 0) { sb.append(num % 2); num /= 2; } return sb.reverse().toString();}
- 十进制转换为十六进制:
public static String toHex(int num) { StringBuffer sb = new StringBuffer(); for (int i = 0; i < 8; i++) { int temp = num & 15; if (temp > 9) sb.append((char) (temp - 10 + 'A')); else sb.append(temp); num = num >>> 4; } return sb.reverse().toString();}
多维数组
- 定义
int arr[ ][ ]=new int[3][4];
定义了一个名称为arr的二维数组,里面有3个一位数组,每个一维数组里面有4个元素。
int arr [ ] [ ]={{2,3},{3,4},{5,7}};
注意:
多维数组不允许说明静态数组 即:int[2][3];不合法
数组的维数说明必须从高维到低维,先说明高维再说明低维。
数组维数的指定只能出现在new之后。
下面是合法的说明:
int[] arr[] = new int[3][5];
int[][] arr2 = new int[3][];
int [][] arr3=new int[2][4];
下面是错误的说明:
int [2][3] arr;int[][]=new int[][3];int [2][]=new int[2][4];
- 多维数组遍历:
public static void main(String[] args) {int[] arr[] = new int[][] { { 2, 6, 58, 9, 4 }, { 5, 9, 84, 8, 68 }, { 895, 35, 15, 4, 3} };for (int i = 0; i < arr.length; i++) { for (int j = 0; j < arr[i].length; j++) { System.out.print(arr[i][j]+"\t"); } System.out.println();}}
关于数组就介绍这么多,下边真正进入主题,Java的面向对象。
- Java重修之路(五)数组基本概念,存储方式,遍历,排序,查找,多维数组
- Java多维数组遍历
- java多维数组遍历
- Java 多维数组遍历
- Java 多维数组遍历
- Java 多维数组遍历
- Java 多维数组遍历
- 数组 | 数组遍历 | 排序 | 多维(二维)数组
- java基础6 数组 排序 查找 多维数组
- Java 多维数组遍历详解
- Java 多维数组遍历详解
- JAVA多维数组的遍历
- Java基础知识之数组的定义,初始化,数组的使用,遍历数组,排序,查找
- Php 数组排序之多维数组排序
- 多维数组存储的两种方式
- JavaScript学习之遍历多维数组
- java多维数组的遍历输出
- NO4.java学习笔记(数组、数组的操作【遍历、排序、查找】)
- NodeJs学习笔记 02 -- Buffer
- 华为机试——字符串最后一个字符的长度
- LeetCode 104 Maximum Depth of Binary Tree
- 在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误
- HTTP协议详解(真的很经典)
- Java重修之路(五)数组基本概念,存储方式,遍历,排序,查找,多维数组
- Qt Charts示例
- Nginx出现413 Request Entity Too Large错误解决方法
- Elipse 中新建标签库描述文件(Tag Library Descriptor , TLD)
- 常见职位英文缩写
- 网络协议学习总结
- GCC后端指令生成分析(1)
- CDN优化-第三方CDN出现问题时,要引入本地的jQuery文件
- [心得] python打包