前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java集合类的使用心得

Java集合类的使用心得

作者头像
matt
发布2022-10-25 15:52:23
4240
发布2022-10-25 15:52:23
举报
文章被收录于专栏:CSDN迁移

Java集合类的使用心得

一、Set(不重复)

常用结构:SortedSet是个接口,TreeSet是它的唯一实现类,其中的元素是有序的。

代码语言:javascript
复制
// 不重复,按一定的顺序排列(HashSet,基于哈希表)
Set<String> set = new HashSet<>();
// SortedSet(含TreeSet,基于二叉树)按自然顺序升序排列
SortedSet<String> sortedSet = new TreeSet<>();
// 不重复,按原来顺序排列
Set<String> linkedHashSet = new LinkedHashSet<>();

常用方法:

代码语言:javascript
复制
set.add("值");
set.clear();
set.remove();
Object[] obj = set.toArray();
String[] strings = set.toArray(new String[set.size()]);

使用心得:

  1. Set要取任意位置的值,可以转换成List:List<String> setToList = new ArrayList<>(set);
  2. Set一般会利用它的不重复性来判断值是否存在,if(set.add("值"))
  3. 只利用不重复性时用HashSet,要考虑到按原来顺序排列用LinkedHashSet,要对值进行排序用SortedSet。

二、List(随机访问)

常用结构:

代码语言:javascript
复制
// 按原来顺序排列
List<Integer> list = new ArrayList<>();
// 双向链表
LinkedList<String> linkedList = new LinkedList<>();
// List没有Sorted List,可以通过Collections.sort()排序列表

常用方法:

代码语言:javascript
复制
/** ArrayList */
list.add("值");
list.add((int)index, "值");
list.remove("值"); // 删除一个最开始出现的“值”
list.remove((int)index);
list.get((int)index);
list.set((int)index, "值");
list.contains("值");
list.indexOf("值"); // 还有lastIndexOf()

/** LinkedList */
// 不指定索引,则将元素添加到链表的最后
linkedList.add(Object element)
linkedList.add(int index, Object element)
// 把链表当初栈或者队列来处理
linkedList.addFirst(Object element)
linkedList.addLast(Object element)

linkedList.removeFirst(); // end同理,remove()方法效果与removeFirst()相同
linkedList.removeFirstOccurrence("值");

linkedList.get((int)index);
linkedList.getFirst(); // getLast()同理

linkedList.set((int)index, "值"); // 替换指定位置
linkedList.indexOf("值"); // lastIndexOf()同理
linkedList.subList(start, end);

List使用心得:

  1. 如果涉及到“栈”、“队列”、“链表”等操作,应该考虑用List;
  2. 注意有set()方法的存在,随机访问。

ArrayList使用心得:

  1. 序号从0开始;
  2. 通过索引存储,存储的值可以相同;
  3. 如需替换某个值,应结合remove和add两个方法;
  4. List内可以存对象,此外的操作可以同样用数组实现。

LinkedList使用心得:

  1. 可以通过First和Last来实现堆、栈的数据结构。
  • Stack 常用方法:
代码语言:javascript
复制
Stack<String> stack = new Stack<>();

push(),将元素推入栈中(数组的末尾)
peek(),取出栈顶元素,不执行删除(返回数组末尾的元素)
pop(),取出栈顶元素,并将该元素从栈中删除(取出数组末尾的元素,然后将该元素从数组中删除)
empty(),判断堆是否为空
search(),返回基于堆顶部元素的位置,从1开始(如堆顶元素为1)

三、Map(对应关系)

常用结构:

代码语言:javascript
复制
// 键按hashcode()的顺序排列
Map<String, Integer> map = new HashMap<>();
// 键按自然顺序升序排列,不允许null
SortedMap sortedMap = new TreeMap();
// 键按原来顺序排列
LinkedHashMap<String, Integer> map = new LinkedHashMap<>();

// 针对键自定义顺序,这里改成了降序,也可以新建一个Comparator对象,这里引用对象
SortedMap<Integer, String> sortedMap = new TreeMap<>(new Comparator<Integer>() {
   @Override
    public int compare(Integer o1, Integer o2) {
        return o2 - o1;
    }
});

常用方法:

代码语言:javascript
复制
map.put("键","值");
map.remove("键"); // 返回的是对应的值,remove("键","值")返回的是布尔值
map.get("键"); // 返回的是对应的值

map.containsKey("键");
map.keySet().contains("键"); // value().contains()类似

map.entrySet().iterator();
map.keySet().iterator();
map.value().iterator();

使用心得:

  1. 重复时,put()方法会覆盖原来的值,且键可以为null;
  2. 分别获得当前键值的键与值
代码语言:javascript
复制
Iterator iterator = map.entrySet().iterator();
while (iterator.hasNext()) {
    Map.Entry entry = (Map.Entry) iterator.next();
    System.out.println(entry.getKey() + ":" + entry.getValue());
}
  1. 通过值获得相应的键
代码语言:javascript
复制
Set<Entry<Integer, String>> entries = map.entrySet();
for (Entry entry : entries) { // 或Map.Entry
	if (val.equals(entry.getValue())) {
		System.out.println(entry.getKey());
	}
}
  1. 对HashMap进行排序,自定义SortedMap的比较逻辑
代码语言:javascript
复制
// 自定义比较器
class ValueComparator implements Comparator<String> {
    Map<String, Integer> base;

    public ValueComparator(Map<String, Integer> base) {
        this.base = base;
    }

    public int compare(String a, String b) {
        if (base.get(a) >= base.get(b)) {
            return -1;
        } else {
            return 1;
        } // returning 0 would merge keys
    }
}

// 在代码中添加如下实现代码
ValueComparator vc = new ValueComparator(map);
TreeMap<String, Integer> sortedMap = new TreeMap<String, Integer>(vc);
sortedMap.putAll(map);

四、数组

实际开发之中,会更多的使用数组概念,而直接使用,99%情况下都只是做一个 for 循环输出。出现二位数组的几率并不高。

五、类型转化

变量名定义

代码语言:javascript
复制
int i;
Integer integer;
String str;
char[] chars;
Set set;
List list;
String[] strs;
  1. Integer与int
代码语言:javascript
复制
integer = Integer.valueOf(i);
i = integer.intValue();
  1. String与int
代码语言:javascript
复制
i = Integer.parseInt(str);
str = String.valueOf(i);
  1. String与char[]
代码语言:javascript
复制
chars = str.toCharArray();
str = String.valueOf(chars); // toString()方法得到的是类名加地址
  1. set与list
代码语言:javascript
复制
set = new HashSet<>(list);
list = new ArrayList<>(set);
  1. String[]与list
代码语言:javascript
复制
// 或list = Arrays.asList(Arrays.copyOf(strs, strs.length));
list = new ArrayList<>(Arrays.asList(strs));

strs = list.toArray(new String[list.size()]);
  1. String[]与set
代码语言:javascript
复制
set = new HashSet<>(Arrays.asList(strs));
strs = set.toArray(new String[set.size()]);

总结:

  1. set与list可以通过new天然互转;
  2. String.valueOf(…)可以将基本数据类型转换成String;
  3. toArray()方法可以将一个Collection转化为数组,但一定要注意初始化长度。
  4. Arrays工具类 asList()接收的参数是一个泛型的变长参数,而基本数据类型无法泛型化,应使用封装类数组。且得到的ArrayList是Arrays的一个内部类,没有add方法,使用时会报Unsupported Operation Exception。
代码语言:javascript
复制
// 将数组转化成List
Arrays.asList(T… data) 

Arrays.sort(); // 多态
// 使用二分法查找数组内指定元素的索引值,但是先要排序sort
Arrays.binarySearch(Object[] array, Object key);
Arrays.binarySearch(Object[] array, int fromIndex, int toIndex, Object obj);

// 拷贝数组
Arrays.copyOf(T[] original, int newLength); 
Arrays.copyOfRange(T[] original, int from, int to); // 如果超过原数组长度,会用null进行填充
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-08-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Java集合类的使用心得
  • 一、Set(不重复)
  • 二、List(随机访问)
  • 三、Map(对应关系)
  • 四、数组
  • 五、类型转化
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档