我阅读了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-8 I可以很容易地处理一个String
(或任何CharSequence
),为IntStream
使用任一chars
或codePoints
方法.
IntStream chars = "Hello world.".codePoints();
Run Code Online (Sandbox Code Playgroud)
然后我可以操纵流的内容
IntStream stars = chars.map(c -> c == ' ' ? ' ': '*');
Run Code Online (Sandbox Code Playgroud)
我一直在寻找一种整洁的方式来打印结果,我甚至找不到一个简单的方法.如何将这个int
s流放回一个可以像我一样打印的形式String
.
从上面stars
我希望打印
***** ******
Run Code Online (Sandbox Code Playgroud) 在我使用的大部分代码中都有可怕的东西,比如:
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)
有没有正确的方法:
从本质上讲 - 构建字符串要比正确地完成字符串要容易得多.有没有办法正确地做到这一点就像建立字符串一样简单?
添加
为了清楚起见 - 经过一番思考 - 我想我正在寻找类似的东西:
String s = new MyThing()
.setPlace("Somewhere/Something.jsp")
.addParameter(aName,aValue)
.addParameter(aName,aFile)
.toString();
Run Code Online (Sandbox Code Playgroud)
因此它将处理转义的所有不愉快并添加"?"/"&"并将"\"更改为"/"而不是使用"\"作为文件等.
如果我必须自己编写一个(即如果Apache不是一个选项),那么有真正的Java技术可以正确地转义各个部分.我的意思是在参数中将""转换为"".而逃避""在其他地方"%20".
我想我需要创建一个专家ObjectMapper
,但无法找到任何示例代码来启动该过程.
JSON的创建者使用.Net
和public
属性,因此使用具有大写首字母的字段名称.我正在将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 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) 所以我遇到了一个问题."确定字符串是否包含所有唯一字符"
所以我编写了这个解决方案,将每个字符添加到一个集合中,但如果该字符已经存在,则返回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) 由于几乎没有保证什么时候,甚至终结器运行和终结器几乎被认为是现在的气味 - 有没有办法说服JVM完全跳过所有的终结过程?
我问,因为我们有一个庞大的应用程序,当移动到一个较新的JVM(不确定在这个阶段)是什么看起来非常像终结者的已知问题(抛出异常,因此非常慢的GC) .
添加
有关Java内存泄漏故障排除的讨论:终结?建议在终结器中抛出异常时出现主要问题,因为这会大大减慢终结过程.
当内存变低并且堆转储分析显示大量Finalizer
对象(超过10,000,000)时,我的问题显示为急剧减速- 向我建议减速可能是他们的错,因为他们正在推迟GC.显然我可能是错的.
我没有权力要求重构.
实现了一个ContextListener
我现在可以contextDestroyed
通过关闭我的连接池和刷新我的缓存等来愉快地处理事件.
最近,contextDestroyed
当我的服务器没有被关闭时,我很惊讶- 这似乎是在一些我无法追踪的任意时间.
是否有任何已定义的事件或一组情况触发contextDestroyed
?
我应该确保我所做的一切contextDestroyed
都是可逆的吗?我是否需要让所有游泳池都能在一个destroyed/initialized
周期内存活?假设contextDestroyed
Tomcat被关闭或者我的war
被替换时,我只会得到一个错误吗?
只是在玩和带有甜味的方式将功能添加到上前enum
s中的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)
有办法吗?
这里的目的是默默地添加(通过接口实现与default
我politeName
在链接的答案中添加的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) 今天我正在浏览一些日志并遇到一个奇怪的错误.
以下是它在日志中的显示方式:
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)