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

文章目录

          • 1.java三目判断运算:
          • 2.如何取得map里key得最大值:
          • 3.多线程写法样例:
          • 4.Java MD5加密:
          • 5.避免json对象串用:
          • 6.弃用API:
          • 7.处理json的时候尽量不使用org.codehaus.jettison包:
          • 8.Unicode格式的字符导致的数据问题:

1.java三目判断运算:

以后简单的判断可以直接用这个三目运算符,可以减少代码量让别人看的也会感觉你有经验

“(a 如:

int topCount=fields.containsKey("topCount") ? fields.get("topCount").value() : 1024;
	private String isrepeat(String userId,String subjectName) {
		Query query = new Query();
		query.addCriteria(new Criteria().and("userId").is(userId).and("subjectName").is(subjectName));
		List createSubjects = secondMongo.find(query, CreateSubject.class);
		return createSubjects.size() >= 1 ? "1":"0";
	}
2.如何取得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 map = new HashMap();
		map.put(1, 8);
		map.put(3, 53);
		map.put(5, 12);
		System.out.println(getMaxKey(map));
		System.out.println(getMaxValue(map));
	}

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

	/**
	 * 求Map中Value(值)的最大值
	 */
	public static Object getMaxValue(Map map) {
		if (map == null)
			return null;
		Collection 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 a=new HashSet();
// 等效于
HashSet b = new HashSet();

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

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 a = new HashSet();
		a.add(5);
		a.add(4);
		a.add(3);
		for(Integer n : a) {
			System.out.println(n);
		}
		Iterator it = a.iterator();
		while (it.hasNext()) {
			System.out.println(it.next());
		}
	}

 

3.多线程写法样例:
	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();
	}

 

4.Java MD5加密:

参考:https://www.cnblogs.com/maohuidong/p/7967257.html
导入maven依赖:

            
                org.apache.commons
                commons-lang3
                3.3.2
            

MD5使用代码:

import org.apache.commons.codec.digest.DigestUtils;

/**
 * MD5通用类
 * @author 浩令天下
 * @since 2017.04.15
 * @version 1.0.0_1
 */
public class BizCashSettingController {
	/**
	 * MD5方法
	 * @param text 明文
	 * @param key 密钥
	 * @return 密文
	 * @throws Exception
	 */
	public static String md5(String text, String key) throws Exception {
		// 加密后的字符串
		String encodeStr = DigestUtils.md5Hex(text + key);
		System.out.println("MD5加密后的字符串为:encodeStr=" + encodeStr);
		return encodeStr;
	}

	/**
	 * MD5验证方法
	 * @param text 明文
	 * @param key 密钥
	 * @param md5 密文
	 * @return true/false
	 * @throws Exception
	 */
	public static boolean verify(String text, String key, String md5) throws Exception {
		// 根据传入的密钥进行验证
		String md5Text = md5(text, key);
		if (md5Text.equalsIgnoreCase(md5)) {
			System.out.println("MD5验证通过");
			return true;
		}
		return false;
	}
}

 

5.避免json对象串用:
import net.sf.json.JSONObject;

public class haha{
	public static void main(String[] args){
		// 问题
		JSONObject aa = new JSONObject();
		aa.put("1", "a");
		JSONObject bb = aa;
		bb.put("2", "b");
		System.out.println(aa);
		
		// 解决
		JSONObject cc = new JSONObject();
		cc.put("1", "a");
		JSONObject dd = JSONObject.fromObject(cc.toString());
		dd.put("2", "b");
		System.out.println(cc);
	}
}

 

6.弃用API:

来自:https://www.cnblogs.com/IcanFixIt/p/7234054.html

import java.io.File;
/**
 * The class consists of static methods that can be used to
 * copy files and directories.
 *
 * @deprecated Deprecated since 1.4. Not safe to use. Use the
 * java.nio.file.Files class instead. This class
 * will be removed in a future release of this library.
 *
 * @since 1.2
 */
@Deprecated
public class FileCopier {
    // No direct instantiation supported.
    private FileCopier() {
    }
    /**
     * Copies the contents of src to dst.
     * @param src The source file
     * @param dst The destination file
     * @return true if the copy is successfully,
     * false otherwise.
     */
    public static boolean copy(File src, File dst) {
        // More code goes here
        return true;
    }
    // More methods go here
}

总结:
Java中的弃用是提供有关API生命周期的信息的一种方式。 弃用API会告诉用户迁移,因为API有使用的危险,更好的替换存在,否则将在以后的版本中被删除。 使用弃用的API会生成编译时弃用警告。

@deprecated Javadoc标签和@Deprecated注解一起用于弃用API元素,如模块,包,类型,构造函数,方法,字段,参数和局部变量。 在JDK 9之前,注解不包含任何元素。 它在运行时保留。

JDK 9为注解添加了两个元素:since和forRemoval。 since元素默认为空字符串。 其值表示弃用的API元素的API版本。forRemoval元素的类型为boolean,默认为false。 其值为true表示API元素将在以后的版本中被删除。

JDK 9编译器根据@Deprecated注解的forRemoval元素的值生成两种类型的弃用警告:forRemoval = false时为普通的弃用警告,forRemoval = true时为最终的删除警告。

在JDK 9之前,可以通过使用@SuppressWarnings(“deprecation”)注解标示已弃用的API的使用场景来抑制弃用警告。 在JDK 9中,需要使用@SuppressWarnings(“deprecation”)来抑制普通警告,@SuppressWarnings(“removal”)来抑制删除警告,而@SuppressWarnings({“deprecation”, “removal”}可以抑制两种类型的警告。

在JDK 9之前,使用import语句导入弃用的构造会生成编译时弃用警告。 JDK 9省略了这样的警告。
 

7.处理json的时候尽量不使用org.codehaus.jettison包:

今天遇到了个问题,就是传参是数组,咋么都强转不成List类型
传参:
在这里插入图片描述
使用处理org.codehaus.jettison处理:

List updateKey = (List) params.get("updateKey");

报错:

java.lang.ClassCastException: org.codehaus.jettison.json.JSONArray cannot be cast to java.util.List

后来替换成net.sf.json.JSONObject就不报错。。。
 

8.Unicode格式的字符导致的数据问题:

今天遇到了个神奇的问题,就是从前端传过来的参数去mongdb库中搜索却搜不到数据(mongdb库中有该数据),后来用手动输的就好使。

db.getCollection('newsKey').find({"medianame" : "人民网"})
db.getCollection('newsKey').find({"medianame" : "人民网"})

上面这两个语句上面那个能搜到相应的数据,而下面的却不可以,虽然你肉眼看这两个语句一模一样,但是你把鼠标移动到双引号和人之间,再按键盘上的←或→键,你会发现下面的语句得按两下才可以移动到“人”字的后面,而上面的语句按一下就可以了,这说明下面的语句双引号和人字中间存在某种字符却没有显示。我的解决方式是

System.out.println("人民网".length()); //打印结果是4,如果不存在那个隐藏字符的话打印结果应该是3
System.out.println("人民网".replaceAll("", "").length());

在替换方法里看的好像是空替换成了空,实则是将那个隐藏的Unicode字符替换成了空(将双引号和“人”字之间的东西Ctrl+C复制到替换方法里的第一个双引号中)。

你可能感兴趣的:(Java)