Java实现数据的有序和唯一
时间: 2024-05-06 18:14:55 浏览: 5
Java中可以使用TreeSet类来实现数据的有序和唯一,TreeSet是一个基于红黑树数据结构实现的Set集合,它能够对元素进行自然排序或者通过自定义的Comparator进行排序,并且保证元素的唯一性。具体使用方法如下:
1. 创建TreeSet对象
```
TreeSet<Integer> set = new TreeSet<>();
```
2. 添加元素
```
set.add(3);
set.add(1);
set.add(2);
```
3. 获取元素
```
int first = set.first(); // 获取最小元素,结果为1
int last = set.last(); // 获取最大元素,结果为3
```
4. 删除元素
```
set.remove(2);
```
5. 遍历元素
```
for (Integer num : set) {
System.out.println(num);
}
```
输出结果为:
```
1
3
```
相关问题
用java 实现雪花算法
雪花算法,也称为Twitter的雪花算法,是一种生成全局唯一ID的算法。它的主要特点是生成的ID是有序的,并且可以在分布式系统中保证唯一性。
以下是Java实现雪花算法的代码:
```java
public class SnowflakeIdGenerator {
// 起始的时间戳
private final static long START_STMP = 1480166465631L;
// 每一部分占用的位数
private final static long SEQUENCE_BIT = 12; // 序列号占用的位数
private final static long MACHINE_BIT = 5; // 机器标识占用的位数
private final static long DATACENTER_BIT = 5;// 数据中心占用的位数
// 每一部分的最大值
private final static long MAX_DATACENTER_NUM = -1L ^ (-1L << DATACENTER_BIT);
private final static long MAX_MACHINE_NUM = -1L ^ (-1L << MACHINE_BIT);
private final static long MAX_SEQUENCE = -1L ^ (-1L << SEQUENCE_BIT);
// 每一部分向左的位移
private final static long MACHINE_LEFT = SEQUENCE_BIT;
private final static long DATACENTER_LEFT = SEQUENCE_BIT + MACHINE_BIT;
private final static long TIMESTMP_LEFT = DATACENTER_LEFT + DATACENTER_BIT;
private long datacenterId; // 数据中心
private long machineId; // 机器标识
private long sequence = 0L; // 序列号
private long lastStmp = -1L;// 上一次时间戳
public SnowflakeIdGenerator(long datacenterId, long machineId) {
if (datacenterId > MAX_DATACENTER_NUM || datacenterId < 0) {
throw new IllegalArgumentException("datacenterId can't be greater than MAX_DATACENTER_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
public synchronized long nextId() {
long currStmp = getNewstmp();
if (currStmp < lastStmp) {
throw new RuntimeException("Clock moved backwards. Refusing to generate id");
}
if (currStmp == lastStmp) {
// 相同毫秒内,序列号自增
sequence = (sequence + 1) & MAX_SEQUENCE;
// 同一毫秒的序列数已经达到最大
if (sequence == 0L) {
currStmp = getNextMill();
}
} else {
// 不同毫秒内,序列号置为0
sequence = 0L;
}
lastStmp = currStmp;
// 时间戳部分 | 数据中心部分 | 机器标识部分 | 序列号部分
return (currStmp - START_STMP) << TIMESTMP_LEFT
| datacenterId << DATACENTER_LEFT
| machineId << MACHINE_LEFT
| sequence;
}
private long getNextMill() {
long mill = getNewstmp();
while (mill <= lastStmp) {
mill = getNewstmp();
}
return mill;
}
private long getNewstmp() {
return System.currentTimeMillis();
}
public static void main(String[] args) {
SnowflakeIdGenerator idWorker = new SnowflakeIdGenerator(1, 1);
for (int i = 0; i < 10; i++) {
long id = idWorker.nextId();
System.out.println(Long.toBinaryString(id));
System.out.println(id);
}
}
}
```
在这个实现中,我们将时间戳、数据中心、机器标识和序列号合并成一个long型的ID,其中时间戳部分占用了最高的位数,因此生成的ID是有序的。同时,我们使用了synchronized关键字保证了在多线程环境中的唯一性。
java 中常用的数据结构
在Java中,常用的数据结构包括:
1. 数组(Array):一组连续的内存空间,用于存储相同类型的元素。
2. 链表(LinkedList):由多个节点组成,每个节点存储数据和指向下一个节点的引用。
3. 栈(Stack):先进后出(FILO)的数据结构,可以使用数组或链表实现。
4. 队列(Queue):先进先出(FIFO)的数据结构,可以使用数组或链表实现。
5. 哈希表(HashMap):基于键-值对的数据结构,通过哈希函数将键映射到存储位置。
6. 集合(Set):存储唯一元素的数据结构,常见的实现类有HashSet和TreeSet。
7. 列表(List):有序的元素集合,常见的实现类有ArrayList和LinkedList。
***