C++和JAVA的容器对照

21 篇文章 0 订阅
文章详细介绍了C++和Java中不同类型的数组和集合,如ArrayList、LinkedList、HashSet等,强调了它们的特性和使用场景。在Java中,自定义类型在TreeSet排序时需实现Comparable接口或提供Comparator。同时,提到了不同数据结构的效率和同步操作的区别,例如Vector和ArrayList的同步性能,以及HashMap和HashSet的内部实现变化。
摘要由CSDN通过智能技术生成

说明:c++版本为c++ 11,java版本参考java se8,如果版本不同可能有差异;

c++JAVA解释
array[ ]固定大小的数组
vectorArrayList可变长度的数组
Vector可变长度数组,支持同步操作,效率比ArrayList略低
listLinkedList链表,便于增删
forward_list单链表,注意不提供size()操作
dequeArrayDeque双端队列
stackStack
queueQueue队列
priority_queuePriorityQueue优先队列(大根堆、小根堆)
set
ps:java里如果希望Set集合去除自定义重复对象,要记得重写对象的hashCode和equals方法
set底层是map实现
TreeSet集合,默认底层基于红黑树对数据按大小升序排序; 自定义类型排序要重写排序规则
multiset集合,允许重复元素
unordered_setHashSethash组织的set,数据无序;jdk8之前哈希表采用数组+链表组成,jdk8之后采用数组+链表+红黑树组成
unordered_multisethash组织的multiset,支持重复数据
LinkedHashSet按插入顺序排序,支持hash查找,相比HashSet,底层增加了双链表记录数据增添顺序
map
ps:java里如果希望map集合去除作为键的自定义重复对象,要记得重写对象的hashCode和equals方法
TreeMapkey-value映射,按照key排序,自定义类型排序要重写排序规则
multimap允许重复key的map
unordered_mapHashMaphash组织的map
unordered_multimaphash组织的multimap
LinkedHashMap按插入顺序排序,支持hash查找,底层依然是哈希表实现,但是增加了双链表记录数据增添顺序
HashTable类似HashMap,支持同步操作
bitsetBitSet位操作

TreeSet 自定义类型排序要重写排序规则:
PS:TreeSet是由TreeMap实现,所以TreeMap的自定义排序同理。
方法一:让自定义的类实现Comparable接口,这样直接调用TreeSet插入自定义对象即可自动排序:

public class Car implements Comparable<Car>{
    String name;
    double price;
	public double getPrice() {
        return price;
    }
    @Override
    public int compareTo(Car o) {
        return Double.compare(this.price,o.getPrice());
    }
    //注意这种情况下,当对象价格相同,TreeSet 会认为是重复对象,会只保留第一个对象。
    //要想价格相同也保留,可以在Double.compare(this.price,o.getPrice())的值是0的时候返回1或-1。

方法二:TreeSet带有参数构造器,可以自定义Comparator匿名类对象来定制比较规则

TreeSet<Car> myset = new TreeSet<>(new Comparator<Car>() {
	@Override
	public int compare(Car o1, Car o2) {
		return Double.compare(o1.getPrice(), o2.getPrice());
	}
});

//lambda简写格式:
TreeSet<Car> myset = new TreeSet<>((o1, o2) -> Double.compare(o1.getPrice(), o2.getPrice()));

注意当同时定义了类实现Comparable接口和自定义Comparator匿名类对象俩种方法时,java默认选择后者作为排序准则。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值