1.1.1. 数组
数组就是同一种数据类型的集合,数组其实是个容器。简单的来说数组就是存放东西,东西就是元素。数组的好处可以自动给数组的元素从0开始编号,方便操作这些元素。那么数组的格式是怎么样的了?
元素类型[] 数组名 = new 元素类型[元素的个数或者长度] |
new 的作用是在内存中创建一个数据类型的容器实体。
1.1.2. 数组的操作
数组的操作通常会获取数组的元素的值,就会用到遍历,遍历时就会用到数组的一个属性length。
数组的操作之求数组的最值,通过使用for循环的使用和套用,然后可以说是用到了算法, 冒泡排序法
1.1.3. 数组的排序
冒泡排序法:
public class Sort {
public static void main(String[] args) {
int[] arr = {5,1,6,4,2,8,9};
printArray(arr);
System.out.println("-----------------------------------------------");
bubbleSort(arr);
printArray(arr);
}
public static void bubbleSort(int[] arr) {
if(arr == null || arr.length == 0) {
throw new IllegalArgumentException("数组未初始化.");
}
for (int i = 0; i < arr.length - 1; i++) {
for (int j = 0; j < arr.length-1-i; j++) {//-x让每一次的比较的元素减少,-1的目的是避免下标越界
if(arr[j] > arr[j + 1]) {
int temp =arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
public static void printArray(int[] arr) {
if(arr == null || arr.length == 0) {
throw new IllegalArgumentException("数组未初始化.");
}
System.out.print("[");
for (int i = 0; i < arr.length; i++) {
if(i !=arr.length - 1)
System.out.print(arr[i] + ",");
else
System.out.print(arr[i] + "]");
}
}
}
|
选择排序法
程序代码:
public class Sort {
public static void main(String[] args) {
int[] arr = {5,1,6,4,2,8,9};
printArray(arr);
System.out.println("\n-----------------------------");
selectSort(arr);
printArray(arr);
}
public static void selectSort(int[] arr) {
if(arr == null || arr.length == 0) {
throw new IllegalArgumentException("数组未初始化.");
}
for (int i = 0; i < arr.length - 1; i++) {
for (int j = i + 1; j < arr.length ; j++) {
if(arr[i] > arr[j]) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
}
public static void printArray(int[] arr) {
if(arr == null || arr.length == 0) {
throw new IllegalArgumentException("数组未初始化.");
}
System.out.print("[");
for (int i = 0; i < arr.length; i++) {
if(i !=arr.length - 1)
System.out.print(arr[i] + ",");
else
System.out.print(arr[i] + "]");
}
}
}
|
从冒泡排序法和选择排序法中可以看到有些代码重复的地方,那就是位置置换的时候,所以为了简化代码可以对置换位置的这部分提取一个函数:
public static void swap(int[] arr,int a, int b) { int temp = arr[a]; arr[a] = arr[b]; arr[b] = temp; } |
1.1.4. 折半查找操作
折半查找顾名思义就是说每次查找只查找一半,重复执行这样的操作,这样比平时查找的方法提高查找的效率,但是要使用折半查找的前提需要数组已经排序过的。下面来看常用的代码书写:
public class HarfSearch {
public static void main(String[] args) {
int[] arr = {4,5,9,15,22,46};
System.out.println(generalSearch(arr, 215));
}
//常规查找方法
public static int generalSearch(int[] arr,int key) {
if(arr == null || arr.length == 0) {
throw new IllegalArgumentException("数组未初始化");
}
for (int i = 0; i < arr.length; i++) {
if (arr[i] == key) {
return i;
}
}
return -1;
}
}
|
折半的算法代码为:
public class HarfSearch {
public static void main(String[] args) {
int[] arr = {4,5,9,15,22,46};
//System.out.println(generalSearch(arr, 215));
System.out.println(harfSearch(arr, 22));
}
//折半查询
public static int harfSearch(int[] arr,int key) {
if(arr == null || arr.length == 0) {
throw new IllegalArgumentException("数组未初始化");
}
int start = 0,end,mid;
end = arr.length - 1;
mid = (start + end)/2;
while(arr[mid] != key) {
if(arr[mid] > key) {
end = mid -1;
}
else{
start = mid + 1;
}
if(start > end) {
return -1;
}
mid = (start + end)/2;
}
return mid;
}
}
|
1.1.5. 内存结构
首先要知道的是任何一个程序要运行都必须要在内存中开辟一片空间。分片的原因是每片空间的数据处理方式不一样而Java中给内存分为5各区,栈内存,堆内存、方法区、本地方法区和寄存器。栈中存放的都是以局部变量,当变量用完之后会自动释放空间。比如说int i=3,那么i的在内存区就是在栈中。而int[]arr = new int[3];则分为int[] arr和arr = new int[3];局部变量arr会定义在栈内存中,而newint[3]会在堆内存中开辟一个空间,让arr指向它,指向的是数组在堆内存中地址值。所以数组的存放是分开来的。于此类似的还有类和对象。Int[] arr =new int[]{1,2,3,4};这个叫做数组的静态初始化。这是数组的一种初始化方法,还有一种常见的初始化,int[2] = new int[2]; //那么初始化则为:arr[0] =1;arr[1] = 2;
补充:这里与两个异常①ArrayIndexOutofBoundsException ,数组越界;②NullPointerException 空指针异常,表示变量没有初始化值为null。
PS:上传第四天的Java学习笔记,基础中的基础over了,接下里的就基础中的中级了 了。 come on!
欢迎各位大虾指正错误!