重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
结果是5也对6也对.
在湖里等地区,都构建了全面的区域性战略布局,加强发展的系统性、市场前瞻性、产品创新能力,以专注、极致的服务理念,为客户提供网站制作、成都网站制作 网站设计制作按需网站开发,公司网站建设,企业网站建设,品牌网站设计,成都全网营销推广,成都外贸网站建设公司,湖里网站建设费用合理。
只是你说结果是5所以其他人就帮你找5的借口了..如果结果输出6,自然就有人告诉你6的理由.
是5还是6取决于java解释器怎么对表达式分段(就是怎么样才算一段,一次运算)
如果a++就算是一次运算那么结果就是6,如果整行算一次运算那么结果就是5.
这要看解释器的实现者愿意怎么去实现了,因为这方面并没有规定或者协议文档.
有鉴于此原因,
请以后不要写这样的代码因为很可能会给程序带来不可估量的后果(因为结果的不确定性,理论上有可能这个版本的JDK下是5下个版本是6...还是那句话,取决于解释器实现人想要怎么去实现)
C++里同样有这个问题,
所以请不要把后自增运算X++
和
其他操作放在同一个表达式,
如果实在需要放一起,请改变表达式使用++X
并更改顺序.
首先还是不太明白你说的这个“生成版本号”是什么意思,如果只是生成一个自增序列的话
1、如果有oracle数据库的话可以利用它的序列生成。
2、没有oracle,用redis也行。
3、没有数据库,那就写个文件来存取吧:
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();
}
}
}
//设置序列,如果传入的序列号为空,则在原序列的基础上+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();
}
}
}
}
代码又挤在一起了:
读序列:
写序列:
运行结果:
先生成好这个文件:
冲!:
java项目实现流水号自动增长
项目中有一个规则编号字段,从1开始,编号长度为5位,那么第一条数据编号就是00001。
实现的基本思路就是项目启动时,从数据库获取当前最大值,作为静态变量存储;
业务获取新的编码,考虑并发问题,获取编码方法(编码自增部分)为synchronized同步方法,如果自增为原子操作,则无需同步;
编码前置0,使用String.format("%05d", newNum);格式化获取。
实现代码如下:
private final static AtomicInteger atomic = new AtomicInteger(0);
public static String startFormat(String format) {
return String.format(format, atomic.incrementAndGet());
}
自增(++)和自减(--)运算符
在JAVA语言中存在着很多运算符,但是在实际开发中我们或许很少用到它们,在初次学习中却时常出现它们的身影,对于这些运算符的含义和用法,是否还记得呢?下面让我们来看看下面几段Java代码:
int i = 0;
int j = i++;
int k = --i;
这段代码运行后,i等于多少?j等于多少?k等于多少?相信对于这段代码应该没有问题,因为很简单。结果为:i=0,j=0,k=0。那下面这段呢?
int i = 0;
int j = i++ + ++i;
int k = --i + i--;
代码执行后i、j、k分别等于多少呢?答案为i=0,j=2,k=2。不知道对这个结果有没有疑问呢?起初我第一眼扫过去的结果和真正的执行结果是不同的,也就是我判断错了。也许会问,怎么这么简单的问题都弄错呢?是的,有时稍微不注意真会出错。这看的就是我们对Java运算符优先级的认识。来,继续看下面这段代码:
int i=0;
System.out.println(i++);
这段代码运行后输出结果是什么?0?1?答案当然是i=0。这个是毋庸置疑的。接着看下面这段代码:
float f=0.1F;
f++;
double d=0.1D;
d++;
char c='a';
c++;
上面这段代码可以编译通过并执行吗?答案是肯定的。如果此时对上面说的都没有问题,那么就可以说明对自增自减运算符已经掌握的很好了。现在就让我们还回顾一下相关知识:
自增(++):将变量的值加1,分前缀式(如++i)和后缀式(如i++)。前缀式是先加1再使用;后缀式是先使用再加1。
自减(--):将变量的值减1,分前缀式(如--i)和后缀式(如i--)。前缀式是先减1再使用;后缀式是先使用再减1。
自增与自减运算符还遵循以下规律:
1. 可以用于整数类型byte、short、int、long,浮点类型float、double,以及字符串类型char。
2. 在Java5.0及以上版本中,它们可以用于基本类型对应的包装器类Byte、Short、Integer、Long、Float、Double、Character。
3. 它们的运算结果的类型与被运算的变量的类型相同。
当a == 1 的时候
a++ 是先使用后加1,所以先输出结果为 1。
++a 是先加1后使用,所以输出结果为 2.
不管是a++ 还是 ++a ,使用之后 a 的值都已经确定变成2了。
就是这样子,呵呵...