一维数组
语法
int[] x
= new int[3];
System
.out
.println(x
[1]);
}
空间知识
当int[] arr = new int[3];时,会在堆区开辟一块连续的空间,然后栈区arr指向堆区所开辟空间的首地址,所以这就是为什么我们说arr是引用类型。 假如这时候,将arr=null,那么java的垃圾回收机制就会在不定时的时间段回收堆区所开辟的数组空间。
java与c++空间回收的区别
c++内存空间由开发人员手动释放,一旦忘记释放,项目时间一长性能会降低。 java则是由垃圾回收机制不定期检查并回收不需要的内存空间。 至于谁更优,笔者认为假如开发者经验足够,c++未尝不是更好的选择呢?
经典面试题
如下代码,试问x[1]的值为多少?
int []x
=new int[3];
int []y
=x
;
y
[1]=89;
由下图可知,两个引用变量共用一块内存空间,所以x[1]的值为89
当x=null时,堆区内存空间会被释放嘛?
int []x
=new int[3];
int []y
=x
;
y
[1]=89;
x
=null
;
不会,y仍然指向这块内存空间,所以不会被释放
试问a=?
int a
=5;
int b
=a
;
b
=8;
a=5,栈区变量空间独立,int b=a; 只是将b的值放到a的空间
数组声明与编译器
如下代码,由于编译器只检查语法,所以编译阶段下述代码不会报错,只有真正运行的时候才会报错
int []arr
=new int[3];
System
.out
.println(arr
[3])
一维数组与选择排序
原理图示
public static void sort(int[] arr
) {
for (int i
= 0; i
< arr
.length
- 1; i
++) {
for (int j
= i
+ 1; j
< arr
.length
; j
++) {
if (arr
[j
] < arr
[i
]) {
int temp
= arr
[i
];
arr
[i
] = arr
[j
];
arr
[j
] = temp
;
}
}
}
for(int index
=0;index
<arr
.length
;index
++){
System
.out
.print(arr
[index
]+" ");
}
}
public static void main(String
[] args
) {
int[] arr
={2,3,4,2,7,5};
sort(arr
);
}
冒泡排序
原理:每一轮循环后,都会冒出最大值或者最小值
public static void bubbleSort(int[] arr
) {
for (int i
= 0; i
< arr
.length
- 1; i
++) {
for (int j
= 0; j
< arr
.length
- i
- 1; j
++) {
if (arr
[j
] > arr
[j
+ 1]) {
Swap(arr
,j
,j
+1);
}
}
}
for (int index
= 0; index
< arr
.length
; index
++) {
System
.out
.print(arr
[index
] + " ");
}
}
public static void Swap(int[] arr
,int index1
,int index2
){
int temp
= arr
[index1
];
arr
[index1
] = arr
[index2
];
arr
[index2
] = temp
;
}
优化
因为数组排序会在堆区中出现大量的交换,消耗内存,所以希尔排序效率更高
折半查找
原理 :
每次二分查找,当mid>searchValue时,max=mid-1,反之min=mid+1当min>max说明查找失败由于一次可以筛选一半的数据,相比常规遍历查找,效率更高
传统二分查找代码
public static int HalfSearch(int[] arr
,int search_value
) {
int min_index
=0;
int max_index
=arr
.length
-1;
int mid_index
=(min_index
+max_index
)/2;
while(arr
[mid_index
]!=search_value
){
if(arr
[mid_index
]>search_value
)
max_index
=mid_index
-1;
else if(arr
[mid_index
]<search_value
)
min_index
=mid_index
+1;
if(min_index
>max_index
)
return -1;
mid_index
=(min_index
+max_index
)/2;
}
return mid_index
;
}
使用高效率的进制二分查找法
public static int HalfSearch2(int[] arr
,int search_value
) {
int mid_index
,min_index
=0,max_index
=arr
.length
-1;
while(min_index
<=max_index
){
mid_index
=(min_index
+max_index
)>>1;
if(arr
[mid_index
]>search_value
)
max_index
=mid_index
-1;
else if(arr
[mid_index
]<search_value
)
min_index
=mid_index
+1;
else
return mid_index
;
}
return -1;
}
进制转换练习题
传统做法
10进制转2进制
计算过程
public static void toBin(int num
){
StringBuffer sb
= new StringBuffer();
while(num
>0){
sb
.append(num
%2);
num
/=2;
}
System
.out
.println(sb
.reverse());
}
10进制转16进制
计算过程
public static void toHex(int num
) {
StringBuffer sb
= new StringBuffer();
for (int count
= 0; count
< 8; count
++) {
int temp_result
= num
& 15;
if (temp_result
> 9)
sb
.append((char) (temp_result
- 10 + 'A'));
else
sb
.append(temp_result
);
num
=num
>>>4;
}
System
.out
.println(sb
.reverse());
}
查表法进制转换
10进制转2、8、16进制
public static void ToHex(int num
, int change_num
, int move_num
) {
char[] chs
= { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
char[] result
= new char[8];
int pos
= result
.length
;
while (num
!= 0) {
int temp
= num
& change_num
;
result
[--pos
] = chs
[temp
];
num
= num
>>> move_num
;
}
for (int i
= pos
; i
< result
.length
; i
++) {
System
.out
.print(result
[i
]);
}
}
二维数组
声明方式以及注意事项
int[] arr
= new int[2];
int arr
[] = new int[2];
System
.out
.println(arr
);
System
.out
.println(arr
[1]);
空间分配方式
如下图
arr
[0][2]=90;
arr
[1][1]=90;
arr
[2][2]=90;
System
.out
.println(arr
.length
);
System
.out
.println(arr
[1].length
);
面试题
int[] x
,y
[];
int[] x
;
a
.
x
[0] = y
;
b
.
y
[0] = x
;
c
.
y
[0][0] = x
;
d
.
x
[0][0] = y
;
e
.
y
[0][0] = x
[0];
f
.
x
=y
;