A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© hyz123456 中级黑马   /  2013-10-17 15:11  /  1686 人查看  /  12 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 hyz123456 于 2013-10-17 23:40 编辑

思路是这样的:           建立一个类 ,里面封装一个Map集合,然后将类单例化,通过另一个函数调用类的getInstance方法,往Map里面添加元素,实现类似数据添加的方法,但是为什么我这个代码getInstance多次调用获得不是同一个对象呢... 是我对单例的理解有问题还是代码有问题 ,请各位大神指导下~
  1. class SQL
  2. {
  3.         private static Map<String,Hero> sql = new HashMap<String ,Hero>();
  4.         private SQL(){}
  5.         private static SQL Sql = new SQL();
  6.         public  static SQL getInstance()
  7.         {
  8.                 return Sql;
  9.         }
  10.         
  11.         public static boolean addSQL(String name,Hero h)
  12.         {
  13.                 if (sql.containsKey(name))
  14.                         return false;
  15.                 sql.put(name,h);
  16.                 return true;
  17.         }
  18.         public static void printSQL()
  19.         {
  20.                 Iterator<Map.Entry<String,Hero>> it= sql.entrySet().iterator();
  21.                 while (it.hasNext())
  22.                 {
  23.                         Map.Entry<String,Hero> me = it.next();
  24.                         System.out.println(me.getValue().name);
  25.                 }
  26.         }
  27.         
  28. }
复制代码
每次调用类中的addSQL方法之后里面的元素总是刚添加的那个,不管调用多少次,为什么啊??
我想实现可以多次往里面添加元素,实现类似数据库的方法,怎么实现呢?

评分

参与人数 1技术分 +1 收起 理由
周志龙 + 1 勤学好问,赞一个

查看全部评分

12 个回复

倒序浏览
刚用楼主的代码测试了一下,所有添加的元素都在啊,没有问题。
  1. import java.util.*;
  2. class SQL
  3. {
  4.         private static Map<String,String> sql = new HashMap<String ,String>();
  5.         private SQL(){}
  6.         private static SQL Sql = new SQL();
  7.         public  static SQL getInstance()
  8.         {
  9.                 return Sql;
  10.         }
  11.         
  12.         public static boolean addSQL(String name,String h)
  13.         {
  14.                 if (sql.containsKey(name))
  15.                         return false;
  16.                 sql.put(name,h);
  17.                 return true;
  18.         }
  19.         public static void printSQL()
  20.         {
  21.                 Iterator<Map.Entry<String,String>> it= sql.entrySet().iterator();
  22.                 while (it.hasNext())
  23.                 {
  24.                         Map.Entry<String,String> me = it.next();
  25.                         System.out.println(me.getValue());
  26.                 }
  27.         }
  28.         
  29. }
  30. public class SqlTest {
  31.         public static void main(String[] args) {
  32.                 // TODO Auto-generated method stub
  33.                 //SQL s = SQL.getInstance();
  34.                 SQL.addSQL("zhangsan", "1");
  35.                 SQL.addSQL("lisi", "2");
  36.                 SQL.addSQL("wangwu", "3");
  37.                 SQL.printSQL();
  38.                
  39.         }

  40. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
周志龙 + 1 回答的很漂亮,继续努力

查看全部评分

回复 使用道具 举报
...... 发表于 2013-10-17 16:53
刚用楼主的代码测试了一下,所有添加的元素都在啊,没有问题。

应该是你的24行代码有问题,我不知道你的Hero类怎么定义的,可能是你me.getValue().name得到的值都相同吧
回复 使用道具 举报
...... 发表于 2013-10-17 16:53
刚用楼主的代码测试了一下,所有添加的元素都在啊,没有问题。

我知道在.. 但是你再添加一次呢 会发现之前添加的没有了  我想实现不断地往里面添加数据的功能
回复 使用道具 举报
请你看看这个代码,你运行一下试试。


package com.itheima;

import java.util.*;

class SQL {
        private static Map<String, String> sql = new HashMap<String, String>();

        private SQL() {
        }

        private static SQL Sql = new SQL();

        public static SQL getInstance() {
                return Sql;
        }

        public boolean addSQL(String name, String h) {
                if (sql.containsKey(name))
                        return false;
                sql.put(name, h);
                return true;
        }

        public void printSQL() {
                Iterator<Map.Entry<String, String>> it = sql.entrySet().iterator();
                while (it.hasNext()) {
                        Map.Entry<String, String> me = it.next();
                        System.out.println(me.getKey()+":"+me.getValue());
                }
        }

}

public class SqlTest {
        public static void main(String[] args) {
                // TODO Auto-generated method stub
                // SQL s = SQL.getInstance();
                SQL sql=SQL.getInstance();
                sql.addSQL("zhangsan", "1");
                sql.addSQL("lisi", "2");
                sql.addSQL("wangwu", "3");
                sql.printSQL();
               
                System.out.println("-----------------------");
               
                SQL sql2=SQL.getInstance();
                sql2.addSQL("wenbaoxing", "4");
                sql2.printSQL();
        }

}


评分

参与人数 1技术分 +1 收起 理由
周志龙 + 1 很给力!

查看全部评分

回复 使用道具 举报
hyz123456 发表于 2013-10-17 17:44
我知道在.. 但是你再添加一次呢 会发现之前添加的没有了  我想实现不断地往里面添加数据的功能 ...

不明白你的再添加是什么意思……难道是添加一次之后程序运行结束,然后再运行往里面添加??
回复 使用道具 举报
...... 发表于 2013-10-17 19:36
不明白你的再添加是什么意思……难道是添加一次之后程序运行结束,然后再运行往里面添加?? ...

嗯  把前面的程序弄成一个数据库的意思
然后通过后面运行多个程序往里面添加内容
回复 使用道具 举报
...... 中级黑马 2013-10-17 22:28:28
8#
hyz123456 发表于 2013-10-17 20:35
嗯  把前面的程序弄成一个数据库的意思
然后通过后面运行多个程序往里面添加内容 ...

这样啊 ,那我感觉就不是单例的问题了,要用到IO,你要建一个文件,存储这些内容,然后每个程序运行一次就往里面存一次,用的时候在从这个文件里面读取出来就行了
回复 使用道具 举报
...... 中级黑马 2013-10-17 22:28:39
9#
hyz123456 发表于 2013-10-17 20:35
嗯  把前面的程序弄成一个数据库的意思
然后通过后面运行多个程序往里面添加内容 ...

这样啊 ,那我感觉就不是单例的问题了,要用到IO,你要建一个文件,存储这些内容,然后每个程序运行一次就往里面存一次,用的时候在从这个文件里面读取出来就行了
回复 使用道具 举报
...... 中级黑马 2013-10-17 22:28:46
10#
hyz123456 发表于 2013-10-17 20:35
嗯  把前面的程序弄成一个数据库的意思
然后通过后面运行多个程序往里面添加内容 ...

这样啊 ,那我感觉就不是单例的问题了,要用到IO,你要建一个文件,存储这些内容,然后每个程序运行一次就往里面存一次,用的时候在从这个文件里面读取出来就行了
回复 使用道具 举报
...... 中级黑马 2013-10-17 22:28:53
11#
hyz123456 发表于 2013-10-17 20:35
嗯  把前面的程序弄成一个数据库的意思
然后通过后面运行多个程序往里面添加内容 ...

这样啊 ,那我感觉就不是单例的问题了,要用到IO,你要建一个文件,存储这些内容,然后每个程序运行一次就往里面存一次,用的时候在从这个文件里面读取出来就行了
回复 使用道具 举报
楼主你好,如果问题已解决请将帖子状态修改为提问结束,如果未解决请继续提问,谢谢合作
如果不会修改请看解释帖:http://bbs.itheima.com/thread-89313-1-1.html
回复 使用道具 举报
楼主你好,如果问题已解决请将帖子状态修改为提问结束,如果未解决请继续提问,谢谢合作
如果不会修改请看解释帖:http://bbs.itheima.com/thread-89313-1-1.html
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马