21day-4:Java数组


活动地址:CSDN21天学习挑战赛

目录

什么是数组

数组的定义

静态初始化数组

数组的使用

注意事项

动态数组定义

数组遍历

数组基本操作

数组的内存图

数组使用常见问题

debug的使用


什么是数组

数组(Array)是有序的元素序列。若将有限个类型相同的变量的集合命名,那么这个名称为数组名。组成数组的各个变量称为数组的分量,也称为数组的元素,有时也称为下标变量。用于区分数组的各个元素的数字编号称为下标。数组是在程序设计中,为了处理方便, 把具有相同类型的若干元素按有序的形式组织起来的一种形式。这些有序排列的同类数据元素的集合称为数组。

        String[] str = {"aaa","bbb","ccc"};
        int[] ints = {111,222,333};
        char[] chars = {'a','b','c'};
​
        String str1 = "aaa";
        String str2 = "bbb";
        String str3 = "ccc";
        
        int i1 = 111;
        int i2 = 222;
        int i3 = 333;

和正常对一种类型变量创建赋值来说,数组要比单个操作要方便快捷很多。

数组的定义

静态初始化数组

//完整格式
​
//数据类型[] 数组名 = new 数据类型[]{元素1,元素2 ,元素3… };
​
double[] scores = new double[]{89.9, 99.5, 59.5, 88.0};
​
int[] ages = new int[]{12, 24, 36} 
​
​
​
//简化格式
​
//数据类型[] 数组名 = { 元素1,元素2 ,元素3,… };
​
int[] ages = {12, 24, 36};

注意:数组变量名中存储的是数组在内存中的地址,数组是引用类型。

数组的使用

数组是有序的,可以根据索引来操作数组里面的数据。数组索引是从0开始的,也就是说以上的数组ages[0]=12。

//取值
System.out.println(arr[0]); // 12
​
//赋值
​
arr[2] = 100;
​
System.out.println(arr[2]); // 100
​
//数组可以使用 '数组名'.length ,可以查看数组长度
System.out.println(arr.length); // 3

上面可以根据 '数组名'.[索引值]来获取当点索引的这个变量,并且可以对他进行一系列的操作,可以根据length来获取数组的长度。因为索引从0开始,所以数组的最大索引则是数组长度-1,也就是length-1

注意事项

数组定义可以“数据类型[] 数组名”这样写,也可以写成 “数据类型 数组名[] ”这样写。

数组类型一旦定义,什么类型的数组存放什么类型的数据,否则报错。

数组被创建出来,长度就是刚创建出来的长度并且不能改变。

动态数组定义

定义数组的时候只确定元素的类型和数组的长度,之后再存入具体数据

//数据类型[] 数组名 = new 数据类型[长度];
​
int[] arr = new int[3];
​
// 后赋值
arr[0] = 10;
System.out.println(arr[0]); // 10

byte、short、int 、char、long类型数组元素的默认值都是0

float、double类型数组元素的默认值都是0.0

boolean类型数组元素的默认值是false、String类型数组元素的默认值是null

数组遍历

数组遍历就是指一个一个数据的访问。搜索、数据统计等等都需要用到遍历。

int[] ages = {20, 30, 40, 50};
​
for (int i = 0; i < ages.length; i++) {
​
System.out.println(ages[i]);
​
}
​
//输出
20
30
40
50

数组基本操作

我们根据数组的遍历,可以对数据进行些简单的操作

例如:int数组求和

int[] money = {16, 26, 36, 6, 100};
​
int sum = 0;
​
for (int i = 0; i < money.length; i++) {
​
// i = 0 1 2 3 4
​
sum += money[i];
​
}
System.out.printf(sum);//184

求最大值

int[] faceScores = {15, 9000, 10000, 20000, 9500, -5};
int max = 0;
​
for (int i = 0; i < faceScores.length; i++) {
​
if(faceScores[i] > max) {
​
// 替换
​
max = faceScores[i];
​
} 
​
}

数组的内存图

我们创建一个方法,字节码文件加载时进入内存的方法区

变量在栈内存,new出来的对象在堆内存,并开辟空间,产生地址

有时候存在两数组变量指向一个对象的时候

例如:int[] 数组= {11, 22, 33}; int[] 数组1 = 数组;

数组使用常见问题

问题1:如果访问的元素位置超过最大索引,执行时会出现ArrayIndexOutOfBoundsException(数组索引越界异常)

问题2:如果数组变量中没有存储数组的地址,而是null, 在访问数组信息时会出现NullPointerException(空指针异常)

int[] arr = new int[]{11, 22, 33};
​
System.out.println(arr[2]);
​
// System.out.println(arr[3]) //出现异常ArrayIndexOutOfBoundsException
//数组越界
​
arr = null;
​
System.out.println(arr); // null
​
// System.out.println(arr.length) //出现异常NullPointerException
//数组空指针

debug的使用

Debug工具

IDEA自带的断点调试(排错)工具,可以控制代码从断点开始一行一行的执行,然后详细观看程序执行的情况。

① 在需要控制的代码行左侧,点击一下,形成断点

② 选择使用Debug方式启动程序,启动后程序会在断点暂停

③ 控制代码一行一行的往下执行

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以按照以下步骤实现: 1. 解析工作时段字符串,将每个时间段存储为起始时间和结束时间的数组,以便于后续计算。可以使用 String 类的 split() 方法和 SimpleDateFormat 类的 parse() 方法来实现。 2. 计算出工作开始日期和结束日期之间的天数,并循环遍历每一天。 3. 对于每一天,先判断该天是否在工作日范围内。如果不在,则跳过该天的计算;如果在,则计算该天的工作时间。 4. 对于工作时间的计算,可以先计算出该天开始的时间和结束的时间,然后循环遍历每个工作时间段,将工作时间段和该天的时间段取交集,得到当天的实际工作时间。 5. 将每天的实际工作时间保存到一个 Map 中,以日期为键,工作时间段数组为值。 下面是一个可能的实现代码(仅供参考): ```java import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.*; public class WorkTimeCalculator { private static final SimpleDateFormat TIME_FORMAT = new SimpleDateFormat("HH:mm"); /** * 计算指定时间段内每天的工作时间 * @param workHours 工作时段字符串,格式为 "HH:mm-HH:mm;HH:mm-HH:mm;...",表示多个工作时间段 * @param startTime 工作开始时间 * @param endTime 工作结束时间 * @return Map,键为日期(yyyy-MM-dd),值为该天的工作时间段数组 */ public static Map<String, List<Date[]>> calculate(String workHours, Date startTime, Date endTime) { // 解析工作时段字符串,得到每个工作时间段的起始时间和结束时间 String[] timeRanges = workHours.split(";"); List<Date[]> workTimeList = new ArrayList<>(); for (String timeRange : timeRanges) { String[] parts = timeRange.split("-"); try { Date start = TIME_FORMAT.parse(parts[0]); Date end = TIME_FORMAT.parse(parts[1]); workTimeList.add(new Date[]{start, end}); } catch (ParseException e) { e.printStackTrace(); } } // 计算开始日期和结束日期之间的天数,并循环遍历每一天 Map<String, List<Date[]>> result = new LinkedHashMap<>(); Calendar calendar = Calendar.getInstance(); calendar.setTime(startTime); while (!calendar.getTime().after(endTime)) { // 判断该天是否在工作日范围内 int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK); if (dayOfWeek == Calendar.SATURDAY || dayOfWeek == Calendar.SUNDAY) { calendar.add(Calendar.DAY_OF_MONTH, 1); continue; } // 计算该天的工作时间 Date startOfDay = truncateToDay(calendar.getTime()); // 该天的开始时间 Date endOfDay = addDays(startOfDay, 1); // 该天的结束时间 List<Date[]> workTimeOfDayList = new ArrayList<>(); for (Date[] workTime : workTimeList) { Date startOfWorkTime = addDays(startOfDay, getTimeInMinutes(workTime[0])); // 工作时间段的开始时间 Date endOfWorkTime = addDays(startOfDay, getTimeInMinutes(workTime[1])); // 工作时间段的结束时间 if (startOfWorkTime.before(endOfDay) && endOfWorkTime.after(startOfDay)) { // 该工作时间段和该天有交集 Date start = startOfWorkTime.after(startOfDay) ? startOfWorkTime : startOfDay; Date end = endOfWorkTime.before(endOfDay) ? endOfWorkTime : endOfDay; workTimeOfDayList.add(new Date[]{start, end}); } } if (!workTimeOfDayList.isEmpty()) { result.put(formatDate(calendar.getTime()), workTimeOfDayList); } calendar.add(Calendar.DAY_OF_MONTH, 1); } return result; } /** * 将指定日期的时间部分截断为 00:00:00 */ private static Date truncateToDay(Date date) { Calendar calendar = Calendar.getInstance(); calendar.setTime(date); calendar.set(Calendar.HOUR_OF_DAY, 0); calendar.set(Calendar.MINUTE, 0); calendar.set(Calendar.SECOND, 0); calendar.set(Calendar.MILLISECOND, 0); return calendar.getTime(); } /** * 在指定的日期上加上指定的分钟数 */ private static Date addDays(Date date, int minutes) { Calendar calendar = Calendar.getInstance(); calendar.setTime(date); calendar.add(Calendar.MINUTE, minutes); return calendar.getTime(); } /** * 将时间转换为分钟数 */ private static int getTimeInMinutes(Date time) { Calendar calendar = Calendar.getInstance(); calendar.setTime(time); return calendar.get(Calendar.HOUR_OF_DAY) * 60 + calendar.get(Calendar.MINUTE); } /** * 将日期格式化为 yyyy-MM-dd */ private static String formatDate(Date date) { SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); return dateFormat.format(date); } } ``` 使用示例: ```java String workHours = "09:00-12:00;14:00-18:00"; SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date startTime = dateFormat.parse("2021-05-01 10:30:00"); Date endTime = dateFormat.parse("2021-05-05 16:30:00"); Map<String, List<Date[]>> result = WorkTimeCalculator.calculate(workHours, startTime, endTime); for (Map.Entry<String, List<Date[]>> entry : result.entrySet()) { String date = entry.getKey(); List<Date[]> workTimeList = entry.getValue(); System.out.println(date + ":"); for (Date[] workTime : workTimeList) { System.out.println(" " + dateFormat.format(workTime[0]) + " - " + dateFormat.format(workTime[1])); } } ``` 输出结果: ``` 2021-05-03: 2021-05-03 10:30:00 - 2021-05-03 12:00:00 2021-05-03 14:00:00 - 2021-05-03 18:00:00 2021-05-04: 2021-05-04 09:00:00 - 2021-05-04 12:00:00 2021-05-04 14:00:00 - 2021-05-04 18:00:00 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值