凌晨朋友出的一道Java题

本文探讨了Java中泛型数组的使用,特别关注数组元素类型与引用类型的转换过程,解释了为何某些操作能够成功执行,而另一些操作则会触发错误。
import java.util.*;


public class FanXingArray {
public static void main(String[] args){
List<String> [] array = (List<String> [])new ArrayList[6]; 
Object[] obj = array;
obj[0] = new ArrayList<Integer>();
array[0].add("hello");
ArrayList<Integer> a = (ArrayList<Integer>)obj[0];
a.add(new Integer(8));
//Integer b = a.get(0);
System.out.println(a.get(0));
}


}


 


这段代码里面,array是String类型的,obj是Object类型的,a是Integer类型的。obj[0] = new ArrayList<Integer>();
array[0].add("hello");
ArrayList<Integer> a = (ArrayList<Integer>)obj[0];
这里为什么没有报错。相当于将字符串hello转换成了Integer类型,为什么没有报错。如果不报错,注释那行为什么会报错呢。还有,为什么a.get(0)为什么没有报错

---------------------------------------------------------割---------------------------------------------------------------

原因呢?先更新博文,原因再做更新。

我个人认为:声明array是字符类型的数组 然后obj复制array对象内存的引用。 之后给obj[0]对象的第一位的地址指向一个整型数组。再给array[0]赋值hello 这时 obj[0]的内存指向也是指向hello。往下走到a 将ojb[0]的地址指向给a 默认是a[0]的地址指向hello 它们都是引用类型 未涉及到转换问题 因而不出错。 a.add 向a添加8 输出a.get(0) 默认调用toString方法 故而不报错。 Integer b = a.get(0) 涉及到类型转换 因而报错。

大家可以debug调试下。


-------以上解释如有问题 请指正!谢谢。


<think>我们需要获取当天的凌晨时间(即当天的开始时间,00:00:00.000) 在Java中,我们可以使用多种方式来实现,具体取决于使用的Java版本和日期时间API。 常见的做法有: 1. 使用java.util.Calendar(旧版) 2. 使用java.time.LocalDateTime(Java 8及以上推荐) 3. 使用java.time.LocalDate(Java 8及以上) 考虑到现在推荐使用java.time包,以下主要展示Java 8及以上的方法。 方法1:使用LocalDate和atStartOfDay LocalDate today = LocalDate.now(); LocalDateTime todayStart = today.atStartOfDay(); // 默认时区系统时区,得到的是当天的00:00 方法2:指定时区 ZoneId zone = ZoneId.systemDefault(); // 或者指定时区,如ZoneId.of("Asia/Shanghai") LocalDateTime todayStart = LocalDate.now(zone).atStartOfDay(); 方法3:使用Calendar(旧版,不推荐但需要了解) Calendar calendar = Calendar.getInstance(); calendar.set(Calendar.HOUR_OF_DAY, 0); calendar.set(Calendar.MINUTE, 0); calendar.set(Calendar.SECOND, 0); calendar.set(Calendar.MILLISECOND, 0); Date todayStart = calendar.getTime(); 但是,如果我们需要的是时间戳或者Date对象,可以转换。 另外,有时需要获取当天的结束时间(即23:59:59.999): LocalDateTime todayEnd = today.atTime(LocalTime.MAX); // 23:59:59.999999999 下面给完整的示例代码:</think>### Java 获取当天凌晨时间的方法 #### 推荐方案(Java 8+ 时间 API) ```java import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; // 获取当天凌晨时间(系统默认时区) LocalDateTime todayStart = LocalDate.now().atStartOfDay(); // 获取当天结束时间(23:59:59.999999999) LocalDateTime todayEnd = LocalDate.now().atTime(LocalTime.MAX); ``` #### 完整示例代码 ```java import java.time.*; import java.util.Date; public class MidnightExample { public static void main(String[] args) { // 方法1:使用LocalDate.atStartOfDay() LocalDateTime midnight = LocalDate.now().atStartOfDay(); System.out.println("当天凌晨时间: " + midnight); // 方法2:指定时区 ZoneId zone = ZoneId.of("Asia/Shanghai"); ZonedDateTime zonedMidnight = LocalDate.now(zone).atStartOfDay(zone); System.out.println("上海时区凌晨: " + zonedMidnight); // 转换为传统Date对象 Date utilDate = Date.from(zonedMidnight.toInstant()); System.out.println("Date格式: " + utilDate); // 获取时间戳(毫秒) long timestamp = zonedMidnight.toInstant().toEpochMilli(); System.out.println("时间戳: " + timestamp); } } ``` #### 传统Java方案(Java 7及以下) ```java import java.util.Calendar; Calendar calendar = Calendar.getInstance(); calendar.set(Calendar.HOUR_OF_DAY, 0); calendar.set(Calendar.MINUTE, 0); calendar.set(Calendar.SECOND, 0); calendar.set(Calendar.MILLISECOND, 0); Date midnight = calendar.getTime(); ``` ### 关键特性说明: 1. **时间精度**: - `LocalDateTime` 精确到纳秒 - `Calendar` 精确到毫秒 2. **时区处理**: - 默认使用系统时区 - 可显式指定时区:`ZoneId.of("Asia/Tokyo")` 3. **时间运算**: ```java // 获取昨天凌晨 LocalDateTime yesterdayStart = LocalDate.now().minusDays(1).atStartOfDay(); // 获取明天凌晨 LocalDateTime tomorrowStart = LocalDate.now().plusDays(1).atStartOfDay(); ``` ### 常见应用场景: 1. 每日任务调度(如凌晨执行数据备份) 2. 时间范围查询(查询今天内的记录) 3. 统计每日数据(按自然日聚合) 4. 缓存有效期设置(当日有效) 5. 限流控制(每日访问次数限制)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值