以下代码似乎让我感到困惑,因为它提供了两个不同的输出.代码在jdk 1.7上进行了测试.
public class NotEq {
public static void main(String[] args) {
ver1();
System.out.println();
ver2();
}
public static void ver1() {
Integer a = 128;
Integer b = 128;
if (a == b) {
System.out.println("Equal Object");
}
if (a != b) {
System.out.println("Different objects");
}
if (a.equals(b)) {
System.out.println("Meaningfully equal.");
}
}
public static void ver2() {
Integer i1 = 127;
Integer i2 = 127;
if (i1 == i2) {
System.out.println("Equal Object");
}
if (i1 != i2){
System.out.println("Different objects");
} …Run Code Online (Sandbox Code Playgroud) Java 7编译器如何处理多捕获块?一个简单的实现是生成字节码,就好像存在多个catch块一样.但是,我从多个来源收集到的情况并非如此 - 处理多个异常类型的catch块在编译期间不会产生重复的字节码.
那么它是怎样工作的 ?是否有新的字节码指令告诉JVM多捕获块?
在JLS的第17章中,它引入了一个概念:发生在一致之前.
如果对于A中的所有读取r,其中W(r)是r看到的写入动作,那么一组动作A发生 - 在一致之前,不是hb(r,W(r))或那里的情况在A中存在写w,使得wv = rv和hb(W(r),w)和hb(w,r)"
在我的理解中,它等于以下几个词:...,既不是......也不是......
所以我的前两个问题是:
它还给出了一个例子:17.4.5-1
Thread 1 Thread 2
B = 1; A = 2;
r2 = A; r1 = B;
Run Code Online (Sandbox Code Playgroud)
在第一个执行顺序中:
1: B = 1;
3: A = 2;
2: r2 = A; // sees initial write of 0
4: r1 = B; // sees initial write of 0
Run Code Online (Sandbox Code Playgroud)
订单本身已经告诉我们两个线程交替执行,所以我的第三个问题是:左数是什么意思?
在我的理解中,r2和r1的原因可以看出0的初始写入是A和B都不是volatile字段.所以我的第四个问题是:我的理解是否正确?
在第二个执行顺序中:
1: r2 = A; // sees write of A = 2
3: r1 = B; // sees …Run Code Online (Sandbox Code Playgroud) 我们假设我有以下POJO:
class Pojo {
String s;
Object o;
Map<String, String> m;
}
Run Code Online (Sandbox Code Playgroud)
在运行时,我想要除了一个属性之外的所有属性的默认序列化/反序列化.通常,我想在序列化时用数据库中的ID替换字段,类似于其他问题.
例如,我想用o从外部映射获得的字符串替换(例如:object1<=>"123"和object2<=>"456"):
o和替换(如果o是object1,则序列化为字符串"123")o(即object1),重新创建一个Pojo对象o = object1.我知道模块将是一种方法,但我不知道如何使用它们同时保持自动BeanSerializer/Deserializer不需要更改的属性.
有人可以举例(甚至做作)或另类方法吗?
笔记:
编辑
为了更清楚一点,我可以使用Mixins执行以下操作:
ObjectMapper mapper = new ObjectMapper(MongoBsonFactory.createFactory());
mapper.addMixInAnnotations(Pojo.class, PojoMixIn.class);
ObjectReader reader = mapper.reader(Pojo.class);
DBEncoder dbEncoder = DefaultDBEncoder.FACTORY.create();
OutputBuffer buffer = new BasicOutputBuffer();
dbEncoder.writeObject(buffer, o);
Run Code Online (Sandbox Code Playgroud)
使用以下Mixin:
abstract class PojoMixIn {
@JsonIgnore Object o; …Run Code Online (Sandbox Code Playgroud) 在泛型类中,Class<T>该方法getConstructors()具有返回类型,而不是泛型类型参数T.其原因在于javadoc中的解释.
请注意,虽然此方法返回一个
Constructor<T>对象数组(即此类中的构造函数数组),但此方法的返回类型Constructor<?>[]并非Constructor<T>[]如预期的那样.这个信息量较少的返回类型是必需的,因为从此方法返回后,可以修改数组以保存不同类的Constructor对象,这将违反类型保证Constructor<T>[].
我的一位同事和我试图理解这个解释.在我们的理解中,他们基本上说它是未知的泛型类型,因为一些调用者可以将其他Constructor对象放入该数组中.我们做对了吗?如果是这样,为什么有人会这样设计API.使用特定类型并信任程序员正确使用数组不是更好吗?对我们来说,这听起来有点像"我们正在制作更糟糕的API,因为程序员使用它可能会尝试一些愚蠢的东西".我们的谬误在哪里?
我有一个数据源与joda时间DateTime对象存储.我需要将它们转换为java ZonedDateTime对象,保留原始时区.
保留偏移量是不够的,因为某些DateTime对象表示每日重复性任务,并且这些任务必须在特定时间段内针对每个日期发生.因此,它们必须遵循指定的TimeZone过渡,例如夏季和冬季时间.我无法告诉DateTime对象的最终用法,因此我需要保留所有对象的时区信息以确保安全.
如何把org.joda.time.DateTime转换成java.time.ZonedDateTime?
将全部
ord.joda.time.DateTimeZone.getId()
映射到可用的ID
java.time.ZoneId
我需要将一个字符串转换为LocalTime(java-8而不是joda),该字符串可能有也可能没有nanoOfSeconds.String格式的形式为
07:06:05或者07:06:05.123456
字符串在秒内可能有或没有小数位,当它出现时,可以有任意数量的字符来表示Nano Seconds部分.
使用DateTimeForamtter等
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("H:mm:ss");
Run Code Online (Sandbox Code Playgroud)
要么
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("H:mm:ss.SSSSSS");
Run Code Online (Sandbox Code Playgroud)
我可以使用IF语句来区分两种格式,例如:
DateTimeFormatter dtf;
if (time1.contains(".") {
dtf = DateTimeFormatter.ofPattern("H:mm:ss.SSSSSS);
} else {
dtf = DateTimeFormatter.ofPattern("H:mm:ss);
}
Run Code Online (Sandbox Code Playgroud)
这工作正常,我很好,但我需要能够在小数点后使用不同数量的位置.
示例数据集可能是:
[11:07:59.68750, 11:08:00.781250, 11:08:00.773437500, 11:08:01]
Run Code Online (Sandbox Code Playgroud)
有没有办法允许格式化程序解析小数点后的任意数字位数而不会java.time.format.DateTimeParseException在小数位数未知时抛出?
我希望我遗漏一些非常简单的东西.
我需要解析(德语)以下列形式的日期:
10. Jan. 18:14
8. Feb. 19:02
1. Mär. 19:40
4. Apr. 18:55
2. Mai 21:55
5. Juni 08:25
5. Juli 20:09
1. Aug. 13:42
[...]
Run Code Online (Sandbox Code Playgroud)
如您所见,如果月份超过4个字符,则会删除月份名称.甚至更奇怪,不要问我为什么,Mär.虽然整个名字都是3月,但是3月份缩短了März.我怎么解析这个java.time?(日期的格式是基于创建日期列表的Android设备的本地化.但是,我没有在Android上解析它)
我的方法是创建一个DateTimeFormatter这样的:
DateTimeFormatter.ofPattern("d. MMMM HH:mm").withLocale(Locale.GERMAN);
// or
DateTimeFormatter.ofPattern("d. MMMMM HH:mm").withLocale(Locale.GERMAN);
Run Code Online (Sandbox Code Playgroud)
但是MMMM这种MMMMM模式和模式都不适合缩短的日期.当然,我可以使用以下模式d. MMM. HH:mm来匹配缩短的月份,但是我无法匹配3个月和4个月的月份.我知道我可以有两个格式化程序(MMM. and MMMMM)但我宁愿有一个解决方案,我只有一个格式化程序,可能还有一个自定义语言环境或类似的东西.
假设我定义了一个名为的注释@MyAnnotation.
有一个类X被声明为:
@MyAnnotation
class X { .... }
Run Code Online (Sandbox Code Playgroud)
现在在编译时,我想检查所有注释的类,@MyAnnotation并对需要在同一进程中编译的更多java源文件执行一些代码生成.
这可能使用java注释处理器或其他一些工具吗?
在阅读源代码时ArrayBlockingQueue,我发现了一条评论,说明它使用了" 任何教科书中的经典双条件算法 ":
/*
* Concurrency control uses the classic two-condition algorithm
* found in any textbook.
*/
/** Main lock guarding all access */
private final ReentrantLock lock;
/** Condition for waiting takes */
private final Condition notEmpty;
/** Condition for waiting puts */
private final Condition notFull;
Run Code Online (Sandbox Code Playgroud)
为什么它使用经典的双条件(notEmpty,notFull)算法?
java ×10
java-time ×3
datetime ×2
java-8 ×2
annotations ×1
concurrency ×1
formatter ×1
generics ×1
integer ×1
jackson ×1
java-7 ×1
jodatime ×1
json ×1
jvm ×1
localization ×1
localtime ×1
memory-model ×1
reflection ×1
timezone ×1
try-catch ×1
wrapper ×1