Bootstrap

Java日常开发手册及学习路径

0.安装JDK

0.1 Windows安装JDK

JDK安装教程(有图详解)
JDK安装参考2

0.2 Mac安装JDK

[Mac安装JDK]

0.3 linux安装JDK

[Llinux安装JDK]

修改系统配置文件,可以达到永久改变环境变量的目的。修改某个配置文件后,在 Shell 下运行该文件即可使新的设置生效,或者重新登录使用新的变量。

运行文件可用source 文件的方式操作,例如:

source ~/.bash_profile
通常 修改 全局配置文件 /etc/profile 或者 用户配置文件 ~/.bashrc(有的发行版上为 ~/.bash_profile)

export JAVA_HOME=/usr/local/java/jdk1.8.0_161
export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib/
export PATH=$PATH:$JAVA_HOME/bin

export JAVA_HOME=/usr/local/jdk1.8.0_11      
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib:$CLASSPATH
export JAVA_PATH=${JAVA_HOME}/bin:${JRE_HOME}/bin
export PATH=$PATH:${JAVA_PATH}

1.常量定义

在这里插入图片描述

2.字符串拼接

字符串拼接的四种方式详解

StringBuffer清空操作效率分析

import java.util.HashSet;
import java.util.Set;

public class SetUdf extends ScalarFunction {

    private static final String SPLIT_SEPARATOR="@@@@";
    /**
     * @param content 字符串
     * @param array 字符串数组
     * @return 新的字符串数组
     */
    public String eval(String content, String array) {
        Set<String> set=new HashSet<String>();
        if(content != null && content.length() != 0){
            set.add(content);
        }
        if(array !=null && array.length() != 0 ){
            String[] arrayList = array.split(SPLIT_SEPARATOR);
            for(String ele:arrayList){
                set.add(ele);
            }
        }
        //并发请求下,使用线程安全的StringBuffer
        StringBuffer  sb = new StringBuffer();
        for(String str:set){
            sb.append(str).append(SPLIT_SEPARATOR);
        }
        String result="";
        if(sb != null && sb.length() !=0){
            result=sb.substring(0,sb.length()-SPLIT_SEPARATOR.length());
        }
        return result;
    }

    /**
     * @param array 字符串数组
     * @return 字符串数组长度
     */
    public int eval(String array) {
       if(array != null && array.length() != 0){
           return array.split(SPLIT_SEPARATOR).length;
       }else{
           return 0;
       }
    }
}

3.contains与matches的使用

contains中不需要转义\,否则会认为是字符串me\.baidu
matches中使用.,如果不使用转义,则表示匹配除换行符 \n 之外的任何单字符。要匹配 . ,请使用 \. 。

    System.out.println("/data/com.android.dualaid/packages//me.baidu".contains("me\\.baidu")); //false
    System.out.println("/data/com.android.dualaid/packages//me.baidu".contains("me.baidu")); //true
    System.out.println("/data/com.android.dualaid/packages//me.baidu".matches("me\\.baidu"));  //false
    System.out.println("/data/com.android.dualaid/packages//me.baidu".matches(".*me.baidu.*")); //true
    System.out.println("/data/com.android.dualaid/packages//me.baidu".matches(".*me\\.baidu.*")); //true

4.判断字符串字节长度

public class StringLengthbUdf extends ScalarFunction {

    /**
     * @param str
     * @return 字符串字节数
     */
    public long eval(String str,String encoding) {
        try {
            if(isNullOrEmpty(str))
                return 0L;
            else {
                long length = str.getBytes(encoding).length;
                //将大于131072B的字符串打印
                if(length>131072L){
                    System.out.println("字符串字节数大于131072b: "+str);
                }
                return length;
            }
        } catch (Exception e) {
            System.err.println("输入字符串为: "+str+"\n报错信息: "+e.getMessage());
            return -1L;
        }
    }

    public static boolean isNullOrEmpty(String str){
        return null == str || "".equals(str);
    }

}


参考
判断字符串长度 https://www.zhangshilong.cn/work/290157.html 
判断字符串长度 https://blog.csdn.net/n8790185/article/details/80257975

5.枚举类型的使用

public enum StatusCodeEnum {
    SUCCESS(200, "信息正确"),
    SYSTEM_ERROR(500, "系统异常"),
    PARAM_NULL(300, "参数为null"),
    GRAND_FAIL(301, "授权失败"),
    REMOVE_FAIL(302, "回收权限失败"),
    RETURN_NULL(303, "ACL返回为空"),
    GET_MAPPING_FAIL(304, "获取映射关系失败"),

    NEED_LOGIN(400, "需要登录"),
    GET_PERMISSION_CODE_ERROR(402, "获取授权码失败"),
    USER_NOT_EXIST(403, "用户表不存在该用户"),
    INSERT_FAIL(600, "插入数据库失败"),
    SAME_CATEGORY_NAME(601, "该目录下存在同名文件夹,请修改名称!"),
    HAVE_CHILD_CATEGORY(602, "该目录下存在子目录,不能删除!"),
    DELETE_FAIL(603, "删除失败"),
    HAVE_MODEL_MAPPING(604, "该目录下存在模型,不能删除!"),
    CAN_NOT_RENAME(605, "该文件夹非本人创建禁止重命名!"),
    CAN_NOT_DELETE(606, "该文件夹非本人创建禁止删除!"),
    NOT_EXIST_CATEGORY(607, "当前操作文件夹不存在!"),

    NO_PERMISSION(700, "权限不足"),
    ;

    private Integer code;

    private String desc;

    StatusCodeEnum(Integer code, String desc) {
        this.code = code;
        this.desc = desc;
    }

    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }

    public String getDesc() {
        return desc;
    }

    public void setDesc(String desc) {
        this.desc = desc;
    }

    public String getMsg() {
        return desc;
    }
}

   StatusCodeEnum.SUCCESS.getValue()

6.JSON构造

public class BuildJson extends ScalarFunction{

    /**
     * @param jsonKV
     * @return
     */
    public String eval(Object... jsonKV){
        int length = jsonKV.length;
        String jsonKey = String.valueOf(jsonKV[length - 1]);
        String[] jsonKeys = jsonKey.split(",");
        Map<String, String> jsonMap = new HashMap<String, String>();
        for (int i = 0; i < length-1; i++) {
            String key = String.valueOf(jsonKeys[i]).replace("\n", "").replace(" ","");
            String value = String.valueOf(jsonKV[i]);
            //key = key.toLowerCase();
            jsonMap.put(key,value);
        }
        String jsonString = JSONObject.toJSONString(jsonMap);
        return jsonString;

    }

7.[FastJson应用]JAVA对象与JSON互转

fastjson值java对象与JSON串互转

fastjson应用

8.解决包冲突

Maven冲突 omitted for conflict with 解决

9.判断空

	//使用String.valueof来进行类型转换时,一定要使用此判断str == "null" 
		 public static boolean isEmpty(String str) {
		        return str == null || str == "null" || str.trim().equals("");
		    }
		 public boolean isNotNull(String str){
    			return null != str && !"null".equals(str) && !"".equals(str) ;
    	}
  //未使用String.valueof来进行类型转换时,可使用下面方法判断空
		    public static boolean isNotEmpty(String str) {
		        return str != null && !str.trim().equals("");
		    }

注意使用String.valueof来进行类型转换时,会默认把null转为"null"字符串,判空可能会出现问题。

在这里插入图片描述

使用自带工具类包的方法StringUtils.isEmpty(),未使用String.valueof来进行类型转换时才可使用此方法

		<dependency>
			<groupId>org.apache.commons</groupId>
			<artifactId>commons-lang3</artifactId>
			<version>3.3.2</version>
		</dependency>

在这里插入图片描述

Java常用工具之StringUtils类

10.接口返回包装类

import com.alibaba.fastjson.JSONObject;

import java.util.HashMap;
import java.util.Map;

public class ResultUtil {

    public static <T> JSONObject ok(T data) {
        JSONObject res = new JSONObject();
        res.put("success",true);
        res.put("resultMessage","success");
        res.put("resultCode",200);
        res.put("data",data);
        Map<String,Object> extInfo = new HashMap<>();
        res.put("extInfo",extInfo);
        return res;
    }

    public static <T> JSONObject error(T errorMsg) {
        JSONObject res = new JSONObject();
        res.put("success",false);
        res.put("resultMessage",errorMsg);
        res.put("resultMsg",errorMsg);
        res.put("resultCode",500);
        res.put("data",null);
        Map<String,Object> extInfo = new HashMap<>();
        res.put("extInfo",extInfo);
        return res;
    }

    public static <T> JSONObject noAccess(T data) {
        JSONObject res = new JSONObject();
        res.put("success",false);
        res.put("resultMessage","无权限访问");
        res.put("resultMsg","无权限访问");
        res.put("resultCode",401);
        res.put("data",data);
        Map<String,Object> extInfo = new HashMap<>();
        res.put("extInfo",extInfo);
        return res;
    }

}

11.将数组字符串转数组

Java数组格式字符串转数组

12.java判断某个数值是否在一个数值区间内

java判断某个数值是否在一个数值区间内

package com.alsc.risk.udf.util;

import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;

/**判断某个值是否在某个区间工具类,返回booblean值
 */
public class IntervalUtil {

    /**
     * 判断data_value是否在interval区间范围内
     * @param data_value 数值类型的
     * @param interval 正常的数学区间,包括无穷大等,如:(1,3)、>5%、(-∞,6]、(125%,135%)U(70%,80%)
     * @return true:表示data_value在区间interval范围内,false:表示data_value不在区间interval范围内
     */
    public static boolean isInTheInterval(String data_value,String interval) {
        //将区间和data_value转化为可计算的表达式
        String formula = getFormulaByAllInterval(data_value,interval,"||");
        ScriptEngine jse = new ScriptEngineManager().getEngineByName("JavaScript");
        try {
            //计算表达式
            return (Boolean) jse.eval(formula);
        } catch (Exception t) {
            return false;
        }
    }

    /**
     * 将所有阀值区间转化为公式:如
     * [75,80)   =》                   date_value < 80 && date_value >= 75
     * (125%,135%)U(70%,80%)   =》     (date_value < 1.35 && date_value > 1.25) || (date_value < 0.8 && date_value > 0.7)
     * @param date_value
     * @param interval  形式如:(125%,135%)U(70%,80%)
     * @param connector 连接符 如:") || ("
     */
    private static String getFormulaByAllInterval(String date_value, String interval, String connector) {
        StringBuffer buff = new StringBuffer();
        for(String limit:interval.split("U")){//如:(125%,135%)U (70%,80%)
            buff.append("(").append(getFormulaByInterval(date_value, limit," && ")).append(")").append(connector);
        }
        String allLimitInvel = buff.toString();
        int index = allLimitInvel.lastIndexOf(connector);
        allLimitInvel = allLimitInvel.substring(0,index);
        return allLimitInvel;
    }

    /**
     * 将整个阀值区间转化为公式:如
     * 145)      =》         date_value < 145
     * [75,80)   =》        date_value < 80 && date_value >= 75
     * @param date_value
     * @param interval  形式如:145)、[75,80)
     * @param connector 连接符 如:&&
     */
    private static String getFormulaByInterval(String date_value, String interval, String connector) {
        StringBuffer buff = new StringBuffer();
        for(String halfInterval:interval.split(",")){//如:[75,80)、≥80
            buff.append(getFormulaByHalfInterval(halfInterval, date_value)).append(connector);
        }
        String limitInvel = buff.toString();
        int index = limitInvel.lastIndexOf(connector);
        limitInvel = limitInvel.substring(0,index);
        return limitInvel;
    }

    /**
     * 将半个阀值区间转化为公式:如
     * 145)      =》         date_value < 145
     * ≥80%      =》         date_value >= 0.8
     * [130      =》         date_value >= 130
     * <80%     =》         date_value < 0.8
     * @param halfInterval  形式如:145)、≥80%、[130、<80%
     * @param date_value
     * @return date_value < 145
     */
    private static String getFormulaByHalfInterval(String halfInterval, String date_value) {
        halfInterval = halfInterval.trim();
        if(halfInterval.contains("∞")){//包含无穷大则不需要公式
            return "1 == 1";
        }
        StringBuffer formula = new StringBuffer();
        String data = "";
        String opera = "";
        if(halfInterval.matches("^([<>≤≥\\[\\(]{1}(-?\\d+.?\\d*\\%?))$")){//表示判断方向(如>)在前面 如:≥80%
            opera = halfInterval.substring(0,1);
            data = halfInterval.substring(1);
        }else{//[130、145)
            opera = halfInterval.substring(halfInterval.length()-1);
            data = halfInterval.substring(0,halfInterval.length()-1);
        }
        double value = dealPercent(data);
        formula.append(date_value).append(" ").append(opera).append(" ").append(value);
        String a = formula.toString();
        //转化特定字符
        return a.replace("[", ">=").replace("(", ">").replace("]", "<=").replace(")", "<").replace("≤", "<=").replace("≥", ">=");
    }

    /**
     * 去除百分号,转为小数
     * @param str 可能含百分号的数字
     * @return
     */
    private static double dealPercent(String str){
        double d = 0.0;
        if(str.contains("%")){
            str = str.substring(0,str.length()-1);
            d = Double.parseDouble(str)/100;
        }else{
            d = Double.parseDouble(str);
        }
        return d;
    }

    public static void main(String[] args) {

        System.out.println(IntervalUtil.isInTheInterval("09", "[09,23]"));
        //返回true
    }
}

13.idea操作合集

《idea将文件夹设置为模块》

14.java.io.InvalidClassException的解决方法

《nvalidClassException的解决方法》
《Serializable是什么,为什么要实现Serializable接口?》

100.JAVA架构师学习路径

JAVA架构师学习路径

参考
《阿里巴巴 Java 开发手册》.PDF
链接:https://pan.baidu.com/s/1HSqwdSXOxmIoV3H-YSETHA
提取码:3zdm
字符串判空的常用方法
https://blog.csdn.net/FZUMRWANG/article/details/110185053
https://blog.csdn.net/qq_45246098/article/details/123017279
字符串拼接的4种常用方法
https://blog.csdn.net/qq_44705904/article/details/114581004
java删除字符串中最后一个字符
https://blog.csdn.net/Soraa/article/details/108441426

;