数组
概念
一段连续的存储空间,用来存放某种类型的多个变量值
语法
数据类型 [] 数组变量名 = new 数据类型[数组长度]
创建
-
动态创建
数据类型 [] 数组变量名;
数组变量名 = new 数据类型[数组长度]
-
静态创建
- 声明并赋值
数据类型[] 数组名=new 数据类型[]{多个以英文逗号分隔的数据}
-
先声明后赋值
数据类型 [] 数组变量名;
数组变量名 = new 数据类型[] {多个以英文逗号分隔的数据};
使用
-
存值
数组名[索引位置]=值
-
取值
- 数组名[索引位置]
- 遍历
特点
数据类型限定了数组可以存放的数据类型
一个数组可以存储多个元素
一旦数组对象被创建好,那么其长度就固定不变了
动态创建好数组之后,会自动分配默认值,和数组中的元素类型有关(类似之前成员变量的默认值)
打印数组
基本数据类型打印的时候,都是直接打印的值,因为他们的值存放在栈中
-
引用和数据类型 除String 外,其他打印的地址值,因为真正放值的地方在堆中
public class _09ArrayDemo4 { public static void main(String[] args){ int[] arr={1,2,3,4}; //数组的长度 length 通过数组名.length可以获取到数组的长度 // System.out.println(arr.length); getSum(arr); getSum(4,3); } //定义一个方法 求一个数组中元素的和 static void getSum(int[] arr){ int sum=0;//声明初始的和为0 for(int i=0;i<arr.length;i++){//i.length为数组的长度 索引是从0开始 sum+=arr[i];//arr[i] 第一次 i=0 arr[0]取第一个位置的值 } System.out.println(sum);
参数传递
值传递
对于基本数据类型 在方法传递参数的时候传递的是具体的值
引用传递
对于引用类型传递的是引用地址 除String以外
冒泡排序
概念
取第一元素,假设为最大值.依次与后面的对比,后面的大,则交换值再做对比,知道吧最大值放在最后,再进行索引次,得到按小到大的数组
实现
import java.util.Arrays;
public class _01BubbleSort {
public static void main(String[] args){
int[] arr={10,2,1,8,7,5};
reverse(arr);
System.out.println(Arrays.toString(arr));
}
static void reverse(int[] arr1){//冒泡排序的方法
//一共要执行的冒泡次数为数组长度-1
for (int i=0;i<arr1.length-1 ;i++ ){
//-j减少判断
for (int j=0;j<arr1.length-1-i ;j++ ){
if (arr1[j]>arr1[j+1]){
int temp=arr1[j];
arr1[j]=arr1[j+1];
arr1[j+1]=temp;
}
}
}
}
}
二分搜索
概念
只能用于有序数组
实现
public class _03BinarySearch {
public static void main(String[] args){
System.out.println("Hello World!");
int[] arr={1,2,3,4,5,6,7,8};
//int[] arr1={9,8,7,6,5,4};
System.out.println(BinarySearch(3,arr));
//System.out.println(BinarySearch(6,arr1));
}
static int BinarySearch(int x,int[] arr){
int maxIndex=arr.length-1;
int minIndex=0;
int halfIndex=(maxIndex+minIndex)/2;
//对于未知次数的循环使用while,确定循环次数,用for循环
while (minIndex<=maxIndex){
/*if(x>arr[halfIndex]){
minIndex=halfIndex+1;
}else if(x<arr[halfIndex]){
maxIndex=halfIndex-1;
}else{
return halfIndex;
}
halfIndex=(maxIndex+minIndex)/2;*/
//该判断条件用于升序的数组
if (x==arr[halfIndex]){
return halfIndex;
}else if (x<arr[halfIndex]){
maxIndex=halfIndex-1;
}else if(x>arr[halfIndex]){
minIndex=halfIndex+1;
}
halfIndex=(maxIndex+minIndex)/2;
}
//如果没有找到,返回-1
return -1;
}
}
二维数组
创建
- 动态方法:
int[][] arr=new int[2][3] - 静态方法:
int[][] [][]arr={{1,2},{3,4}}
取值
arr[1]取到的是地址,即第二个数组的地址
arr[1][1]这个取得的才是数组里面的值
打印
public class _05TwoDimensionalArrays {
//这是一个主方法
public static void main(String[] args){
//用for循环遍历二维数组的值
for(int i=0;i<arr.length;i++){//先遍历外层的列表
for(int j=0;j<arr[i].length;j++){//遍历每一个列表的元素
System.out.print(arr[i][j]+",");//打印
}
System.out.println();
}
//用foreach 遍历二维数组
for(int[] i:arr){
for(int j:i){
System.out.println(j);
}
}
}
}
Arrays工具类
API使用
- 通过文档找到我们需要使用的类和方法
- 看这个方法是否有static修饰--》决定调用方式
- 看形参(调用此方法需要什么条件)
- 看结果(有些有返回值,有些没有)
Arrays类常用方法
static int binarySearch(Object[] a, Object key)
使用二分搜索法来搜索指定数组,以获得指定对象。
static <T,U> T[]
copyOf(U[] original, int newLength, Class<? extends T[]> newType)
复制指定的数组,截取或用 null 填充(如有必要),以使副本具有指定的长度。
static void sort(Object[] a)
根据元素的自然顺序对指定对象数组按升序进行排序。
static String toString(Object[] a)
返回指定数组内容的字符串表示形式。
增强for循环
概念
- 作用: 主要是用来遍历数组和集合的
- 缺点: 没有索引,凡是涉及有索引相关操作还是用普通for循环
语法
for(源中元素类型 e : 源 ){
//直接使用e就可以了
}
源 : 可以是数组或者集合(Iterable接口的实现类)
e : 形式参数,每次从源中遍历的数据,都临时存放在里面,可以在循环内部,通过e使 用到每一个元素
public class _08SuperFor {
public static void main(String[] args){
System.out.println("Hello World!");
int[] arr={1,55,64,3};
//一般来说推荐带索引的
for(int i=0;i<arr.length;i++){
System.out.print(arr[i]+" ");
}
System.out.println();
System.out.println("========");
//foreach无法控制次数,因为拿不到索引值
for(int i:arr){
System.out.print(i+" ");
}
}
}
可变参数
概念
可以达到传0个或者多个同类型变量的目的
其实可变参数本质上还是一个数组
就使用数组的方式去遍历可变参数
语法
方法名(参数类型...变量)
注意:
可变参数只能放到形参列表的最后
可变参数只能有一个
使用
public class _09VariableParameter {
public static void main(String[] args){
System.out.println("Hello World!");
//可以通过传数组的方式达到一次多个参数的目的
add(1,2,3,44);
}
//可变参数
static void add(int...param){//传入可变参数
System.out.println(param);//[I@15db9742
for(int i:param){
System.out.println(i);
}
}
}