小编Ant*_*huk的帖子

String.intern()真的提高了性能吗?

我做了一些调查,以了解如何String.intern()在java中实现该方法.

我从Open JDK 6看了Intern池的C++实现,在那里我看到了一个简单的HashSet.对我而言,这意味着当有人试图实习时String,应该完成下一步:

  1. 找到与给定相关联的哈希码 String
  2. 寻找合适的水桶
  3. 将给定的String与存储桶中的所有其他字符串进行比较.在此步骤之前,桶中可能有0个字符串,一个字符串或很多字符串.因此,如果先前已经将给定的String放入存储桶中,我们将至少进行一次比较(这是最好的情况.当然可能存在很多冲突,现在许多其他字符串都在桶中)
  4. 如果在存储桶中找到了String,则应该通过intern()方法返回它
  5. 如果在存储桶中找不到String,则应将其放入存储桶并通过intern()方法返回

很多人说str1.intern() == str2.intern()会比这更快str1.equals(str2).

但我看不出它应该更快的原因.

正如我所见,str1.equals(str2)我们总是有两个字符串比较char String.equals()方法中的char .

在这种情况下str1.intern() == str2.intern(),我们需要进行多少次比较或将字符串放入池中(对吧,它可以进行大量的比较,它们也是char比较的简单char)?

因此,str1.intern() == str2.intern()即使我们使用==比较字符串,我们也会有许多其他操作,例如前面描述的比较.

当我理解它时,我决定做一些基准测试.

第一个结果告诉我str1.intern() == str2.intern()比这更快str1.equals(str2).

此行为是由于该String.intern()方法是本机的,因此不应每次都解释它并且String.equals()是一个java方法.

所以我决定使用-Xcomp选项让JVM在启动时编译所有代码.

在那之后等于比实习生更快的速度.

我在Java 6和7上测试过它.

所以我的问题是你有没有看到在实际比较字符串比较速度增加的情况?我是怎么回事?

或者也许intern()只能帮助节省更多的免费记忆?

java string string-interning

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

-XX:+ UseConcMarkSweepGC(什么是默认的年轻代收集器?)

据我所知,我们可以使用下一个选项运行JVM:

-XX:+UseConcMarkSweepGC
-XX:-UseParNewGC
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我们将为年轻一代提供Serial(DefNew)垃圾收集器,为旧一代提供Concurrent Mark Sweep垃圾收集器.

那么,我们-XX:+UseConcMarkSweepGC可以只选择运行JVM 吗?我的意思是没有任何描述年轻一代垃圾收集器的选项.如果我们能做到这一点,哪个垃圾收集器将用于老一代?

java garbage-collection concurrent-mark-sweep

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

列表<?> vs List <?extends Object>

可能重复:
<?>和<?之间有什么区别?在Java Generics中扩展Object>?

我发现List<?>List<? extends Object>以同样的方式行事.至于我,它们之间没有区别.如果我不对,你能解释一下我的区别吗?

import java.util.ArrayList;
import java.util.List;

public class TestClass {

static void func1(List<?> o, Object s) {
    o.add(null); // only null
    o.add(s); // wrong
    o.get(0);  // OK
}

static void func2(List<? extends Object> o, Object s) {
    o.add(null); // only null
    o.add(s); // wrong
    o.get(0); // OK
}

public static void main(String[] args) {
    func1(new ArrayList<String>(), new Integer(1));
    func2(new ArrayList<String>(), new Integer(1));

    List<? extends Object> list1 = new ArrayList<Object>();
    List<?> list2 = …
Run Code Online (Sandbox Code Playgroud)

java generics

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

如何在Java中标记为最终化的对象(以便第二次不调用finalize方法)?

主要问题在于主题,但是让我展示我对Java中最终化过程的看法,以便我可以向您提出更多要求.

那么gc通过标记所有活动对象来启动垃圾收集.当所有可到达的对象都标记为"实时"时.所有其他对象都无法访问.下一步是检查每个无法到达的对象,并确定它是否可以立即进行清理,或者应该首先完成.如果对象的finalize方法有一个主体,那么gc会想到下一个方法,那么这个对象是可以最终确定的并且应该最终确定; 如果对象的finalize方法有一个空体(protected void finalize(){})那么它不能最终化并且现在可以被gc清理.(我是对的吗?)
所有可终结的对象将放在同一个队列中,以便稍后逐一完成.据我所知,可终结的对象可以花费大量时间放在队列中,同时等待轮到他们完成.这可能发生,因为通常只有一个名为Finalizer的线程从队列中获取对象并调用它们的finalize方法,当我们在某个对象的finalize方法中有一些耗时的操作时,队列中的其他对象将等待很长时间才能完成.好的,当一个对象完成后,它被标记为FINALIZED并从队列中删除.在下一个垃圾收集过程中,收集器将看到此对象无法访问(再次)并且具有非空的finalize方法(再次),因此该对象应该被放入队列中(再次) - 但它不会因为收集器以某种方式看到这个对象被标记为FINALIZED.(这是我的主要问题:这个对象被标记为FINALIZED的方式,收集器如何知道该对象不应该再次终结?)

java garbage-collection finalize finalization finalizer

6
推荐指数
1
解决办法
1246
查看次数

如何防止传单上的标记上的点击显示弹出窗口?

我希望当我单击Leaflet标记时弹出窗口不显示自身。我无法使用,clickable : false因为它将使标记“充当基础地图的一部分”,这对我来说是不可接受的。我尝试了下一个代码

marker.on('click', function(event) {
  event.originalEvent.preventDefault();
});
Run Code Online (Sandbox Code Playgroud)

没有任何结果。不使用clickable : false标记对象的属性来防止弹出窗口显示的正确方法是什么。

编辑1:我所需要的只是通过单击一个自定义按钮来打开地图上的所有弹出式窗口,但是我仍然不希望在单击特定标记后弹出式窗口显示出来

javascript maps leaflet

6
推荐指数
2
解决办法
8314
查看次数

无法将Eclipse创建的WAR文件正确部署到Tomcat

我要告诉你我所做的所有步骤.我还会给一些照片让我的问题更容易理解.任何建议都会很好.

有必要说我用

Tomcat 6(在C:\ Program Files\Apache Software Foundation\Tomcat 6.0上存在)

Eclipse 3.7(靛蓝)

eclipse 3.7的谷歌插件(用于GWT)

在eclipse中我创建了一个服务器 在此输入图像描述 我在C:\ Program Files\Apache Software Foundation\Tomcat 6.0中设置了$ CATALINA_HOME

我还应该说当我尝试从Eclipse运行Tomcat时有一个例外(我的意思是R-click on server - > start).

INFO: Starting Servlet Engine: Apache Tomcat/6.0.36
12 ??? 2013 17:01:38 org.apache.catalina.startup.HostConfig deployDirectory
INFO: Deploying web application directory docs
12 ??? 2013 17:01:38 org.apache.jasper.EmbeddedServletOptions <init>
SEVERE: The scratchDir you specified: C:\Program Files\Apache Software Foundation\Tomcat 6.0\work\Catalina\localhost\docs is unusable.
12 ??? 2013 17:01:38 org.apache.catalina.startup.HostConfig deployDirectory
INFO: Deploying web application directory helloserver
12 ??? 2013 17:01:38 org.apache.jasper.EmbeddedServletOptions …
Run Code Online (Sandbox Code Playgroud)

java eclipse tomcat war

5
推荐指数
1
解决办法
7708
查看次数

为什么“for-in”循环不遍历原型属性?

让我们创建一个新对象:

var dict = {};
Run Code Online (Sandbox Code Playgroud)

已知的事实是,在创建一个新对象后,这个新对象继承了Object.prototype. 因此,当我尝试检查原型的属性是否被继承时"toString" in obj,我会得到true. 但是当我想将新创建的对象的所有属性放入一个数组中时,我会在填充完成后看到该数组为空。看看下面的代码:

var names = [];

for (var name in dict) {
  names.push(name);
}; 
names.length;
Run Code Online (Sandbox Code Playgroud)

不明白为什么会发生。

javascript

5
推荐指数
1
解决办法
819
查看次数

如何找出确切的年轻/老年人在记忆中的位置?

最近我能够使用sun.misc.Unsafe类获取对象的地址.

现在我试图以编程方式找到我的对象所在的实际生成.为此,我想知道每一代的起点和终点.如果Java(Oracle JVM)提供了解决此问题的任何工具?我不相信,因为即使不同的GC也需要不同的内存结构(例如G1),这使得任务更加有趣:)

我想知道的只是代表内存中几代边界的几个数字,如下所示:

   young gen: start point - 8501702198   
              end point   - 9601256348
Run Code Online (Sandbox Code Playgroud)

愿意听到关于黑魔法的最疯狂的想法,它可以确定不同代区域在记忆中的位置.

java jvm jmx java-memory-model

5
推荐指数
2
解决办法
702
查看次数

GWT中TabPanel和TabLayoutPanel之间的区别是什么

GWT中TabPanel和TabLayoutPanel有什么区别?我在谷歌找不到答案,很难理解阅读文档

java gwt

4
推荐指数
2
解决办法
3885
查看次数

如何在GWT客户端创建JSON字符串?

我在服务器端制作JSON字符串.

JSONObject responseObject = new JSONObject();
    List<JSONObject> authorList = new LinkedList<JSONObject>();
    try {
        for (Author author : list) {
            JSONObject jsonAuthor = new JSONObject();
            jsonAuthor.put("name", author.getName());
            jsonAuthor.put("surname", author.getSurname());
            authorList.add(jsonAuthor);
        }
        responseObject.put("authors", authorList);
    } catch (JSONException ex) {
        ex.printStackTrace();
    }
    return responseObject.toString();
Run Code Online (Sandbox Code Playgroud)

这就是我在客户端部分解析该字符串的方式.

List<Author> auList = new ArrayList<Author>();
    JSONValue value = JSONParser.parse(json);
    JSONObject authorObject = value.isObject();
    JSONArray authorArray = authorObject.get("authors").isArray();
    if (authorArray != null) {
        for (int i = 0; i < authorArray.size(); i++) {
            JSONObject authorObj = authorArray.get(i).isObject();
            Author author …
Run Code Online (Sandbox Code Playgroud)

java gwt json org.json

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