//map是一个hashmap<String, Role>
public String saveRole(final Role role) 
{
String username = role.getUsername();
Role r = map.get(username);
if(r != null)
{
        map.put(username, role);
return "0";
}
return "-1";
}
ROLE是用Socket传送过来的对象。
这个函数执行5000次基本上要花费20秒。
如果把 map.put(username, role);注释掉。5000次瞬间完成求解。。真奇怪的问题。想半天没想明白

解决方案 »

  1.   

    你这个逻辑有点不明白
    map中存在相同的key就覆盖它,不存在就不放
      

  2.   

    map的声明拿出来看看另外,这个函数是单线程还是多线程操作
      

  3.   


    不是存在相同key保存,而是username不为null的保存,而且是覆盖式的保存一个role对象大概占用多少内存?5000个大概看看占用多少内存?
    怎么测试函数执行时间的?确定时间是耗在这个函数上?还是整个处理过程的时间慢了?
      

  4.   

    是单线程操作,1个ROll 1K不到 申明是这样的:Map<String,Role> map; 初始化:map = new HashMap<String, Role>();
      

  5.   

    话说就是ROLE对象占的内存大。。那替换个引用也不会那么慢啊。
      

  6.   

    你是意思是从map中取出username对应的value,如果不为空,则替换掉这个value这样试试,先将这个value remove掉,然后再put进新的value;不采用覆盖的方式。
      

  7.   

    map的声明拿出来看看另外,这个函数是单线程还是多线程操作
      

  8.   

    Role 的hashCode实现了没?equals呢...
      

  9.   


    话说我的KEY是一个String...要覆盖的话比较的也是KEY啊。
      

  10.   

    前提条件:单线程
    使用集合:HashMapHashMap 里面有这样一个构造:HashMap(int initialCapacity, float loadFactor) 
    initialCapacity->初始容量:哈希表中桶的数量,初始容量只是哈希表在创建时的容量。
    loadFactor->加载因子:希表在其容量自动增加之前可以达到多满的一种尺度。
    当哈希表中的条目数超出了加载因子与当前容量的乘积时,则要对该哈希表进行 rehash 操作(即重建内部数据结构),从而哈希表将具有大约两倍的桶数。 看你的初始化都没有设置这两个参数,所以都选择默认值(容量是16,加载因子是0.75f)你这里是5000次,你自己计算一下。你的容器要rehash多少次。。初始化的时候把容量加上你试试多少时间,然后在加上加载因子
    map = new HashMap<String, Role>(5000);注:如果初始容量大于最大条目数除以加载因子,则不会发生 rehash 操作。 如果不想rehash一次。可以自己计算一下。。
      

  11.   

    进过定位。。这个效率和Hashmap没关系
    现函数改为:@Override
    public String saveRole(Role role) 
    {
    String result = "-1";
    String token = tokens.get(role.getUsername());
    RoleInfo info = userInfos.get(token);
    if(info != null)
    {
    info.role = role;
    this.savaToCacheThread.add(role);
    result = "0";
    }
    return result;
    }
    把info.role = role;注释掉。函数瞬间完成,否则超慢。。
    求解啊。
      

  12.   

    你这个hashmap多大啊? 20秒/5000 = 0.004秒 也就4毫秒而已。 如果是海量数据 应该是可以接受的吧
      

  13.   

    我也是个菜鸟,感觉是这个问题:String 在开发中的不正确应用,要明确记住字符串中的内容不可改变这一重要特性。if(r != null)
        {
                map.put(username, role);
            return "0";
        }因为每次字符串的指向都要“断开-连接”,所以代码性能很低。
      

  14.   


    Map map = new HashMap<String, Integer>();
         long start = System.currentTimeMillis();
         for(int i = 0; i < 5000; i++) {
         map.put("abcdefg" + 1, Integer.valueOf(i));
         }
         long end = System.currentTimeMillis();
         System.out.println(end - start);我用这段测试了下  值用16ms啊我觉得你应该把你那段改为    
        public boolean saveRole(Role role) {
            String username = role.getUsername();
            if(username != null)
            {
                map.put(username, role);
                return true;
            }
            return false;
        }
    你用户名为不为null的时候加入到map,也是应该判断用户名啊
    而且你要返回2值做成功与否的话,一般还是返回boolean类型吧
      

  15.   

    没看出什么特别的
    LZ自己用javap看一下代码指令
    javap -verbose your_class