------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
数组
概念: 同一种类型数据的集合。其实数组就是一个容器。
数组的好处: 可以自动给数组中的元素从0开始编号,方便操作这些元素。
格式: 元素类型[] 数组名 = new 元素类型[元素个数或数组长度];
示例: int[] arr = new int[5];
格式二: 元素类型[] 数组名 = new 元素类型[] {元素,元素,......}
示例:
int [] arr = new int [] {2,3,4,5};
int [] arr = {3,2,3,4};
内存结构
Java程序在运行时,需要在内存中分配空间。为了提高运算效率,对空间进行了不同区域的划分,因为每一片区域都有特定的处理数据方式和内存管理方式。
栈内存: 用于存储局部变量,当数据使用完,所占空间会自动释放。
堆内存:
A 数组和对象,通过new建立的实例都存放在堆内存中
B 每一个实体都有内存地址值
C 实体中的变量都有默认初始化值
D 实体不再被使用,会在不确定的时间内被垃圾回收器回收
还有方法区,本地方法区,寄存器。
null: 内存地址指向为空
C++ 由程序员手动清除内存,Java程序员不用手动清除,对象或实体变为垃圾,Java虚拟机的垃圾回收机制自动将内存中不再被使用的实体不定时清除
关于数组的一些练习程序
package day01;
/*获取数组中的最大值
* 思路:
* 1,获取最值需要进行比较,每一次比较都会有一个较大的值,因为该值不确定,通过一个变量进行临时存储
* 2,让数组中的每一个元素都和这个变量中的值进行比较,如果大于了变量中的值,就用该变量记录较大值
* 3,当所有的元素都比较完成,那么该变量中存储的就是数组中的最大值了
* 步骤:
* 1,定义变量,初始化为书中任意一个元素即可
* 2,通过循环语句对数组进行遍历
* 3,在遍历过程中定义判断条件,如果遍历到的元素比变量中的元素大,就赋值给该变量
*
* */
public class ArrMax {
public static void main(String[] args) {
int [] arr = {2,3,4,2,34,445,33};
System.out.println(getMax(arr));
}
public static int getMax(int[] arr){
//中间变量
int temp = arr[0];
for(int i=0; i <arr.length; i++){
//如果元素大于temp 就把它的值赋给temp
if(arr[i]>temp)
temp = arr[i];
}
return temp;
}
}
输出结果:445
选择排序:每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完
示图:
示例代码:
package day01;
import java.util.Arrays;
public class ArrDemo {
public static void main(String[] args) {
//给定数组
int[] arr = {2,5,1,4,7};
//排序
selectSort(arr);
System.out.println(Arrays.toString(arr));
}
//选择排序
public static void selectSort(int[] arr){
for(int x = 0; x < arr.length-1; x++){
for(int y = x+1; y < arr.length; y++){
//交换位置
if(arr[x] > arr[y]){
int temp = arr[x];
arr[x] = arr[y];
arr[y] = temp;
}
}
}
}
}
打印结果[1,2,4,5,7]
冒泡排序:重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。
package day01;
import java.util.Arrays;
public class ArrDemo {
public static void main(String[] args) {
//给定数组
int[] arr = {2,5,1,4,7};
//排序
bubbleSort(arr);
System.out.println(Arrays.toString(arr));
}
//冒泡排序
public static void bubbleSort(int[] arr){
for(int x = 0; x < arr.length-1; x++){
for(int y = 0; y < arr.length-1-x; y++){//-x:让每一次比较的元素减少;-1避免角标越界
//交换元素位置
if(arr[y] > arr[y+1]){
int temp = arr[y];
arr[y] = arr[y+1];
arr[y+1] = temp;
}
}
}
}
打印结果[1,2,4,5,7]
折半查找
package day01;
import java.util.Arrays;
public class ArrDemo {
public static void main(String[] args) {
//给定数组
int[] arr = {1,2,3,4,7,9,11};
int index = halfSearch_2(arr,4);
System.out.println(index);
}
//第一种折半
public static int halfSearch(int[] arr,int key){
int min = 0 ,max = arr.length-1, mid;
while(min<=max){
mid = (min+max)>>1;
if(key > arr[mid])
min = mid + 1;
else if (key < arr[mid])
max = mid -1 ;
else
return mid;
}
return - 1;
}
//第二种折半
public static int halfSearch_2(int[] arr,int key){
int min = 0 ,max = arr.length-1;
int mid = (min + max)>>1;
while(key != arr[mid]){
if(key > arr[mid])
min = mid + 1;
else if (key < arr[mid])
max = mid -1;
if(min > max)
return -1;
mid = (min + max)>>1;
}
return mid;
}
}
打印结果:3
将十进制转化为二进制、八进制、十六进制
示例代码:
package day01;
//查表法十进制到二进制 八进制 十六进制的转换
public class Trans {
public static void main(String [] arrgs){
toBin(6);
System.out.println();
toOct(43);
System.out.println();
toHex(345);
}
//转换为二进制
public static void toBin(int num){
trans(num,1,1);
}
//转换为八进制
public static void toOct(int num){
trans(num,7,3);
}
//转换为十六进制
public static void toHex(int num){
trans(num,15,4);
}
public static void trans(int num, int base, int offset) {
//如果num等于0,结果输出为0
if (num == 0) {
System.out.println(0);
return;
}
//要查找的表格
char[] chs = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A',
'B', 'C', 'D', 'E', 'F' };
//一个数组存储转换后的字符
char[] arr = new char[32];
//操作数组的指针
int pos = arr.length;
while (num != 0) {
//num 与base 相与
int temp = num & base;
//将查到的字符存储到arr的--pos角标
arr[--pos] = chs[temp];
//num无符号右移offset位
num = num >>> offset;
}
for (int i = pos; i < arr.length; i++) {
System.out.print(arr[i]);
}
}
}
输出结果:
110
53
159