小编Old*_*eon的帖子

为什么JDK源代码采用`volatile`实例的`final`副本

我阅读了JDK关于ConcurrentHashMap的源代码.

但以下代码让我感到困惑:

public boolean isEmpty() {
    final Segment<K,V>[] segments = this.segments;
    ...
}
Run Code Online (Sandbox Code Playgroud)

我的问题是:

声明"this.segments":

final Segment<K,V>[] segments;
Run Code Online (Sandbox Code Playgroud)

所以,在这里,在方法的开头,声明了一个相同的类型引用,指向相同的内存.

为什么作者这样写?他们为什么不直接使用this.segments?有什么理由吗?

java

74
推荐指数
2
解决办法
2366
查看次数

将`IntStream`打印为`String`的最简单方法

与Java-8 I可以很容易地处理一个String(或任何CharSequence),为IntStream使用任一charscodePoints方法.

IntStream chars = "Hello world.".codePoints();
Run Code Online (Sandbox Code Playgroud)

然后我可以操纵流的内容

IntStream stars = chars.map(c -> c == ' ' ? ' ': '*');
Run Code Online (Sandbox Code Playgroud)

我一直在寻找一种整洁的方式来打印结果,我甚至找不到一个简单的方法.如何将这个ints流放回一个可以像我一样打印的形式String.

从上面stars我希望打印

***** ******
Run Code Online (Sandbox Code Playgroud)

java java-8 java-stream

43
推荐指数
3
解决办法
1万
查看次数

有没有正确的方法来构建URL?

在我使用的大部分代码中都有可怕的东西,比如:

String url = "../Somewhere/SomeServlet?method=AMethod&id="+object.getSomething()+ "&aParam="+object.getSomethingElse());
Run Code Online (Sandbox Code Playgroud)

或者 - 更糟糕的是:

String url = "Somewhere/Here/Something.jsp?path="+aFile.toString().replace("\\","/")+ "&aParam="+object.getSomethingElse());
Run Code Online (Sandbox Code Playgroud)

有没有正确的方法:

  1. 创建一个新URL(或者它是一个URI).
  2. 添加正确的转义参数.
  3. 在这些参数中添加格式正确的文件路径.
  4. 将其解析为String.

从本质上讲 - 构建字符串要比正确地完成字符串要容易得多.有没有办法正确地做到这一点就像建立字符串一样简单?

添加

为了清楚起见 - 经过一番思考 - 我想我正在寻找类似的东西:

String s = new MyThing()
    .setPlace("Somewhere/Something.jsp")
    .addParameter(aName,aValue)
    .addParameter(aName,aFile)
    .toString();
Run Code Online (Sandbox Code Playgroud)

因此它将处理转义的所有不愉快并添加"?"/"&"并将"\"更改为"/"而不是使用"\"作为文件等.

如果我必须自己编写一个(即如果Apache不是一个选项),那么有真正的Java技术可以正确地转义各个部分.我的意思是在参数中将""转换为"".而逃避""在其他地方"%20".

java url uri

30
推荐指数
3
解决办法
5万
查看次数

使用ObjectMapper更改字段大小写

我想我需要创建一个专家ObjectMapper,但无法找到任何示例代码来启动该过程.

JSON的创建者使用.Netpublic属性,因此使用具有大写首字母的字段名称.我正在将JSON解析为POJO,所以我想使用小写的首字母.

在他们结束时:

    public class Facet
    {
        public string Name { get; set; }
        public string  Value { get; set; }
    }
Run Code Online (Sandbox Code Playgroud)

因此,我必须:

    public class Facet {
        public String Name;
        public String Value;
    }
Run Code Online (Sandbox Code Playgroud)

我更喜欢:

    public class Facet {
        public String name;
        public String value;
    }
Run Code Online (Sandbox Code Playgroud)

我是对的,这可以用一个ObjectMapper吗?

java json jackson

21
推荐指数
3
解决办法
3万
查看次数

Java 8需要进行转换,而Java 7则不需要--enum.getClass/getDeclaringClass

我意识到Java 8仍然处于测试阶段,但这个让我感到奇怪:

public class Fields<C extends Enum<C>> {

    public Fields(Set<C> columns) {
        // A sample column used to find the universe of the enum of Columns.
        C sampleCol = columns.iterator().next();
        // Java 8 needs a cast here.
        Set<C> allColumns = EnumSet.allOf((/*Class<C>)*/ sampleCol.getClass());
        // ... there's more to this that I've deleted.
    }

}
Run Code Online (Sandbox Code Playgroud)

错误如下:

error: incompatible types: inferred type does not conform to equality constraint(s)
            Set<C> allColumns = EnumSet.allOf(sampleCol.getClass());
    inferred: C
    equality constraints(s): C,CAP#1
  where C is a type-variable:
    C …
Run Code Online (Sandbox Code Playgroud)

java generics java-8

19
推荐指数
1
解决办法
2531
查看次数

这两种算法比较?

所以我遇到了一个问题."确定字符串是否包含所有唯一字符"

所以我编写了这个解决方案,将每个字符添加到一个集合中,但如果该字符已经存在,则返回false.

private static boolean allUniqueCharacters(String s) {

    Set<Character> charSet = new HashSet<Character>();
    for (int i = 0; i < s.length(); i++) {
        char currentChar = s.charAt(i);
        if (!charSet.contains(currentChar)) {
            charSet.add(currentChar);

        } else {
            return false;
        }

    }
    return true;

}
Run Code Online (Sandbox Code Playgroud)

根据我正在阅读的书,这是"最佳解决方案"

public static boolean isUniqueChars2(String str) {
    if (str.length() > 128)
        return false;

    boolean[] char_set = new boolean[128];

    for (int i = 0; i < str.length(); i++) {
        int val = str.charAt(i);

        if (char_set[val]) {
            return false;
        }
        char_set[val] …
Run Code Online (Sandbox Code Playgroud)

java algorithm

18
推荐指数
1
解决办法
1366
查看次数

我们可以关闭终结器吗?

由于几乎没有保证什么时候,甚至终结器运行和终结器几乎被认为是现在的气味 - 有没有办法说服JVM完全跳过所有的终结过程?

我问,因为我们有一个庞大的应用程序,当移动到一个较新的JVM(不确定在这个阶段)是什么看起来非常像终结者的已知问题(抛出异常,因此非常慢的GC) .

添加

有关Java内存泄漏故障排除的讨论:终结?建议在终结器中抛出异常时出现主要问题,因为这会大大减慢终结过程.

当内存变低并且堆转储分析显示大量Finalizer对象(超过10,000,000)时,我的问题显示为急剧减速- 向我建议减速可能是他们的错,因为他们正在推迟GC.显然我可能是错的.

我没有权力要求重构.

java garbage-collection finalizer

16
推荐指数
1
解决办法
609
查看次数

什么时候调用了contextDestroyed?

实现了一个ContextListener我现在可以contextDestroyed通过关闭我的连接池和刷新我的缓存等来愉快地处理事件.

最近,contextDestroyed当我的服务器没有被关闭时,我很惊讶- 这似乎是在一些我无法追踪的任意时间.

是否有任何已定义的事件或一组情况触发contextDestroyed

我应该确保我所做的一切contextDestroyed都是可逆的吗?我是否需要让所有游泳池都能在一个destroyed/initialized周期内存活?假设contextDestroyedTomcat被关闭或者我的war被替换时,我只会得到一个错误吗?

java tomcat servletcontextlistener

15
推荐指数
1
解决办法
1万
查看次数

是否可以在Java 8中扩展枚举?

只是在玩和带有甜味的方式将功能添加到上前enums中的Java枚举toString()方法.

一些进一步的修补让我几乎也添加了一个整洁(即没有抛出异常)反向查找,但有一个问题.据报道:

error: valueOf(String) in X cannot implement valueOf(String) in HasValue
public enum X implements PoliteEnum, ReverseLookup {
overriding method is static
Run Code Online (Sandbox Code Playgroud)

有办法吗?

这里的目的是默默地添加(通过接口实现与defaultpoliteName在链接的答案中添加的lookup方法)一个方法,该方法执行该valueOf功能而不抛出异常.可能吗?现在显然可以扩展enum- 直到现在我的Java主要问题之一.

这是我失败的尝试:

public interface HasName {

    public String name();
}

public interface PoliteEnum extends HasName {

    default String politeName() {
        return name().replace("_", " ");
    }
}

public interface Lookup<P, Q> {

    public Q lookup(P p);
}

public interface …
Run Code Online (Sandbox Code Playgroud)

java enums extend java-8

14
推荐指数
1
解决办法
1万
查看次数

如何在没有堆栈跟踪的情况下创建/抛出异常?

今天我正在浏览一些日志并遇到一个奇怪的错误.

以下是它在日志中的显示方式:

2014/09/11 15:23:52.801 [CC3A5FDD16035540B87F1B8C5E806588:<removed>] WARN a.b.c.Ddd - Main failure 
java.lang.NullPointerException: null
2014/09/11 15:23:52.801 [CC3A5FDD16035540B87F1B8C5E806588:<removed>] ...
Run Code Online (Sandbox Code Playgroud)

这是代码的样子:

} catch (Exception e) {
    Ddd.log.warn("Main failure ", e);
    throw e;
}
Run Code Online (Sandbox Code Playgroud)

如果重要的话,代码在jsp中.在日志中再次重复相同的异常(正如您所期望的那样throw e).

我没有原因记录 - 日志中的前一行显示了查询的执行情况.这种情况在4天内发生了两次,似乎没有对系统造成任何伤害.

环境:使用Java 5在Tomcat下运行的相当繁忙的Web服务.

我不是在询问有关调试系统的提示 - 这些错误很久以后甚至不会再发生.关于如何在没有堆栈跟踪的情况下创建任何异常(特别是NPE),我感到很难过?

添加

正在使用的记录器是一个slf4j驱动Logback实例.我相信这个warn方法就在这里.不确定Logback解决了什么方法,但我确信Throwable参数是专门处理的,如果附加了堆栈跟踪Throwable,它将出现在日志中.

LogBack.xml - 根据要求:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <property name="log.package" value="Package" />
  <property name="log.pattern" value="%date{yyyy/MM/dd HH:mm:ss.SSS} [%X{session}:%X{device}] %level %logger{25} - %msg%n"/> 
  <property …
Run Code Online (Sandbox Code Playgroud)

java nullpointerexception

14
推荐指数
1
解决办法
5362
查看次数