2020-8-8 常见对象_02

本文深入讲解数组的排序算法,如冒泡排序、选择排序,以及查找方法,包括普通查找和二分法查找。同时,介绍了Java中Arrays类和Integer类的使用方法,如排序、转换等实用功能。

数组高级:

排序:

冒泡排序:

相邻元素两两比较,大的往后放,第一次完毕,最大值出现在了最大索引处;

例:

for(int i=0;i<arr.length-1;i++){
	
	for(int j=0;i<arr.length-1-i;j++){
		
		if(arr[j]>arr[j+1]){
			
			int temp=arr[j];

			int arr[j]=arr[j+1];

			int arr[j+1]=temp;
		
		}
	
	}	

}

选择排序:

从0索引开始,依次和后面的元素比较,小的往前放,第一次完毕,最小值出现在最小索引处;

例:

	for(int i=0;i<arr.length-1;i++){
	
	for(int j=i+1;j<arr.length;j++){
		
		if(arr[j]<arr[i]){
			
			int temp=arr[j];

			int arr[j]=arr[i];

			int arr[i]=temp;
		
		}
	
	}	

}

查找:

普通查找;

当数组内的元素无序时使用,遍历数组并用分支语句判断即可;

二分法查找(数组元素有序):

例子:

int[]arr={1,2,3,4,5};

int max=arr.length-1;

int min=0;

int mid=(max+mid)/2;

int value=3;

while(arr[mid]!=value){

	if(arr.[mid]>value){
	
		max=mid-1;

	}else if(arr[mid]<value){
	
		min=mid+1;

	}
	if(min>max){
	
		return -1;

	}
	
	mid=(max+mid)/2;
	
}

Arrays类:

概述:

针对数组进行操作的工具类,提供了排序,查找的等功能;

成员方法:

1.public static String toString(int[] a):将数组转为字符串;

2.public static void sort(int[] a):对数组进行升序排序;

3.public static int binarySearch(int[] a,int key)L使用二分法来搜索指定的值;

Integer 类:

概述:

Integer类在对象中包装了一个基本类型的值,该类提供了多个方法,能在int类型和String类型之间相互转换,还提供了处理int类型时非常有同的其他一些常量和方法;

成员方法:

public static String toBinaryString(int i):返回二进制无符号整数形式字符串;

public static String toHexString(int i):返回十六进制无符号整数形式字符串;

public static String toOctalString(int i):返回八进制无符号整数形式字符串;

public int intValue():将Integer类型的数据转换为int类型;

public statci  String toString(int i):将int类型的数据转换为String类型;

public static Integer valueOf(int i):将int类型的数据装箱;

public static int parseInt(String s):将String类型的数据转换为int类型;

String和Int的类型转换;

int->String:

最优解:String.valueOf(int i);

String->Int:

最优解:Integer.parseInt(String s);

进制转换:

十进制到其他进制;

public static String toString(int i,int radix);

其他进制到十进制:

public static int parseInt(String s,int radix);

Character 类:

概述:

Character类在对象中包装一个基本类型char的值,此外,该类提供了几种方法,以确定字符的类别(小写字母,数字等等),并将字符从大写转换成小写(反之亦然);

构造方法:

public Character(char value);	
<think>我们被要求解析日期时间字符串"2020-12-22T07:06:20Z"根据引用[1]和引用[3],这种格式是ISO8601格式,其中末尾的Z表示零时区(UTC时间)。我们可以使用Java中的DateTimeFormatter来解析这种格式。注意,这种格式的字符串可以表示为:yyyy-MM-dd'T'HH:mm:ssZ,但是这里末尾是'Z',在模式中我们可以使用X或Z来表示时区,但注意:-对于单个Z,它表示时区偏移量,格式为+0000,而这里的字符串末尾是字母Z,代表零时区。在DateTimeFormatter中,我们可以使用模式"yyyy-MM-dd'T'HH:mm:ssX"来解析,因为X可以解析Z(表示UTC)以及像+08:00这样的时区偏移。另外,引用[3]中提到了使用LocalDateTime.parse(),但是要注意:LocalDateTime是不包含时区信息的,而我们的字符串包含时区(Z表示UTC)。因此,更好的方式是解析为带时区的类型,比如Instant或ZonedDateTime。具体步骤:1.定义格式:DateTimeFormatterformatter=DateTimeFormatter.ISO_INSTANT;或者自定义格式。因为字符串末尾是Z,符合ISO_INSTANT格式,所以可以直接使用内置的ISO_INSTANT。2.解析为Instant(表示时间线上的一个点)或ZonedDateTime。但是注意:我们的字符串是"2020-12-22T07:06:20Z",它没有毫秒部分,而ISO_INSTANT要求至少要有秒,但可以没有毫秒。实际上,ISO_INSTANT可以解析这种格式。另一种方式是自定义格式:例如,使用模式"yyyy-MM-dd'T'HH:mm:ssX"。我们也可以参考引用[1]中的例子,但他们的字符串带毫秒和时区偏移(用+00:00表示),所以模式是"yyyy-MM-dd'T'HH:mm:ss.SSSz"。而我们的字符串没有毫秒,时区是Z(即UTC),所以模式可以调整为"yyyy-MM-dd'T'HH:mm:ssX"。因此,有两种方法:方法1:使用内置的DateTimeFormatter.ISO_INSTANTInstantinstant=Instant.parse("2020-12-22T07:06:20Z");//因为Instant.parse默认使用ISO_INSTANT方法2:自定义格式DateTimeFormatterformatter=DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssX");ZonedDateTimezdt=ZonedDateTime.parse("2020-12-22T07:06:20Z",formatter);注意:方法1最简单,因为字符串符合ISO_INSTANT标准格式。如果我们需要转换为其他格式,比如转换为本地时间,可以进一步处理。另外,引用[4]和引用[5]提供了在JavaScript和Java中处理日期格式化的方法,但这里我们主要关注解析。因此,在Java中解析"2020-12-22T07:06:20Z"的代码示例:使用Instant:Instantinstant=Instant.parse("2020-12-22T07:06:20Z");//如果需要转换为ZonedDateTime(指定时区)ZonedDateTimezdt=instant.atZone(ZoneId.systemDefault());//系统默认时区//或者指定时区,如ZoneId.of("Asia/Shanghai")使用ZonedDateTime直接解析:ZonedDateTimezdt=ZonedDateTime.parse("2020-12-22T07:06:20Z");因为ZonedDateTime.parse也默认使用ISO_ZONED_DATE_TIME格式,它能够解析这种带Z的字符串。但是注意:ISO_ZONED_DATE_TIME格式要求有区域信息,而我们的字符串只有Z(表示UTC),所以可以解析为UTC时区的ZonedDateTime。总结:推荐使用Instant.parse或ZonedDateTime.parse,因为它们都支持这种标准格式。如果需要输出为其他格式,可以使用DateTimeFormatter进行格式化。例如,输出为"yyyy-MM-ddHH:mm:ss"格式的本地时间:DateTimeFormatteroutputFormatter=DateTimeFormatter.ofPattern("yyyy-MM-ddHH:mm:ss");Stringformatted=zdt.format(outputFormatter);//注意:zdt已经是转换到本地时区后的对象,或者如果使用UTC时区,则输出的是UTC时间如果我们想转换为本地时间(比如系统默认时区),则需要在解析后转换时区。完整示例:Stringinput="2020-12-22T07:06:20Z";//解析为InstantInstantinstant=Instant.parse(input);//转换为系统默认时区的ZonedDateTimeZonedDateTimezdt=instant.atZone(ZoneId.systemDefault());//定义输出格式DateTimeFormatteroutputFormatter=DateTimeFormatter.ofPattern("yyyy-MM-ddHH:mm:ss");Stringresult=zdt.format(outputFormatter);或者一步到位:ZonedDateTimeutcZdt=ZonedDateTime.parse(input);ZonedDateTimelocalZdt=utcZdt.withZoneSameInstant(ZoneId.systemDefault());Stringresult=localZdt.format(DateTimeFormatter.ofPattern("yyyy-MM-ddHH:mm:ss"));根据用户需求,用户可能只需要解析,也可能需要转换时区并格式化。由于问题只要求解析,但通常解析后我们会进行转换或格式化,因此我们提供解析以及转换为本地时间的示例。另外,引用[2]和引用[5]提供了日期格式化的其他例子,可以参考。注意:如果用户不需要时区转换,只是想表示这个时间点,那么保留为Instant或UTC的ZonedDateTime即可。因此,我们根据需求提供两种解析方式,并演示如何转换为本地时间字符串。</think>### 日期时间格式解析:2020-12-22T07:06:20Z 这种格式属于 **ISO 8601 标准日期时间格式**,常见于编程和API交互中。解析关键点如下: #### 1. 格式结构说明 - `2020-12-22`:日期部分(年--日) - `T`:日期与时间的分隔符 - `07:06:20`:时间部分(时:分:秒) - `Z`:时区标识(表示 **UTC 零时区**,等同于 `+00:00`) #### 2. 解析方法(Java示例) ```java import java.time.Instant; import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; public class Main { public static void main(String[] args) { String isoTime = "2020-12-22T07:06:20Z"; // 方法1:直接解析为Instant(UTC时间点) Instant instant = Instant.parse(isoTime); System.out.println("UTC时间点: " + instant); // 2020-12-22T07:06:20Z // 方法2:转换为带时区的对象 ZonedDateTime utcTime = ZonedDateTime.parse(isoTime); System.out.println("UTC时区时间: " + utcTime); // 2020-12-22T07:06:20Z // 转换为本地时区(如中国时区) ZonedDateTime localTime = utcTime.withZoneSameInstant(ZoneId.of("Asia/Shanghai")); DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); System.out.println("本地时间: " + localTime.format(formatter)); // 2020-12-22 15:06:20 } } ``` #### 3. 其他语言示例 - **JavaScript**: ```javascript const isoStr = "2020-12-22T07:06:20Z"; const date = new Date(isoStr); console.log(date.toLocaleString("zh-CN")); // 2020/12/22 15:06:20(北京时间) ``` - **Python**: ```python from datetime import datetime iso_str = "2020-12-22T07:06:20Z" dt = datetime.fromisoformat(iso_str.replace('Z', '+00:00')) print(dt.strftime("%Y-%m-%d %H:%M:%S")) # 2020-12-22 15:06:20(需手动转换时区) ``` #### 4. 关键注意事项 - 末尾 `Z` 必须大写,表示UTC时区(小写 `z` 会导致解析失败)[^3]。 - Java中优先使用 `java.time` 包(Java 8+),避免旧版 `SimpleDateFormat` 的线程安全问题。 - 跨时区转换时需明确目标时区标识(如 `Asia/Shanghai`)。 --- ### 相关问题 1. **如何将这种格式的时间戳转换为毫秒级时间戳?** (例如获取自1970-01-01起的毫秒数) 2. **在不同时区场景下如何确保时间转换的准确性?** (如服务器时区与用户时区不一致时) 3. **ISO 8601 格式包含毫秒时如何解析?** (例如 `2023-11-29T02:38:43.031Z` 中的 `.031` 部分) 4. **如何在数据库存储时统一转换为UTC时间?** (避免时区混乱的最佳实践) [^1]: ISO 8601标准要求带时区的时间格式必须包含 `T` 分隔符和时区标识。 [^3]: Java的 `DateTimeFormatter` 对时区标识符大小写敏感,需严格匹配 `Z` 或 `+00:00`。 [^5]: 涉及数据库存储时,建议在应用层统一转换为UTC时间后再写入。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值