Java代码常用功能实现总结(二)

版权声明:本文为博主原创文章,请尊重劳动成果,觉得不错就在文章下方顶一下呗,转载请标明原地址。 https://blog.csdn.net/m0_37739193/article/details/85266546

1.如何取得map里key得最大值:

方法一:
将Map中的key存放至set集合中,进行排序,排序后的set中第一个值即为最小,最后一个即为最大

import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

public class test {
	public static void main(String[] args) {
		Map<Integer, Integer> map = new HashMap<Integer, Integer>();
		map.put(1, 8);
		map.put(3, 53);
		map.put(5, 12);
		System.out.println(getMaxKey(map));
		System.out.println(getMaxValue(map));
	}

	/**
	 * 求Map<K,V>中Key(键)的最大值
	 */
	public static Object getMaxKey(Map<Integer, Integer> map) {
		if (map == null)
			return null;
		Set<Integer> set = map.keySet();
		Object[] obj = set.toArray();
		Arrays.sort(obj);
		return obj[obj.length - 1];
	}

	/**
	 * 求Map<K,V>中Value(值)的最大值
	 */
	public static Object getMaxValue(Map<Integer, Integer> map) {
		if (map == null)
			return null;
		Collection<Integer> c = map.values();
		Object[] obj = c.toArray();
		Arrays.sort(obj);
		return obj[obj.length - 1];
	}
}

运行结果:
5
53

方法二:可以直接使用TreeSet和TreeMap,最后一个为最大值,第一个为最小值

补充:
TreeMap是Map接口的常用实现类,而TreeSet是Set接口的常用实现类。虽然 TreeMap和TreeSet实现的接口规范不同,但TreeSet底层是通过TreeMap来实现的(如同HashSet底层是是通过HashMap来实现的一样),因此二者的实现方式完全一样。而TreeMap的实现就是红黑树算法。

相同点:
TreeMap和TreeSet都是有序的集合,也就是说他们存储的值都是拍好序的。
TreeMap和TreeSet都是非同步集合,因此他们不能在多线程之间共享,不过可以使用方法Collections.synchroinzedMap()来实现同步
运行速度都要比Hash集合慢,他们内部对元素的操作时间复杂度为O(logN),而HashMap/HashSet则为O(1)。

不同点:
最主要的区别就是TreeSet和TreeMap非别实现Set和Map接口
TreeSet只存储一个对象,而TreeMap存储两个对象Key和Value(仅仅key对象有序)
TreeSet中不能有重复对象,而TreeMap中可以存在
 

Set<Integer> a=new HashSet<Integer>();
// 等效于
HashSet<Integer> b = new HashSet<Integer>();

Set<Integer> c=new TreeSet<Integer>();
// 等效于
TreeSet<Integer> d = new TreeSet<Integer>();

a.add(5);

Set是接口,HashSet和TreeSet是实现类
Hashset顾名思义里面是哈希表结构
TreeSet就是树结构
1、TreeSet 是二差树实现的,Treeset中的数据是自动排好序的,不允许放入null值。
2、HashSet 是哈希表实现的,HashSet中的数据是无序的,可以放入null,但只能放入一个null,两者中的值都不能重复,就如数据库中唯一约束。存取速度比较快
注:由于HashSet储存数据都是无序的,所以不能用get(i);来获取具体对象。所以我们必须通过遍历来得到HashSet的各个数据,由于是没有索引的。所以不能使用普通类型的for来遍历它。HashSet只能通过增强型for和迭代器来遍历它

	public static void main(String[] args) {
		HashSet<Integer> a = new HashSet<Integer>();
		a.add(5);
		a.add(4);
		a.add(3);
		for(Integer n : a) {
			System.out.println(n);
		}
		Iterator<Integer> it = a.iterator();
		while (it.hasNext()) {
			System.out.println(it.next());
		}
	}
2.多线程写法样例:
	ExecutorService executorService = Executors.newFixedThreadPool(5);
	this.thredExecute(executorService, createSubject);
					
	private void thredExecute(ExecutorService  threadPool,CreateSubject createSubject) {
		Thread thread = new Thread( () -> {
			try {
				characterAnalysisService.saveCharacterLeader(createSubject);
			} catch (Exception e1) {
				e1.printStackTrace();
			}
		} );
		Thread thread2 = new Thread( () -> {
			try {
				characterAnalysisService.saveIntenetLeader(createSubject);
			} catch (Exception e) {
				e.printStackTrace();
			}
		});
		Thread thread3 = new Thread( () -> {
			try {
				emotionAnalysisService.saveAllTypeEmotion(createSubject);
			} catch (Exception e) {
				e.printStackTrace();
			}
		});
		threadPool.execute(thread);
		threadPool.execute(thread2);
		threadPool.execute(thread3);

		// 关闭线程池
		threadPool.shutdown();
		threadPool = null;
		System.gc();
	}

猜你喜欢

转载自blog.csdn.net/m0_37739193/article/details/85266546