hashset去重先比较hashcode 但是你的hashcode是直接调用的String的hashcode 每个不同的String对象 内存地址是不一样的,所以无法去重
问题分析:
根据问题描述,初学者模仿例文的代码编写,但是无法正确过滤相同ID的条目。因此,需要看一下初学者的代码,并结合示例代码来修改。
解决方案:
1.首先需要看一下初学者的代码,找出错误所在。如果初学者的代码有误,可以进行修改。 2.在检查完初学者的代码后,可以尝试通过示例代码来进行修改。 3.在示例代码中,有一个SnowFlake类,可以自己实现一个ID发号器。在SnowFlake类中已经实现了根据指定的数据中心ID和机器标志ID生成指定的序列号的nextId()方法。 4.可以将SnowFlake类作为一个工具类,调用nextId()方法来生成唯一的ID,并且可以根据需求将生成的10进制的数字转换为指定进制的字符串。 5.然后将生成的短地址进行存储,例如存储在Redis等中。 6.当需要查询一个短地址对应的10进制ID时,可以将短地址转换为10进制的数字。
参考代码:
SnowFlake类代码:
```java /* * Twitter的SnowFlake算法,使用SnowFlake算法生成一个整数,然后转化为62进制变成一个短地址URL * @author beyond https://github.com/beyondfengyu/SnowFlake * @author xuliugen * @date 2018/04/23 / public class SnowFlake {
/* * 起始的时间戳 / private final static long START_TIMESTAMP = 1480166465631L;
/* * 每一部分占用的位数 / private final static long SEQUENCE_BIT = 12; //序列号占用的位数 private final static long MACHINE_BIT = 5; //机器标识占用的位数 private final static long DATA_CENTER_BIT = 5; //数据中心占用的位数
/* * 每一部分的最大值 / private final static long MAX_SEQUENCE = -1L ^ (-1L << SEQUENCE_BIT); private final static long MAX_MACHINE_NUM = -1L ^ (-1L << MACHINE_BIT); private final static long MAX_DATA_CENTER_NUM = -1L ^ (-1L << DATA_CENTER_BIT);
/* * 每一部分向左的位移 / private final static long MACHINE_LEFT = SEQUENCE_BIT; private final static long DATA_CENTER_LEFT = SEQUENCE_BIT + MACHINE_BIT; private final static long TIMESTAMP_LEFT = DATA_CENTER_LEFT + DATA_CENTER_BIT;
private long dataCenterId; //数据中心 private long machineId; //机器标识 private long sequence = 0L; //序列号 private long lastTimeStamp = -1L; //上一次时间戳
/* * 根据指定的数据中心ID和机器标志ID生成指定的序列号 * @param dataCenterId 数据中心ID * @param machineId 机器标志ID / public SnowFlake(long dataCenterId, long machineId) { if (dataCenterId > MAX_DATA_CENTER_NUM || dataCenterId < 0) { throw new IllegalArgumentException("DtaCenterId can't be greater than MAX_DATA_CENTER_NUM or less than 0!"); } if (machineId > MAX_MACHINE_NUM || machineId < 0) { throw new IllegalArgumentException("MachineId can't be greater than MAX_MACHINE_NUM or less than 0!"); } this.dataCenterId = dataCenterId; this.machineId = machineId; }
/* * 产生下一个ID * @return / public synchronized long nextId()