这摘自《 Head First Servlets and JSP》一书。我不明白的是为什么该init()方法仅在线程中运行A,而之后的service()方法在另一个线程中运行B。
这是否意味着从浏览器到servlet的每个请求都有两个线程?还是 init()容器可能创建的所有servlet实例通用?那是错误的,因为它不是静态方法?
Map<Integer, String> map = new TreeMap<>();
map.put(1, "String1");
map.put(2, "String2");
map.put(3, "String3");
Run Code Online (Sandbox Code Playgroud)
我想将map的值转换为set。我知道我可以轻松做到
Set<String> set = new HashSet<>(map.values());
Run Code Online (Sandbox Code Playgroud)
在考虑这一点时,我很好奇它到底是什么map.values()?所以我尝试了这个
System.out.println("Set:"+ (map.values() instanceof Set));
System.out.println("List:"+ (map.values() instanceof List));
System.out.println("Queue:"+ (map.values() instanceof Queue));
System.out.println("SortedSet:"+ (map.values() instanceof SortedSet));
Run Code Online (Sandbox Code Playgroud)
输出令人惊讶的是
Set:false
List:false
Queue:false
SortedSet:false
Run Code Online (Sandbox Code Playgroud)
这就是所有文档所说的。
此地图中包含的值的集合视图
然后,我查看了反编译的类文件。
public Collection<V> values() {
if (values == null) {
values = new AbstractCollection<V>() {
public Iterator<V> iterator() {
return new Iterator<V>() {
private Iterator<Entry<K,V>> i = entrySet().iterator();
public boolean hasNext() {
return …Run Code Online (Sandbox Code Playgroud) 我正在开发Java并使用它IntelliJ作为我的 IDE。我写了一份if声明如下。
if( list1.size() >= 1 || list2.contains(itemX) ) {
//do something
}
Run Code Online (Sandbox Code Playgroud)
IntelliJ建议进行转换 ( DeMorgan's Law),并将其转换为:
if( ! ( list1.size() < 1 && !( list2.contains(itemX) ) ) ) {
//do something
}
Run Code Online (Sandbox Code Playgroud)
因此它应用了一种非常常见的离散数学理论来简化布尔表达式。我想知道这是如何优化的?
||如果第一部分本身为 true,则运算符无论如何不会执行整个条件,并且仅当第一部分为 false 时才执行 RHS。
改造后的条件是否有效?如何?