溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

SimpleDateFormat并發(fā)場(chǎng)景測(cè)試與驗(yàn)證

發(fā)布時(shí)間:2020-06-26 04:19:00 來源:網(wǎng)絡(luò) 閱讀:78 作者:15267303001 欄目:編程語言

前幾天工作中,遇到一個(gè)并發(fā)環(huán)境下有人寫了SimpleDateFormat的場(chǎng)景,印象中這個(gè)是不能支持多線程的,應(yīng)該使用ThreadLocal作為每個(gè)線程局部變量使用,今天有空,試了下SimpleDateFormat多線程使用,多個(gè)線程并發(fā)打印對(duì)象,代碼如下:

/**
?*?TestDateFormat.java
?*?zhm.test.dateFormat
?*?2018年5月2日下午9:02:07
?*
?*/
package?zhm.test.dateFormat;

import?java.sql.Timestamp;
import?java.text.ParseException;
import?java.text.SimpleDateFormat;
import?java.util.Calendar;
import?java.util.Date;
import?java.util.Random;

/**
?*?@author?zhuheming?TestDateFormat?2018年5月2日下午9:02:07
?*/
public?class?TestDateFormat?{

????public?static?TestDateFormat?tdf?=?null;

????SimpleDateFormat?sdf?=?new?SimpleDateFormat("yyyy-MM-dd");

????public?static?void?main(String[]?args)?{
????????tdf?=?new?TestDateFormat();
????????for?(int?i?=?1;?i?<=?9;?i++)?{

????????????Thread?th?=?new?Thread(new?Runnable()?{
????????????????@Override
????????????????public?void?run()?{
????????????????????while?(true)?{
????????????????????????Random?r?=?new?Random();
????????????????????????int?k?=?r.nextInt(100);

????????????????????????int?randomSwitch?=?k?%?3;

????????????????????????Calendar?c?=?Calendar.getInstance();
????????????????????????c.add(Calendar.DATE,?k);
????????????????????????try?{
????????????????????????????Thread.sleep(100);
????????????????????????????switch?(randomSwitch)?{
????????????????????????????case?0:
????????????????????????????????String?s1?=?c.get(Calendar.YEAR)?+?"-"
????????????????????????????????????????+?TestDateFormat.formatNumber((c.get(Calendar.MONTH)?+?1))?+?"-"
????????????????????????????????????????+?TestDateFormat.formatNumber((c.get(Calendar.DAY_OF_MONTH)));
????????????????????????????????Date?date1?=?tdf.printDateFormat(s1);
????????????????????????????????String?d1?=?new?Timestamp(date1.getTime()).toString();
????????????????????????????????d1?=?d1.substring(0,d1.indexOf("?"));
????????????????????????????????if(!s1.equals(d1)){
????????????????????????????????????System.out.println(s1+"?????"+d1);
????????????????????????????????}
????????????????????????????????break;
????????????????????????????case?1:
????????????????????????????????String?s2?=?c.get(Calendar.YEAR)?+?"-"
????????????????????????????????????????+?TestDateFormat.formatNumber((c.get(Calendar.MONTH)?+?1))?+?"-"
????????????????????????????????????????+?TestDateFormat.formatNumber((c.get(Calendar.DAY_OF_MONTH)));
????????????????????????????????Date?date2?=?TestDateFormat.printStaticDateFormat(s2);
????????????????????????????????String?d2?=?new?Timestamp(date2.getTime()).toString();
????????????????????????????????d2?=?d2.substring(0,d2.indexOf("?"));
????????????????????????????????if(!s2.equals(d2)){
????????????????????????????????????System.out.println(s2+"?????"+d2);
????????????????????????????????}
????????????????????????????????break;
????????????????????????????case?2:
????????????????????????????????String?s?=?c.get(Calendar.YEAR)?+?"-"
????????????????????????????????????????+?TestDateFormat.formatNumber((c.get(Calendar.MONTH)?+?1))?+?"-"
????????????????????????????????????????+?TestDateFormat.formatNumber((c.get(Calendar.DAY_OF_MONTH)));
????????????????????????????????Date?date3?=?tdf.printReferenceDateFormat(s);
????????????????????????????????String?d3?=?new?Timestamp(date3.getTime()).toString();
????????????????????????????????d3?=?d3.substring(0,d3.indexOf("?"));
????????????????????????????????if(!s.equals(d3)){
????????????????????????????????????System.out.println(s+"?????"+d3);
????????????????????????????????}
????????????????????????????????break;
????????????????????????????default:
????????????????????????????????return;

????????????????????????????}
????????????????????????}?catch?(Exception?e)?{

????????????????????????}
????????????????????}
????????????????}
????????????});
????????????th.start();
????????????try?{
????????????????th.join();
????????????}?catch?(InterruptedException?e)?{
????????????????//?TODO?Auto-generated?catch?block
????????????????e.printStackTrace();
????????????}
????????}

????}

????public?Date?printReferenceDateFormat(String?str)?{
????????System.out.println("get?the?ReferenceDateFormat:"?+?sdf);
????????try?{
????????????return?sdf.parse(str);
????????}?catch?(ParseException?e)?{
????????????//?TODO?Auto-generated?catch?block
????????????e.printStackTrace();
????????????return?null;
????????}
????}

????public?static?Date?printStaticDateFormat(String?str)?{
????????SimpleDateFormat?df1?=?new?SimpleDateFormat("yyyy-MM-dd");
????????System.out.println("get?static?method?the?SimpleDateFormat:"?+?df1);
????????try?{
????????????return?df1.parse(str);
????????}?catch?(ParseException?e)?{
????????????//?TODO?Auto-generated?catch?block
????????????e.printStackTrace();
????????????return?null;
????????}
????}

????public?Date?printDateFormat(String?str)?{
????????SimpleDateFormat?df2?=?new?SimpleDateFormat("yyyy-MM-dd");

????????try?{

????????????System.out.println("get?the?SimpleDateFormat:"?+?df2);
????????????return?df2.parse(str);
????????}?catch?(ParseException?e)?{
????????????//?TODO?Auto-generated?catch?block
????????????e.printStackTrace();
????????????return?null;
????????}
????}

????private?static?String?formatNumber(int?n)?{
????????String?s?=?"0"?+?n;
????????return?s.substring(s.length()?-?2);
????}
}

按照設(shè)想,應(yīng)該是sdf打印出的對(duì)象是同一個(gè),后面兩個(gè)打印出的對(duì)象因?yàn)槊看涡枰陆▽?duì)象,打印出來的都不相同才對(duì)。

但是結(jié)果如下:
get static method the?SimpleDateFormat:java.text.SimpleDateFormat@f67a0200
get the?SimpleDateFormat:java.text.SimpleDateFormat@f67a0200
get the?SimpleDateFormat:java.text.SimpleDateFormat@f67a0200
get the?SimpleDateFormat:java.text.SimpleDateFormat@f67a0200
get static method the?SimpleDateFormat:java.text.SimpleDateFormat@f67a0200
get the?SimpleDateFormat:java.text.SimpleDateFormat@f67a0200
get the?ReferenceDateFormat:java.text.SimpleDateFormat@f67a0200
get the?ReferenceDateFormat:java.text.SimpleDateFormat@f67a0200
get static method the?SimpleDateFormat:java.text.SimpleDateFormat@f67a0200
get static method the?SimpleDateFormat:java.text.SimpleDateFormat@f67a0200
get the?SimpleDateFormat:java.text.SimpleDateFormat@f67a0200
get the?ReferenceDateFormat:java.text.SimpleDateFormat@f67a0200
get the?SimpleDateFormat:java.text.SimpleDateFormat@f67a0200
get the?ReferenceDateFormat:java.text.SimpleDateFormat@f67a0200
get the?ReferenceDateFormat:java.text.SimpleDateFormat@f67a0200
get the?ReferenceDateFormat:java.text.SimpleDateFormat@f67a0200
get the?SimpleDateFormat:java.text.SimpleDateFormat@f67a0200
get static method the?SimpleDateFormat:java.text.SimpleDateFormat@f67a0200
get the?SimpleDateFormat:java.text.SimpleDateFormat@f67a0200
get static method the?SimpleDateFormat:java.text.SimpleDateFormat@f67a0200
get static method the?SimpleDateFormat:java.text.SimpleDateFormat@f67a0200
get static method the?SimpleDateFormat:java.text.SimpleDateFormat@f67a0200
get the?SimpleDateFormat:java.text.SimpleDateFormat@f67a0200
get static method the?SimpleDateFormat:java.text.SimpleDateFormat@f67a0200
get static method the?SimpleDateFormat:java.text.SimpleDateFormat@f67a0200
get the?ReferenceDateFormat:java.text.SimpleDateFormat@f67a0200
get the?ReferenceDateFormat:java.text.SimpleDateFormat@f67a0200
get the?SimpleDateFormat:java.text.SimpleDateFormat@f67a0200
get the?ReferenceDateFormat:java.text.SimpleDateFormat@f67a0200
get the?SimpleDateFormat:java.text.SimpleDateFormat@f67a0200
get the?SimpleDateFormat:java.text.SimpleDateFormat@f67a0200
get the?SimpleDateFormat:java.text.SimpleDateFormat@f67a0200
get static method the?SimpleDateFormat:java.text.SimpleDateFormat@f67a0200
get the?ReferenceDateFormat:java.text.SimpleDateFormat@f67a0200
get the?SimpleDateFormat:java.text.SimpleDateFormat@f67a0200
get the?SimpleDateFormat:java.text.SimpleDateFormat@f67a0200
get static method the?SimpleDateFormat:java.text.SimpleDateFormat@f67a0200
get static method the?SimpleDateFormat:java.text.SimpleDateFormat@f67a0200
get static method the?SimpleDateFormat:java.text.SimpleDateFormat@f67a0200
get the?ReferenceDateFormat:java.text.SimpleDateFormat@f67a0200
get the?SimpleDateFormat:java.text.SimpleDateFormat@f67a0200
get the?SimpleDateFormat:java.text.SimpleDateFormat@f67a0200
get static method the?SimpleDateFormat:java.text.SimpleDateFormat@f67a0200
get the?ReferenceDateFormat:java.text.SimpleDateFormat@f67a0200
get the?SimpleDateFormat:java.text.SimpleDateFormat@f67a0200
get the?ReferenceDateFormat:java.text.SimpleDateFormat@f67a0200

對(duì)象居然是同一個(gè),這就很奇怪了,誰知道原因呢?

看了下SimpleDateFormat源碼,里面根據(jù)pattern從static的concurrentHashMap中取對(duì)應(yīng)的信息,對(duì)于不同的SimpleDateFormat對(duì)象,只要定義的格式相同,pattern對(duì)象是同一個(gè)。

后來換了種方式測(cè)試,直接粗暴的寫五個(gè)進(jìn)程跑,證明確實(shí)會(huì)出現(xiàn)并發(fā)問題:
2018-12-25 2203-01-24
2498-10-10 2203-01-24
2018-12-25 0001-10-10
2998-01-02 3004-12-01
1698-09-22 3004-12-01
且只有共享的static會(huì)有這個(gè)問題,去掉共享的static,那么在方法內(nèi)調(diào)用的就不存在并發(fā)問題。

/**
?*?TestDateFormat.java
?*?zhm.test.dateFormat
?*?2018年5月2日下午9:02:07
?*
?*/
package?zhm.test.dateFormat;

import?java.sql.Timestamp;
import?java.text.ParseException;
import?java.text.SimpleDateFormat;
import?java.util.Calendar;
import?java.util.Date;
import?java.util.Random;

/**
?*?@author?zhuheming?TestDateFormat?2018年5月2日下午9:02:07
?*/
public?class?TestDateFormat?{

????public?static?TestDateFormat?tdf?=?null;

????//SimpleDateFormat?sdf?=?new?SimpleDateFormat("yyyy-MM-dd");

????public?static?void?main(String[]?args)?{
????????tdf?=?new?TestDateFormat();


????????????Thread?th2?=?new?Thread(new?Runnable()?{
????????????????@Override
????????????????public?void?run()?{
????????????????????while?(true)?{
????????????????????????Random?r?=?new?Random();
????????????????????????int?k?=?r.nextInt(100);

????????????????????????int?randomSwitch?=?k?%?3;

????????????????????????//Calendar?c?=?Calendar.getInstance();
????????????????????????//c.add(Calendar.DATE,?k);
????????????????????????try?{
????????????????????????????Thread.sleep(100);
????????????????????????????switch?(randomSwitch)?{
????????????????????????????case?0:
????????????????????????????????String?s1?=?"2018-12-25";
????????????????????????????????String?d1?=?tdf.printDateFormat(s1);
????????????????????????????????//String?d1?=?new?Timestamp(date1.getTime()).toString();
????????????????????????????????//d1?=?d1.substring(0,d1.indexOf("?"));
????????????????????????????????if(!s1.equals(d1)){
????????????????????????????????????System.out.println(s1+"?????"+d1);
????????????????????????????????}
????????????????????????????????break;
????????????????????????????case?1:
????????????????????????????????String?s2?=?"2018-12-25";
????????????????????????????????String?d2?=?TestDateFormat.printStaticDateFormat(s2);
????????????????????????????????//String?d2?=?new?Timestamp(date2.getTime()).toString();
????????????????????????????????//d2?=?d2.substring(0,d2.indexOf("?"));
????????????????????????????????if(!s2.equals(d2)){
????????????????????????????????????System.out.println(s2+"?????"+d2);
????????????????????????????????}
????????????????????????????????break;
????????????????????????????case?2:
????????????????????????????????String?s?="2018-12-25";
????????????????????????????????String?d3?=?tdf.printReferenceDateFormat(s);
????????????????????????????????//String?d3?=?new?Timestamp(date3.getTime()).toString();
????????????????????????????????//d3?=?d3.substring(0,d3.indexOf("?"));
????????????????????????????????if(!s.equals(d3)){
????????????????????????????????????System.out.println(s+"?????"+d3);
????????????????????????????????}
????????????????????????????????break;
????????????????????????????default:
????????????????????????????????return;

????????????????????????????}
????????????????????????}?catch?(Exception?e)?{

????????????????????????}
????????????????????}
????????????????}
????????????});

????Thread?th3?=?new?Thread(new?Runnable()?{
????????@Override
????????public?void?run()?{
????????????while?(true)?{
????????????????Random?r?=?new?Random();
????????????????int?k?=?r.nextInt(3);
????????????????int?randomSwitch?=?k?%?3;

????????????????//Calendar?c?=?Calendar.getInstance();
????????????????//c.add(Calendar.DATE,?k);
????????????????try?{
????????????????????Thread.sleep(100);
????????????????????switch?(randomSwitch)?{
????????????????????case?0:
????????????????????????String?s1?=?"1998-11-12";
????????????????????????String?d1?=?tdf.printDateFormat(s1);
????????????????????????//String?d1?=?new?Timestamp(date1.getTime()).toString();
????????????????????????//d1?=?d1.substring(0,d1.indexOf("?"));
?????????????????????????if(!s1.equals(d1)){
????????????????????????????System.out.println(s1+"?????"+d1);
?????????????????????????}
????????????????????????break;
????????????????????case?1:
????????????????????????String?s2?=?"1998-11-12";
????????????????????????String?d2?=?TestDateFormat.printStaticDateFormat(s2);
????????????????????????//String?d2?=?new?Timestamp(date2.getTime()).toString();
????????????????????????//d2?=?d2.substring(0,d2.indexOf("?"));
????????????????????????if(!s2.equals(d2)){
????????????????????????????System.out.println(s2+"?????"+d2);
????????????????????????}
????????????????????????break;
????????????????????case?2:
????????????????????????String?s?=?"1998-11-12";
????????????????????????String?d3?=?tdf.printReferenceDateFormat(s);
????????????????????????//String?d3?=?new?Timestamp(date3.getTime()).toString();
????????????????????????//d3?=?d3.substring(0,d3.indexOf("?"));
????????????????????????if(!s.equals(d3)){
????????????????????????????System.out.println(s+"?????"+d3);
????????????????????????}
????????????????????????break;
????????????????????default:
????????????????????????return;

????????????????????}
????????????????}?catch?(Exception?e)?{

????????????????}
????????????}
????????}
????});

????Thread?th4?=?new?Thread(new?Runnable()?{
????????@Override
????????public?void?run()?{
????????????while?(true)?{
????????????????Random?r?=?new?Random();
????????????????int?k?=?r.nextInt(3);
????????????????int?randomSwitch?=?k?%?3;

????????????????//Calendar?c?=?Calendar.getInstance();
????????????????//c.add(Calendar.DATE,?k);
????????????????try?{
????????????????????Thread.sleep(100);
????????????????????switch?(randomSwitch)?{
????????????????????case?0:
????????????????????????String?s1?=?"1698-09-22";
????????????????????????String?d1?=?tdf.printDateFormat(s1);
????????????????????????//String?d1?=?new?Timestamp(date1.getTime()).toString();
????????????????????????//d1?=?d1.substring(0,d1.indexOf("?"));
?????????????????????????if(!s1.equals(d1)){
????????????????????????????System.out.println(s1+"?????"+d1);
?????????????????????????}
????????????????????????break;
????????????????????case?1:
????????????????????????String?s2?=?"1698-09-22";
????????????????????????String?d2?=?TestDateFormat.printStaticDateFormat(s2);
????????????????????????//String?d2?=?new?Timestamp(date2.getTime()).toString();
????????????????????????//d2?=?d2.substring(0,d2.indexOf("?"));
????????????????????????if(!s2.equals(d2)){
????????????????????????????System.out.println(s2+"?????"+d2);
????????????????????????}
????????????????????????break;
????????????????????case?2:
????????????????????????String?s?=?"1698-09-22";
????????????????????????String?d3?=?tdf.printReferenceDateFormat(s);
????????????????????????//String?d3?=?new?Timestamp(date3.getTime()).toString();
????????????????????????//d3?=?d3.substring(0,d3.indexOf("?"));
????????????????????????if(!s.equals(d3)){
????????????????????????????System.out.println(s+"?????"+d3);
????????????????????????}
????????????????????????break;
????????????????????default:
????????????????????????return;

????????????????????}
????????????????}?catch?(Exception?e)?{

????????????????}
????????????}
????????}
????});

????Thread?th5?=?new?Thread(new?Runnable()?{
????????@Override
????????public?void?run()?{
????????????while?(true)?{
????????????????Random?r?=?new?Random();
????????????????int?k?=?r.nextInt(3);
????????????????int?randomSwitch?=?k?%?3;

????????????????//Calendar?c?=?Calendar.getInstance();
????????????????//c.add(Calendar.DATE,?k);
????????????????try?{
????????????????????Thread.sleep(100);
????????????????????switch?(randomSwitch)?{
????????????????????case?0:
????????????????????????String?s1?=?"2498-10-10";
????????????????????????String?d1?=?tdf.printDateFormat(s1);
????????????????????????//String?d1?=?new?Timestamp(date1.getTime()).toString();
????????????????????????//d1?=?d1.substring(0,d1.indexOf("?"));
?????????????????????????if(!s1.equals(d1)){
????????????????????????????System.out.println(s1+"?????"+d1);
?????????????????????????}
????????????????????????break;
????????????????????case?1:
????????????????????????String?s2?=?"2498-10-10";
????????????????????????String?d2?=?TestDateFormat.printStaticDateFormat(s2);
????????????????????????//String?d2?=?new?Timestamp(date2.getTime()).toString();
????????????????????????//d2?=?d2.substring(0,d2.indexOf("?"));
????????????????????????if(!s2.equals(d2)){
????????????????????????????System.out.println(s2+"?????"+d2);
????????????????????????}
????????????????????????break;
????????????????????case?2:
????????????????????????String?s?=?"2498-10-10";
????????????????????????String?d3?=?tdf.printReferenceDateFormat(s);
????????????????????????//String?d3?=?new?Timestamp(date3.getTime()).toString();
????????????????????????//d3?=?d3.substring(0,d3.indexOf("?"));
????????????????????????if(!s.equals(d3)){
????????????????????????????System.out.println(s+"?????"+d3);
????????????????????????}
????????????????????????break;
????????????????????default:
????????????????????????return;

????????????????????}
????????????????}?catch?(Exception?e)?{

????????????????}
????????????}
????????}
????});

????Thread?th6?=?new?Thread(new?Runnable()?{
????????@Override
????????public?void?run()?{
????????????while?(true)?{
????????????????Random?r?=?new?Random();
????????????????int?k?=?r.nextInt(3);
????????????????int?randomSwitch?=?k?%?3;

????????????????//Calendar?c?=?Calendar.getInstance();
????????????????//c.add(Calendar.DATE,?k);
????????????????try?{
????????????????????Thread.sleep(100);
????????????????????switch?(randomSwitch)?{
????????????????????case?0:
????????????????????????String?s1?=?"2998-01-02";
????????????????????????String?d1?=?tdf.printDateFormat(s1);
????????????????????????//String?d1?=?new?Timestamp(date1.getTime()).toString();
????????????????????????//d1?=?d1.substring(0,d1.indexOf("?"));
?????????????????????????if(!s1.equals(d1)){
????????????????????????????System.out.println(s1+"?????"+d1);
?????????????????????????}
????????????????????????break;
????????????????????case?1:
????????????????????????String?s2?=?"2998-01-02";
????????????????????????String?d2?=?TestDateFormat.printStaticDateFormat(s2);
????????????????????????//String?d2?=?new?Timestamp(date2.getTime()).toString();
????????????????????????//d2?=?d2.substring(0,d2.indexOf("?"));
????????????????????????if(!s2.equals(d2)){
????????????????????????????System.out.println(s2+"?????"+d2);
????????????????????????}
????????????????????????break;
????????????????????case?2:
????????????????????????String?s?=?"2998-01-02";
????????????????????????String?d3?=?tdf.printReferenceDateFormat(s);
????????????????????????//String?d3?=?new?Timestamp(date3.getTime()).toString();
????????????????????????//d3?=?d3.substring(0,d3.indexOf("?"));
????????????????????????if(!s.equals(d3)){
????????????????????????????System.out.println(s+"?????"+d3);
????????????????????????}
????????????????????????break;
????????????????????default:
????????????????????????return;

????????????????????}
????????????????}?catch?(Exception?e)?{

????????????????}
????????????}
????????}
????});
????th2.start();
????th3.start();
????th4.start();
????th5.start();
????th6.start();
????try?{
????????th2.join();
????????th3.join();
????????th4.join();
????????th5.join();
????????th6.join();
????}?catch?(InterruptedException?e)?{
????????//?TODO?Auto-generated?catch?block
????????e.printStackTrace();
????}
}


????public?String?printReferenceDateFormat(String?str)?{
????????//Date?dt=?sdf.parse(str);
????????//return?sdf.format(dt);
????????return?str;
????}

????public?static?String?printStaticDateFormat(String?str)?{
????????SimpleDateFormat?df1?=?new?SimpleDateFormat("yyyy-MM-dd");
????????//System.out.println("get?static?method?the?SimpleDateFormat:"?+?df1);
????????try?{
????????????Thread.sleep(100);
????????????Date?dt=df1.parse(str);
????????????str=df1.format(dt);
????????????//df1.getCalendar().clear();
????????????return?str;
????????}?catch?(Exception?e)?{
????????????//?TODO?Auto-generated?catch?block
????????????e.printStackTrace();
????????????return?null;
????????}
????}

????public?String?printDateFormat(String?str)?{
????????SimpleDateFormat?df2?=?new?SimpleDateFormat("yyyy-MM-dd");

????????try?{
????????????Thread.sleep(100);
????????????Date?dt=df2.parse(str);
????????????str=df2.format(dt);
????????????//df2.getCalendar().clear();
????????????//System.out.println("get?the?SimpleDateFormat:"?+?df2);
????????????return?str;
????????}?catch?(Exception?e)?{
????????????//?TODO?Auto-generated?catch?block
????????????e.printStackTrace();
????????????return?null;
????????}
????}

}

從結(jié)果來看,確實(shí)不是同一個(gè)對(duì)象,只是看起來像。

那么只有最后一個(gè)問題了,為什么看起來是同一個(gè)對(duì)象呢:
元芳,你怎么看?
大人,屬下這樣認(rèn)為:

大家都知道system.out.prinl(object)其實(shí)是打印的String.valueof的對(duì)象值;valueof是什么呢?

public?static?String?valueOf(Object?obj)?{?
????return?(obj?==?null)???“null”?:?obj.toString();?
}

就是obj的toString的值,那么obj的toString由Object類定義,各個(gè)子類自己重寫,在Object中,定義如下:

public?String?toString()?{?
????return?getClass().getName()?+?“@”?+?Integer.toHexString(hashCode());?
}

顯然就是Object的hashCode的十六進(jìn)制數(shù)值,那么在SimpleDateFormat中hashcode方法是如何呢

public?int?hashCode()?
{?
????return?pattern.hashCode();?
????//?just?enough?fields?for?a?reasonable?distribution?
}

從這里可以看出,SimpleDateFormat沒有返回自己的對(duì)象的地址等,而是返回了pattern的hashcode,前面已經(jīng)說過,輸入的格式相同,pattern是同一個(gè),所以,此處SimpleDateFormat對(duì)象打印出來是同一個(gè),但其實(shí)不是。


狄仁杰:元芳,我這個(gè)宰相的位置,以后要不你來做吧。。。


-----------------結(jié)束的分割線-----------------

之前我寫在CSDN上的文章,搬到平臺(tái)上來:

如果覺得不錯(cuò),請(qǐng)贊咱一下唄

原文鏈接:https://blog.csdn.net/qq_35039122/article/details/80172714


向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI