結(jié)果是5也對(duì)6也對(duì).
在湖里等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場(chǎng)前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供網(wǎng)站制作、成都網(wǎng)站制作 網(wǎng)站設(shè)計(jì)制作按需網(wǎng)站開發(fā),公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),品牌網(wǎng)站設(shè)計(jì),成都全網(wǎng)營(yíng)銷推廣,成都外貿(mào)網(wǎng)站建設(shè)公司,湖里網(wǎng)站建設(shè)費(fèi)用合理。
只是你說結(jié)果是5所以其他人就幫你找5的借口了..如果結(jié)果輸出6,自然就有人告訴你6的理由.
是5還是6取決于java解釋器怎么對(duì)表達(dá)式分段(就是怎么樣才算一段,一次運(yùn)算)
如果a++就算是一次運(yùn)算那么結(jié)果就是6,如果整行算一次運(yùn)算那么結(jié)果就是5.
這要看解釋器的實(shí)現(xiàn)者愿意怎么去實(shí)現(xiàn)了,因?yàn)檫@方面并沒有規(guī)定或者協(xié)議文檔.
有鑒于此原因,
請(qǐng)以后不要寫這樣的代碼因?yàn)楹芸赡軙?huì)給程序帶來不可估量的后果(因?yàn)榻Y(jié)果的不確定性,理論上有可能這個(gè)版本的JDK下是5下個(gè)版本是6...還是那句話,取決于解釋器實(shí)現(xiàn)人想要怎么去實(shí)現(xiàn))
C++里同樣有這個(gè)問題,
所以請(qǐng)不要把后自增運(yùn)算X++
和
其他操作放在同一個(gè)表達(dá)式,
如果實(shí)在需要放一起,請(qǐng)改變表達(dá)式使用++X
并更改順序.
首先還是不太明白你說的這個(gè)“生成版本號(hào)”是什么意思,如果只是生成一個(gè)自增序列的話
1、如果有oracle數(shù)據(jù)庫(kù)的話可以利用它的序列生成。
2、沒有oracle,用redis也行。
3、沒有數(shù)據(jù)庫(kù),那就寫個(gè)文件來存取吧:
public class Test2 {
public static void main(String[] args) throws IOException {
System.out.println(getSequence("d:\\test\\sequence.txt"));
setSequence("d:\\test\\sequence.txt", "");
System.out.println(getSequence("d:\\test\\sequence.txt"));
}
//讀取序列
public static String getSequence(String sequenceFile) throws IOException {
FileInputStream fileInputStream = null;
InputStreamReader inputStreamReader = null;
BufferedReader bufferedReader = null;
try {
File file = new File(sequenceFile);
fileInputStream = new FileInputStream(file);
inputStreamReader = new InputStreamReader(fileInputStream);
bufferedReader = new BufferedReader(inputStreamReader);
// 按行讀取字符串
String str;
if ((str = bufferedReader.readLine()) != null) {
return str;
}
return null;
} catch (Exception e) {
e.printStackTrace();
return null;
} finally {
if (bufferedReader != null) {
bufferedReader.close();
}
if (inputStreamReader != null) {
inputStreamReader.close();
}
if (fileInputStream != null) {
fileInputStream.close();
}
}
}
//設(shè)置序列,如果傳入的序列號(hào)為空,則在原序列的基礎(chǔ)上+1
public static void setSequence(String sequenceFile, String sequence) throws IOException {
if (sequence == null || sequence.isEmpty()) {
String oriSequence = getSequence(sequenceFile);
Objects.requireNonNull(oriSequence);
sequence = String.format("%04d", Integer.valueOf(oriSequence) + 1);
}
FileOutputStream fileOutputStream = null;
OutputStreamWriter outputStreamWriter = null;
BufferedWriter bufferedWriter = null;
try {
File file = new File(sequenceFile);
fileOutputStream = new FileOutputStream(file);
outputStreamWriter = new OutputStreamWriter(fileOutputStream);
bufferedWriter = new BufferedWriter(outputStreamWriter);
bufferedWriter.write(sequence);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (bufferedWriter != null) {
bufferedWriter.close();
}
if (outputStreamWriter != null) {
outputStreamWriter.close();
}
if (fileOutputStream != null) {
fileOutputStream.close();
}
}
}
}
代碼又?jǐn)D在一起了:
讀序列:
寫序列:
運(yùn)行結(jié)果:
先生成好這個(gè)文件:
沖?。?/p>
java項(xiàng)目實(shí)現(xiàn)流水號(hào)自動(dòng)增長(zhǎng)
項(xiàng)目中有一個(gè)規(guī)則編號(hào)字段,從1開始,編號(hào)長(zhǎng)度為5位,那么第一條數(shù)據(jù)編號(hào)就是00001。
實(shí)現(xiàn)的基本思路就是項(xiàng)目啟動(dòng)時(shí),從數(shù)據(jù)庫(kù)獲取當(dāng)前最大值,作為靜態(tài)變量存儲(chǔ);
業(yè)務(wù)獲取新的編碼,考慮并發(fā)問題,獲取編碼方法(編碼自增部分)為synchronized同步方法,如果自增為原子操作,則無需同步;
編碼前置0,使用String.format("%05d", newNum);格式化獲取。
實(shí)現(xiàn)代碼如下:
private final static AtomicInteger atomic = new AtomicInteger(0);
public static String startFormat(String format) {
return String.format(format, atomic.incrementAndGet());
}
自增(++)和自減(--)運(yùn)算符
在JAVA語言中存在著很多運(yùn)算符,但是在實(shí)際開發(fā)中我們或許很少用到它們,在初次學(xué)習(xí)中卻時(shí)常出現(xiàn)它們的身影,對(duì)于這些運(yùn)算符的含義和用法,是否還記得呢?下面讓我們來看看下面幾段Java代碼:
int i = 0;
int j = i++;
int k = --i;
這段代碼運(yùn)行后,i等于多少?j等于多少?k等于多少?相信對(duì)于這段代碼應(yīng)該沒有問題,因?yàn)楹芎?jiǎn)單。結(jié)果為:i=0,j=0,k=0。那下面這段呢?
int i = 0;
int j = i++ + ++i;
int k = --i + i--;
代碼執(zhí)行后i、j、k分別等于多少呢?答案為i=0,j=2,k=2。不知道對(duì)這個(gè)結(jié)果有沒有疑問呢?起初我第一眼掃過去的結(jié)果和真正的執(zhí)行結(jié)果是不同的,也就是我判斷錯(cuò)了。也許會(huì)問,怎么這么簡(jiǎn)單的問題都弄錯(cuò)呢?是的,有時(shí)稍微不注意真會(huì)出錯(cuò)。這看的就是我們對(duì)Java運(yùn)算符優(yōu)先級(jí)的認(rèn)識(shí)。來,繼續(xù)看下面這段代碼:
int i=0;
System.out.println(i++);
這段代碼運(yùn)行后輸出結(jié)果是什么?0?1?答案當(dāng)然是i=0。這個(gè)是毋庸置疑的。接著看下面這段代碼:
float f=0.1F;
f++;
double d=0.1D;
d++;
char c='a';
c++;
上面這段代碼可以編譯通過并執(zhí)行嗎?答案是肯定的。如果此時(shí)對(duì)上面說的都沒有問題,那么就可以說明對(duì)自增自減運(yùn)算符已經(jīng)掌握的很好了?,F(xiàn)在就讓我們還回顧一下相關(guān)知識(shí):
自增(++):將變量的值加1,分前綴式(如++i)和后綴式(如i++)。前綴式是先加1再使用;后綴式是先使用再加1。
自減(--):將變量的值減1,分前綴式(如--i)和后綴式(如i--)。前綴式是先減1再使用;后綴式是先使用再減1。
自增與自減運(yùn)算符還遵循以下規(guī)律:
1. 可以用于整數(shù)類型byte、short、int、long,浮點(diǎn)類型float、double,以及字符串類型char。
2. 在Java5.0及以上版本中,它們可以用于基本類型對(duì)應(yīng)的包裝器類Byte、Short、Integer、Long、Float、Double、Character。
3. 它們的運(yùn)算結(jié)果的類型與被運(yùn)算的變量的類型相同。
當(dāng)a == 1 的時(shí)候
a++ 是先使用后加1,所以先輸出結(jié)果為 1。
++a 是先加1后使用,所以輸出結(jié)果為 2.
不管是a++ 還是 ++a ,使用之后 a 的值都已經(jīng)確定變成2了。
就是這樣子,呵呵...