*Java基础之数组**
进入IT行业工作几年了,做过Java开发也做过大数据开发。在工作过程中我最大的体会就是基础很重要。也许如今Java比起十年前已经不那么火了,但个人觉得夯实好Java基础任然十分必要。因为扎实的语言基础能赋予我们学习新知识的灵感和能力。此外,就目前来看,现在深受重视的大数据开发很多地方也还需要Java支持。例如当你开发Hadoop时你需要用Java开发map和reduce,当你在用hive做离线分析时也可能会用Java来开发一些自定义函数以及Serde,你还可以用Java来开发Spark。所以Java并未过时,学好Java任然非常重要。
好了,前面似乎说地多了一些,现在咱们进入正题吧。这是我第一次写博客,所以这几只简单谈谈Java数组。在Java开发中针对数组的操作是家常便饭,下面我来分享一下Java数组的几个简单知识点以及基础操作。我一直把数组看作是存放数据的容器,数组一旦定义,它的长度就固定下来了不可再变。(生产上很多时候数据量是变化的,所以这成为数组的一个局限。)
一、数组的几个特点
(1) 不同于集合的是数组不仅可以存放引用类型的数据还可以存放基本类型的数据。(我们平时直接往集合存放基本类型的数据没有抛出异常是应为Jdk1.5之后的版本会隐式的进行自动的装箱和拆箱)。
(2) 同一数组只能存放一种类型的数据。
(3) 可通过索引直接访问指定位置的元素,而当要向数组中间插入一个元素,那么从要插入元素的位置开始以后的每一个元素都需要后移一位,所以数组查询效率高插入数据效率低。
(4) 我们可以通过数组的length属性来得到数组的长度,但是Java并未提供获取数组中实际元素个数的方法。
二、关于数组的两个类
java.lang.reflect.Array类:
该类提供了动态访问和创建数组的静态方法
java.util.Arrays类
此类包含用来操作数组(比如排序和搜索)的各种方法。此类还包含一个允许将数组作为列表来查看的静态工厂(toString())。
关于这个类我想说一下里面提供的排序方法和查找元素的方法:
1) sort():这是一个Arrays类提供的优化后的快速排序方法。
2) parallelSort():这是JDK1.8开始提供的方法,它适用于对数组中大批量数据的排序。如果一个数组中元素特别多,那么排序将是非常耗时的一项工作。该方法把数组分成若干单元然后开启多个线程来对这些单元分别利用sort排序,最后再把排序后的单元整合到一起。
3) binarySearch():这个方法有两个参数,给定一个数组,给定一个值就会返回该数组中与给定值相等的元素的位置。前提是数组元素必须是升序排好序的有序数组。
三、哈希表
元素的值和元素的位置存在特定关系的数组就称为哈希表,这种数组的特点就是查找数据的效率高。多个元素具有相同的哈希码的情况就叫哈希冲突。
三、向数组插入元素
前面说了,数组一旦定义其长度就固定了,那么如果数组已经满了但我们还需要向数组插入数据那该怎么办呢?解决方案有两个一个是Arrays类提供了copyOf(Object[ ],newLenth)方法,此方法复制指定数组,并返回一个新的指定长度的数组。另外就是System类提供了一个方法。static void arraycopy(Object src, int srcPos, Object dest , int destPos, int length)。
四、数组元素排序
数组元素排序的方法很多,在这里我只简单列几种最常见的排序案例:
- 冒泡排序
public class BubSort {
public static int[] bubSort(int[]arr){
for (int i=0;i<=arr.length-1;i++){
for (int j=0;j<arr.length-1;j++){
int tmp;
if (arr[j]<arr[j+1]){
}else if (arr[j]>arr[j+1]){
tmp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=tmp;
}
}
}
return arr;
}
public static void main(String[]args){
int[]arr=new int[]{
1,3,2,6,4,9,8,5,7,15,24,11
};
int[] brr=bubSort(arr);
System.out.print("[");
for (int i=0;i<=brr.length-1;i++){
if(i==brr.length-1){
System.out.print(brr[i]);
}else {
System.out.print(brr[i]+",");
}
}
System.out.print("]");
}
}
结果:[1,2,3,4,5,6,7,8,9,11,15,24]
2. 选择排序
public class SelectSort {
public static int[] selectSort(int[]arr){
for (int i=0;i<=arr.length-2;i++){
for (int j=i+1;j<=arr.length-1;j++){
int tmp;
if (arr[i]<= arr[j]){
}else if (arr[i] >arr[j]){
tmp =arr[i];
arr[i]=arr[j];
arr[j]=tmp;
}
}
}
return arr;
}
public static void main(String[]args){
int[]arr=new int[]{
1,3,2,6,4,9,8,5,7,15,24,11
};
int [] brr=selectSort(arr);
System.out.print("[");
for (int i=0;i<=brr.length-1;i++){
if (i==brr.length-1){
System.out.print(brr[i]+"]");
}else {
System.out.print(brr[i]+",");
}
}
}
}
结果:[1,2,3,4,5,6,7,8,9,11,15,24]
-
快速排序
public class BinarySort {
public static int[] binarySort(int[] arr,int low,int high){
int start = low;
int end = high;
int key = arr[low];
while(end > start){
//从后往前比较
while(end>start && arr[end]>=key) //如果没有比轴值小的,比较下一个,直到有比轴值小的交换位置,然后又从前往后比较
end–;
if(arr[end]<=key){
int temp = arr[end];
arr[end] = arr[start];
arr[start] = temp;
}
//从前往后比较
while(end > start && arr[start]<=key)//如果没有比轴大的,比较下一个,直到有轴值大的交换位置
start++;
if(arr[start] >= key){
int temp = arr[start];
arr[start] = arr[end];
arr[end] = temp;
}
//第一次循环比较结束,轴值的位置已经确定了。左边的值都比轴值小,右边的值都比轴值大,但是两边的顺序还有可能是不一样的,进行下面的递归调用
}//递归 if(start>low) binarySort(arr,low,start-1);//左边序列。 if(end<high) binarySort(arr,end+1,high);//右边序列。 return arr;
}
public static void main(String[]args){ int[]arr=new int[]{ 1,3,2,6,4,9,8,5,7,15,24,11 }; System.out.print("["); int[]brr = binarySort(arr,0,arr.length-1); for (int i=0;i<=brr.length-1;i++){ if (i==brr.length-1){ System.out.print(brr[i]+"]"); }else{ System.out.print(brr[i]+","); } } }
}
上一篇: Leetcode226. 翻转二叉树