小编孙兴斌*_*孙兴斌的帖子

克隆java.time.LocalDateTime的最佳方法

我想创建一个副本,java.time.LocalDateTime但它没有clone()方法.

我所做的是以下内容:

long epochMilli = Instant.now().toEpochMilli();

LocalDateTime createDate =  LocalDateTime.ofInstant(Instant.ofEpochMilli(epochMilli), ZoneId.systemDefault());

LocalDateTime modificationDate = LocalDateTime.ofInstant(Instant.ofEpochMilli(epochMilli), ZoneId.systemDefault());
Run Code Online (Sandbox Code Playgroud)

有没有最简单的方法来创建具有完全相同的日期时间值的两个LocalDateTime对象?

java datetime java-8

13
推荐指数
2
解决办法
5910
查看次数

Java中的并发对象创建

我正在读Brian Goetz的一本书"实践中的Java并发".第3.5和3.5.1段包含我无法理解的陈述.

请考虑以下代码:

public class Holder {
  private int value;
    public Holder(int value) { 
    this.value = value;
  }

  public void assertValue() {
    if (value != value) throw new AssertionError("Magic");
  }
}

class HolderContainer {
  // Unsafe publication
  public Holder holder;

  public void init() {
    holder = new Holder(42);  
  }
}
Run Code Online (Sandbox Code Playgroud)

作者说:

  1. 在Java中,Object构造函数首先在子类构造函数运行之前将默认值写入所有字段.
  2. 因此,可以将字段默认值视为过时值.
  3. 线程可能在第一次读取字段时看到陈旧值,然后在下次读取更新的值,这就是assertN可以抛出AssertionError的原因.

因此,根据文本,有些不幸的时机可能值= 0; 在下一刻,值= 42.

我同意第1点,Object构造函数首先使用默认值填充字段.但我不明白第2和第3点.

让我们更新作者代码并考虑以下示例:

public class Holder {
  int value;

  public Holder(int value) {
    //Sleep to prevent constructor to finish too early
    try { …
Run Code Online (Sandbox Code Playgroud)

java concurrency multithreading object safe-publication

11
推荐指数
1
解决办法
195
查看次数

过滤列表受限制

描述

输入List<Item>按分数排序,Item如下所示:

class Item {
    double score;
    String category; 
    String author;    
    String poi;   
}
Run Code Online (Sandbox Code Playgroud)

现在我需要在这些限制下从数组中选择10个得分最高的元素:

  • 他们应该有所不同 poi
  • 他们应该有所不同 author
  • 最多有3个相同的项目category.并且来自同一子序列的任何子序列的长度category不应超过2.

如果没有满足上述规则的子序列,只需返回前10个元素.

我试过了什么

现在,我直接迭代List,并用三个HashMap<String, Integer>来存储每个的外观cagetory/poi/author.我List<Item> selected用来存储结果.

  • 如果已经有一个具有此元素的选定元素,poi则将丢弃新元素.
  • 如果已经有一个具有此元素的选定元素,author则将丢弃新元素.
  • 如果已经有三个具有此元素的选定元素,category则将丢弃新元素.
  • 如果已经在尾部两个元素selected具有此category,那么新元素将被丢弃.

问题

它在输入很大时有效,但是当输入相对较小时,它不起作用.例如,输入时

  1. 第1项(A类,作者1)
  2. 第2项(A类,作者2)
  3. 第3项(A类,作者3)
  4. 第4项(B类,作者2)
  5. 第5项(C类,作者5)
  6. 第6项(D类,作者6)
  7. 第7项(E类,作者7)
  8. 第8项(F类,作者8)
  9. 第9项(G类,作者9)
  10. Item10(H类,作者10)
  11. 第11项(第I类,作者11)

那我的解决方案就是

  • Item3丢弃,因为它具有相同categoryItem1Item2
  • Item4丢弃,因为它有相同 …

java algorithm

11
推荐指数
1
解决办法
430
查看次数

用于分隔括在括号中的字符串的正则表达式

我有一个String包含2或3个公司名称,每个名称都括在括号中.每个公司名称也可以包含括号中的单词.我需要使用正则表达式将它们分开,但没有找到.

我的inputStr:

(Motor (Sport) (racing) Ltd.) (Motorsport racing (Ltd.)) (Motorsport racing Ltd.)
or 
(Motor (Sport) (racing) Ltd.) (Motorsport racing (Ltd.))
Run Code Online (Sandbox Code Playgroud)

预期的结果是:

str1 = Motor (Sport) (racing) Ltd.
str2 = Motorsport racing (Ltd.)
str3 = Motorsport racing Ltd.
Run Code Online (Sandbox Code Playgroud)

我的代码:

String str1, str2, str3;
Pattern p = Pattern.compile("\\((.*?)\\)");
Matcher m = p.matcher(inputStr);
int index = 0;
while(m.find()) {

    String text = m.group(1);
    text = text != null && StringUtils.countMatches(text, "(") != StringUtils.countMatches(text, ")") ? text + ")" : …
Run Code Online (Sandbox Code Playgroud)

java regex string

10
推荐指数
3
解决办法
810
查看次数

有条件地定义同步块

说我有一个方法:

public void run(){
  synchronized(this.foo){

 }
}
Run Code Online (Sandbox Code Playgroud)

但有时当我运行这个方法时,我不需要同步任何东西.

什么是条件同步的好模式?我能想到的唯一模式是回调,类似这样:

public void conditionalSync(Runnable r){
   if(bar){
      r.run();
      return;
   }

  synchronized(this.foo){
     r.run();
  }
}

public void run(){
  this.conditionalSync(()->{


  });
}
Run Code Online (Sandbox Code Playgroud)

还有其他方法可以做到吗,没有回调?

java concurrency multithreading locking synchronized

10
推荐指数
1
解决办法
99
查看次数

如果wait()抛出InterruptedException,那么线程是否会等到获取对象的监视器?

例如:

public synchronized Object get() {
    while (result == null) {
        try {
            wait();
        } catch (InterruptedException e) {
            e.printStackTrace();
            // Do we own the monitor of this object?
        }
    }
    return result;
}
Run Code Online (Sandbox Code Playgroud)

e.printStackTrace()执行,是我们保证自己的对象的显示器呢?

引用说当wait()在一个notify()或者notifyAll()调用之后返回时,线程会等待它获取对象的监视器.但wait()抛出异常时的情况呢?

java concurrency multithreading synchronized wait

9
推荐指数
2
解决办法
195
查看次数

Tomcat处理时间很小,但是Nginx显示它很大

我在nginx后面有五个tomcat实例。

有时nginx upstream_response_time很大,超过1秒,而tomcat本地访问日志显示处理时间仅为50ms(我%D用来记录处理时间)。

可能的原因是什么?如何解决?由于其他应用程序运行很快,网络似乎并不慢。

更新:

似乎nginx upstream_response_time= %D+ 1 sec

java tomcat tcp http nginx

9
推荐指数
1
解决办法
158
查看次数

在尝试替换字符串中的字符时获取"

我想用"字符串替换^.

String str = "hello \"there";
System.out.println(str);
String str1 = str.replaceAll("\"", "^");
System.out.println(str1);
String str2= str1.replaceAll("^", "\"");
System.out.println(str2);
Run Code Online (Sandbox Code Playgroud)

输出是:

hello "there
hello ^there
"hello ^there
Run Code Online (Sandbox Code Playgroud)

为什么我"在字符串的开头和字符串^之间得到额外的

我期待:

hello "there
Run Code Online (Sandbox Code Playgroud)

java regex string replaceall

8
推荐指数
2
解决办法
410
查看次数

如何检查Hive中是否存在分区?

我有一个Hive表,它由列分区dt.如果不存在,我需要添加一个分区,例如,dt='20181219'.

现在我正在使用HiveMetaStoreClient#getPartition(dbName, tableName, 20181219).如果分区不存在,则捕获NoSuchObjectException并添加它.

在Java中有没有优雅的方法来实现这一目标?

java hive hive-metastore

8
推荐指数
1
解决办法
441
查看次数

使用Jackson将Java8 LocalDateTime序列化为UTC时间戳

我刚刚根据新的(ish)java 8时间包将我的许多日期转换为LocalDateTime.到目前为止,我一直很喜欢切换,直到我开始尝试序列化和反序列化.

如何配置Jackson支持他们?:

LocalDateTime --serialize - > UTC Timestamp --deserialize - > LocalDateTime?

这里有很多关于转换为格式化字符串的材料,但我似乎无法找到utc时间戳的开箱即用解决方案.

java datetime jackson java-8 java-time

8
推荐指数
2
解决办法
907
查看次数