51,411
社区成员
发帖
与我相关
我的任务
分享1.数组中的数据叫做元素 2.每个元素都有编号,叫做索引/下标 3.下标从0开始 4.数组是引用数据类型 5.数组一旦初始化,长度不可改变(意味着数组不可以添加和删除) 6.数组在内存中开辟的空间是连续的
数据类型 数组名[]; int[] is; -- int类型的数组 String[] names; -- 字符串类型的数组
1.静态初始化:由程序员指定数据,系统自动分配空间
public class 文件名{
public static void main(String[] args){
//静态初始化1
//String[] names = new String[]{"东邪","南帝","西毒","北丐","中神通"};
//静态初始化2 - 先声明,再初始化
//String[] names;
//names = new String[]{"东邪","南帝","西毒","北丐","中神通"};
//静态初始化3 - 简化静态初始化1的写法
String[] names = {"东邪","南帝","西毒","北丐","中神通"};
//设置指定下标上的元素
names[2] = "西狂";
//获取指定下标上的元素
String n = names[2];
System.out.println("获取指定下标上的元素:" + n);//西狂
//获取元素个数
int len = names.length;
System.out.println("获取元素个数:" + len);//5
System.out.println("-------------------------------------");
//遍历1 - for循环
for(int i = 0;i<names.length;i++){
System.out.println(names[i]);
}
System.out.println("-------------------------------------");
//遍历2 - foreach/增强for循环
for(String element : names){//依次循环数组中的元素,并赋值给element
System.out.println(element);
}
/**
for vs foreach
循环中使用到下标,就使用for
循环中不使用到下标,就使用foreach
*/
}
}
2.动态初始化:由程序员指定长度,系统自动分配初始值
整数类型:0
浮点类型:0.0
字符类型:' '
布尔类型:false
引用类型:null - 空
public class 文件名{
public static void main(String[] args){
//动态初始化1
//String[] names = new String[5];
//5表示连续开辟几个空间 - {null,null,null,null,null}
//动态初始化2 - 先声明,再此初始化
String[] names;
names = new String[5];
//5表示连续开辟几个空间 - {null,null,null,null,null}
//设置指定下标上的元素
names[0] = "aaa";
names[1] = "bbb";
names[2] = "黄蓉";
names[3] = "ccc";
names[4] = "ddd";
//ArrayIndexOutOfBoundsException - 数组下标越界异常
//names[5] = "eee";
//获取指定下标上的元素
String n = names[2];
System.out.println("获取指定下标上的元素:" + n);//黄蓉
//获取元素个数
int len = names.length;
System.out.println("获取元素个数:" + len);//5
System.out.println("-------------------------------------");
//遍历1 - for循环
for(int i = 0;i<names.length;i++){
System.out.println(names[i]);
}
}
}
3.静态初始化 vs 动态初始化
静态初始化:一开始就知道数据 动态初始化:一开始只知道长度
需求:声明5个长度的int数组,元素由用户输入,计算出最大值
import java.util.Scanner;
public class 文件名{
public static void main(String[] args){
int [] is = new int[5];
Scanner scan = new Scanner(System.in);
for(int i = 0;i<is.length;i++){
System.out.println("请输入第" + (i+1) + "个数字");
is[i] = scan.nextInt();
}
int max = is[0];
for(int i = 1;i<is.length;i++){
if(max < is[i]){
max = is[i];
}
}
System.out.println("最大值为:" + max);
}
}
口诀:
N个数字来排序
两两相比小靠前
外层循环N-1
内层循环N-1-i
public class 文件名{
public static void main(String[] args){
int [] is = {35,81,18,25,9};
for(int i = 0;i<is.length-1;i++){
for(int j = 0;j<is.length-1-i;j++){
if(is[j] >is[j+1]){
int temp = is[j];
is[j] = is[j+1];
is[j+1] = temp;
}
}
}
for(int num : is){
System.out.println(num);
}
}
}
思路:从头到尾遍历 缺点:慢
public class 文件名{
public static void main(String[] args){
int[] is = {35,81,18,25,9};
int num = 81;
for(int i = 0;i<is.length;i++){
if(num == is[i]){
System.out.println("找到元素了");
}
}
}
}
思路:先排序,在二分
import java.util.Arrays;
public class 文件名{
public static void main(String[] args){
int [] is = {35,81,18,25,9};
//排序 -- 9,18,25,35,81
Arrays.sort(is);
int num = 81;
int start = 0;
int end = is.length-1;
while(start <= end){
//求中间值
int mid = (start + end)/2;
if(num > is[mid]){//说明要查找的值在中间值的右边
start = mid+1;
}else if(num <is[mid]){//说明要查找的值在中间值的左边
end = mid-1;
}else{//找到了
System.out.println("找到了");
break;
}
}
}
}
缺点:修改原数组,会影响到新数组
public class 文件名{
public static void main(String[] args){
//原数组
String[] names = {"哆哆","咪咪","发发","嘻嘻"};
//新数组
String[] newNames = names;
//修改原数组中的数据
names[2] = "啦啦";
//遍历新数组
for(String element : newNames){
System.out.println(element);
}
}
}
public class 文件名{
public static void main(String[] args){
//原数组
String[] names = {"哆哆","咪咪","发发","嘻嘻"};
//新数组
String[] newNames = new String[names.length];
//遍历原数组,将原数组中的元素复制到新数组中
for(int i = 0;i<names.length;i++){
newNames[i] = names[i];
}
//修改原数组中的数据
names[2] = "啦啦";
//遍历新数组
for(String element : newNames){
System.out.println(element);
//遍历原数组
for(String element : names){
System.out.println(element);
}
}
}