Collections工具类

Java中的二进制操作
进制转换

java 复制代码
// 十进制转换为二进制
String binaryString = Integer.toBinaryString(10);
// 输出二进制字符串
System.out.println(binaryString); // 输出 "1010"
// 二进制转换为十进制
int decimal = Integer.valueOf("1010", 2);
// 输出十进制数值
System.out.println(decimal); // 输出 10

位运算

// 按位与运算

int resultAnd = 51 & 5; // 结果为 1

// 按位或运算

int resultOr = 51 | 5; // 结果为 55

// 异或运算

int resultXor = 51 ^ 5; // 结果为 54

// 取反运算

int resultNot = ~5; // 结果为 -6

// 左移运算

int resultLeftShift = 5 << 1; // 结果为 10

// 右移运算

int resultRightShift = 5 >> 1; // 结果为 2

八进制和十六进制

java 复制代码
八进制:使用Integer.toOctalString(int n)方法,它会返回一个八进制字符串。

十六进制:使用Integer.toHexString
  1. 排序操作
java 复制代码
List<String> list = new ArrayList<>();
list.add("沉默王二");
list.add("沉默王三");
list.add("沉默王四");
list.add("沉默王五");
list.add("沉默王六");

System.out.println("原始顺序:" + list);

// 反转
Collections.reverse(list);
System.out.println("反转后:" + list);

// 洗牌
Collections.shuffle(list);
System.out.println("洗牌后:" + list);

// 自然升序
Collections.sort(list);
System.out.println("自然升序后:" + list);

// 交换
Collections.swap(list, 2,4);
System.out.println("交换后:" + list);

输出是:

java 复制代码
原始顺序:[沉默王二, 沉默王三, 沉默王四, 沉默王五, 沉默王六]
反转后:[沉默王六, 沉默王五, 沉默王四, 沉默王三, 沉默王二]
洗牌后:[沉默王五, 沉默王二, 沉默王六, 沉默王三, 沉默王四]
自然升序后:[沉默王三, 沉默王二, 沉默王五, 沉默王六, 沉默王四]
交换后:[沉默王三, 沉默王二, 沉默王四, 沉默王六, 沉默王五]
  1. 查找操作
    binarySearch(List list, Object key):二分查找法,前提是 List 已经排序过了
    max(Collection coll):返回最大元素
    max(Collection coll, Comparator comp):根据自定义比较器,返回最大元素
    min(Collection coll):返回最小元素
    min(Collection coll, Comparator comp):根据自定义比较器,返回最小元素
    fill(List list, Object obj):使用指定对象填充
    frequency(Collection c, Object o):返回指定对象出现的次数
java 复制代码
System.out.println("最大元素:" + Collections.max(list));
System.out.println("最小元素:" + Collections.min(list));
System.out.println("出现的次数:" + Collections.frequency(list, "沉默王二"));

// 没有排序直接调用二分查找,结果是不确定的
System.out.println("排序前的二分查找结果:" + Collections.binarySearch(list, "沉默王二"));
Collections.sort(list);
// 排序后,查找结果和预期一致
System.out.println("排序后的二分查找结果:" + Collections.binarySearch(list, "沉默王二"));

Collections.fill(list, "沉默王八");
System.out.println("填充后的结果:" + list);
java 复制代码
原始顺序:[沉默王二, 沉默王三, 沉默王四, 沉默王五, 沉默王六]
最大元素:沉默王四
最小元素:沉默王三
出现的次数:1
排序前的二分查找结果:0
排序后的二分查找结果:1
填充后的结果:[沉默王八, 沉默王八, 沉默王八, 沉默王八, 沉默王八]
  1. 同步控制
    HashMap 是线程不安全的,这个我们前面讲到了。那其实 ArrayList 也是线程不安全的,没法在多线程环境下使用,那 Collections 工具类中提供了多个 synchronizedXxx 方法,这些方法会返回一个同步的对象,从而解决多线程中访问集合时的安全问题
java 复制代码
SynchronizedList synchronizedList = Collections.synchronizedList(list);
  1. 不可变集合
    emptyXxx():制造一个空的不可变集合
    singletonXxx():制造一个只有一个元素的不可变集合
    unmodifiableXxx():为指定集合制作一个不可变集合
java 复制代码
List emptyList = Collections.emptyList();
emptyList.add("非空");
System.out.println(emptyList);

这段代码在执行的时候就抛出错误

java 复制代码
Exception in thread "main" java.lang.UnsupportedOperationException
	at java.util.AbstractList.add(AbstractList.java:148)
	at java.util.AbstractList.add(AbstractList.java:108)
	at com.itwanger.s64.Demo.main(Demo.java:61)

还有两个方法比较常用:

addAll(Collection<? super T> c, T... elements),往集合中添加元素 disjoint(Collection<?> c1, Collection<?> c2),判断两个集合是否没有交集

java 复制代码
List<String> allList = new ArrayList<>();
Collections.addAll(allList, "沉默王九","沉默王十","沉默王二");
System.out.println("addAll 后:" + allList);

System.out.println("是否没有交集:" + (Collections.disjoint(list, allList) ? "是" : "否"));
输出:
原始顺序:[沉默王二, 沉默王三, 沉默王四, 沉默王五, 沉默王六]
addAll 后:[沉默王九, 沉默王十, 沉默王二]
是否没有交集:否
相关推荐
freedom_1024_8 分钟前
【c++】使用友元函数重载运算符
开发语言·c++
毕设源码-朱学姐19 分钟前
【开题答辩全过程】以 个人健康管理系统为例,包含答辩的问题和答案
java·spring boot
San30.23 分钟前
深入理解 JavaScript OOP:从一个「就地编辑组件」看清封装、状态与原型链
开发语言·前端·javascript·ecmascript
局外人Inside25 分钟前
PostProcessingBeanDeserializer 使用指南
java
郑州光合科技余经理28 分钟前
基于PHP:海外版同城O2O系统多语言源码解决方案
java·开发语言·git·spring cloud·uni-app·php·uniapp
zmzb010330 分钟前
C++课后习题训练记录Day43
开发语言·c++
IT_Octopus42 分钟前
Java GZip 压缩实践 +实践思考 +进一步压榨性能和存储方案思考:Protobuf+ GZip
java·spring boot
wadesir44 分钟前
C语言模块化设计入门指南(从零开始构建清晰可维护的C程序)
c语言·开发语言·算法
t198751281 小时前
MATLAB水声信道仿真程序
开发语言·算法·matlab
毕设源码-郭学长1 小时前
【开题答辩全过程】以 高校教材大管家系统为例,包含答辩的问题和答案
java·spring boot