一.数组
1.一维数组
含义:一组数据的容器
作用:存储多个数据
数组的声明:
数据类型[] 数组名/变量名;
注意:
- 数组是引用数据类型
- 数组中的数据,称之为元素
- 每个元素都有编号,称之为下标/索引
- 下标从0开始
- 下标的作用:通过下标可以定位到数组中的某个位置
- 数组一旦初始化成功,长度将不可改变
- 操作数组:
改 - 通过下标设置元素
查 - 通过下标获取元素
查 - 获取元素个数
查 - 遍历数组
数组的初始化:
静态初始化:数据由程序员给定,长度由系统分配
public class Test{
public static void main(String[] args){
//静态初始化一
//String[] names = new String[]{"AA","BB","CC","DD","EE"};
//静态初始化二(先声明再初始化)
//String[] names;
//names = new String[]{"AA","BB","CC","CC","DD"};
//静态初始化三(简化写法1)
String[] names = {"AA","BB","CC","DD","EE"};
//通过下标设置元素
names[2] = "FF";
//ArrayIndexOutOfBoundsException - 数组下标越界异常
//下标从0开始,不超过数组的长度
//names[5] = "xxx";
//通过下标获取元素
String str = names[2];
System.out.println("通过下标获取元素:" + str);
//获取元素个数
int len = names.length;
System.out.println("获取元素个数:" + len);//5
System.out.println("-----------");
//遍历数组 -- for循环
for(int i = 0;i<names.length;i++){
System.out.println(names[i]);
}
System.out.println("-----------");
//遍历数组 -- foreach/增强for循环
for(String element : names){//依次将元素赋值给element
System.out.println(element);
}
/**
for vs foreach
遍历时,使用到下标 -- for
遍历是,不使用下标 -- foreach
*/
}
}
动态初始化:
长度由程序员给定,数据由系统分配默认值
整数类型:0
浮点类型:0.0
字符类型:’ ’
布尔类型:false
引用类型:null(空)
public class Test{
public static void main(String[] args){
//动态初始化一
//String[] names = new String[5];//5-数组的的长度
//动态初始化二(先声明再初始化)
String[] names;
names = new String[5];
//通过下标设置元素
names[0] = "AA";
names[1] = "BB";
names[2] = "CC";
names[3] = "DD";
names[4] = "EE";
//ArrayIndexOutOfBoundsException - 数组下标越界异常
//下标从0开始,不超过数组的长度
//names[5] = "xxx";
//通过下标获取元素
String str = names[2];
System.out.println("通过下标获取元素:" + str);
//获取元素个数
int len = names.length;
System.out.println("获取元素个数:" + len);//5
System.out.println("-----------");
//遍历数组 -- for循环
for(int i = 0;i<names.length;i++){
System.out.println(names[i]);
}
System.out.println("-----------");
//遍历数组 -- foreach/增强for循环
for(String element : names){//依次将元素赋值给element
System.out.println(element);
}
/**
for vs foreach
遍历时,使用到下标 -- for
遍历是,不使用下标 -- foreach
*/
}
}
一维数组的应用:
需求:创建一个int数组,长度让用户指定,数据有用户输入,获取数组中的最大值
import java.util.Scanner;
public class Test{
public static void main(String[] args){
Scanner scan = new Scanner(System.in);
System.out.println("请输入数组的长度:");
int len = scan.nextInt();
if(len <= 0){
System.out.println("长度有误~~");
return;
}
//动态初始化数组
int[] is = new int[len];
//循环输入
for(int i = 0;i<is.length;i++){
System.out.println("请输入第" + (i+1) + "个数字:");
int num = scan.nextInt();
is[i] = num;
}
//获取数组中的最大值
int max = is[0];//假设数组第一个元素为最大值
for(int i = 1;i<is.length;i++){
if(max < is[i]){
max = is[i];
}
}
System.out.println("最大值为:" + max);
}
}
1.1 冒泡排序
public class Test{
/**
N个数字来排队
两辆相比小靠前
外层循环N-1
内层循环N-1-i
*/
public static void main(String[] args){
int[] nums = {81,23,56,18,33,9};
for(int i = 0;i<nums.length-1;i++){
for(int j = 0;j<nums.length-1-i;j++){
if(nums[j] > nums[j+1]){
int temp = nums[j];
nums[j] = nums[j+1];
nums[j+1] = temp;
}
}
}
for(int element : nums){
System.out.println(element);
}
}
}
1.2 线性查找/顺序查找
public class Test{
public static void main(String[] args){
int[] nums = {81,23,56,18,33,9};
int num = 18;//需要查找的值
for(int i = 0;i<nums.length;i++){
if(nums[i] == num){
System.out.println("找到元素了,下标为:" + i);
break;
}
}
}
}
1.3 二叉查找/二分法查找
import java.util.Arrays;
public class Test{
/**
知识点:数组的查找 -- 二叉查找/二分法查找
注意:必须先排序
*/
public static void main(String[] args){
int[] nums = {81,23,56,18,33,9};
int num = 18;//需要查找的值
//数组的排序 -- 9,18,23,33,56,81
Arrays.sort(nums);
int start = 0;
int end = nums.length-1;
while(start <= end){
int mid = (start+end)/2;
if(nums[mid] > num){
end = mid-1;
}else if(nums[mid] < num){
start = mid+1;
}else{
System.out.println("找到元素了,下标为:" + mid);
break;
}
}
}
}
1.4 数组的复制
public class Test{
/**
知识点:数组的复制1
缺点:修改源数组,新数组也会发生改变
*/
public static void main(String[] args){
//源数组
String[] names = {"AA","BB","CC","DD"};
//新数组
String[] newNames = names;
//修改源数组的数据
names[1] = "EE";
//遍历新数组
for(String str : newNames){
System.out.println(str);
}
}
}public class Test{
/**
知识点:数组的复制2
*/
public static void main(String[] args){
//源数组
String[] names = {"AA","BB","CC","DD"};
//新数组
String[] newNames = new String[names.length];
//数据的复制
for(int i = 0;i<names.length;i++){
newNames[i] = names[i];
}
//修改源数组的数据
names[1] = "EE";
//遍历新数组
for(String str : newNames){
System.out.println(str);
}
}
}
1.5 数组的扩容
public class Test{
/**
知识点:数组的扩容
扩容机制:原来长度的1.5
*/
public static void main(String[] args){
//源数组
String[] names = {"AA","BB","CC","DD"};
//老的长度
int oldCapacity = names.length;
//新的长度
int newCapacity = oldCapacity + (oldCapacity >> 1);
//创建新数组
String[] newNames = new String[newCapacity];
//将源数组的数据复制到新数组中
for(int i = 0;i<names.length;i++){
newNames[i] = names[i];
}
//将新数组的地址复制给源数组
names = newNames;
//遍历源数组
for(String str : names){
System.out.println(str);
}
}
}
1.6 数组的删除
public class Test{
/**
知识点:数组的删除1
*/
public static void main(String[] args){
//源数组
String[] names = {"AA","BB","CC","DD"};//0,1,2,3
//创建新数组
String[] newNames = new String[names.length-1];//0,1,2
//遍历源数组,将除了"BB"的元素都放入新数组中
int index = 0;
for(String element : names){
if(!element.equals("BB")){
newNames[index++] = element;
}
}
//将新数组的引用复制给原数组
names = newNames;
//遍历源数组
for(String element : names){
System.out.println(element);
}
}
}public class Test{
/**
知识点:数组的删除2
*/
public static void main(String[] args){
//源数组
String[] names = {"AA","BB","CC","DD"};//0,1,2,3
//数据的迁移
for(int i = 1;i<names.length-1;i++){
names[i] = names[i+1];
}
//把最后一个元素置为null
names[names.length-1] = null;
//遍历源数组
for(String element : names){
System.out.println(element);
}
}
}
2. Arrays工具类——专门操作数组的工具类
Simport java.util.Arrays;
public class Test11{
/**
知识点:Arrays工具类
含义:Java给我们提供的专门操作数组的工具类
工具类的概念:该类中所有的方法都是静态的,直接使用类名调用
API的概念:Java提供类的说明书(放在桌面去,方便我们查询)
*/
public static void main(String[] args){
int[] nums = {81,23,56,18,33,9};
//排序 -- 9,18,23,33,56,81
Arrays.sort(nums);
//查找
//返回值:搜索键的索引,如果它包含在数组中;否则, (-(insertion point) - 1)
//返回值:如果查找的值在数组中,就返回下标;否则,返回(-插入点-1)
int index = Arrays.binarySearch(nums,40);
System.out.println("查找元素的下标为:" + index);
//拷贝数组(目标数组,新的长度)
int[] arr1 = Arrays.copyOf(nums,nums.length*2);
//拷贝数组(目标数组,开始下标-包含,结束下标-不包含)
int[] arr2 = Arrays.copyOfRange(arr1,2,8);
//替换(目标数组,要替换的值)
Arrays.fill(arr2,888);
//替换(目标数组,开始下标-包含,结束下标-不包含,要替换的值)
Arrays.fill(arr2,1,4,666);
//将数组转换为字符串 -- [23,33,56,81,0,0]
System.out.println(Arrays.toString(arr2));
}
}
2.二维数组
2.1 静态初始化
public class Test{
/**
知识点:二维数组
含义:包含了多个一维数组
数组的声明:
数据类型[][] 数组名;
*/
public static void main(String[] args){
//静态初始化一
//String[][] names = new String[][]{{"AA","BB","CC"},{"DD","EE","FF","GG"}};
//静态初始化二(先声明,再初始化)
//String[][] names;
//names = new String[][]{{"AA","BB","CC"},{"DD","EE","FF","GG"}};
//静态初始化三(简化写法一)
String[][] names = {{"AA","BB","CC"},{"DD","EE","FF","GG"}};
//设置指定下标上的元素
names[1][1] = "NN";
//获取指定下标上的元素
String str = names[1][1];
System.out.println("获取指定下标上的元素:" + str);
//获取长度
System.out.println("获取二维数组中一维数组的个数:" + names.length);//2
System.out.println("获取二维数组中第一个一维数组元素的个数:" + names[0].length);//3
System.out.println("获取二维数组中第二个一维数组元素的个数:" + names[1].length);//4
System.out.println("-----------");
//遍历思路:先循环取出二维数组中的一维数组,再循环取出一维数组中的元素
//遍历数组 -- for
for(int i = 0;i<names.length;i++){
for(int j = 0;j<names[i].length;j++){
System.out.println(names[i][j]);
}
}
System.out.println("-----------");
//遍历数组 -- foreach
for(String[] ss : names){
for(String element : ss){
System.out.println(element);
}
}
}
}
2.2 动态初始化
public class Test{
/**
知识点:二维数组
含义:包含了多个一维数组
数组的声明:
数据类型[][] 数组名;
*/
public static void main(String[] args){
//动态初始化一
//String[][] names = new String[2][3];//2-创建2个一维数组 3-每个一维数组有3个元素
//动态初始化二(先声明,再初始化)
String[][] names;
names = new String[2][3];//2-创建2个一维数组 3-每个一维数组有3个元素
//设置指定下标上的元素
names[0][0] = "aa";
names[0][1] = "bb";
names[0][2] = "cc";
names[1][0] = "dd";
names[1][1] = "ee";
names[1][2] = "ff";
//获取指定下标上的元素
String str = names[1][1];
System.out.println("获取指定下标上的元素:" + str);
//获取长度
System.out.println("获取二维数组中一维数组的个数:" + names.length);//2
System.out.println("获取二维数组中第一个一维数组元素的个数:" + names[0].length);//3
System.out.println("获取二维数组中第二个一维数组元素的个数:" + names[1].length);//4
System.out.println("-----------");
//遍历思路:先循环取出二维数组中的一维数组,再循环取出一维数组中的元素
//遍历数组 -- for
for(int i = 0;i<names.length;i++){
for(int j = 0;j<names[i].length;j++){
System.out.println(names[i][j]);
}
}
System.out.println("-----------");
//遍历数组 -- foreach
for(String[] ss : names){
for(String element : ss){
System.out.println(element);
}
}
}
}