博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JAVA 常用的工具类总结
阅读量:6712 次
发布时间:2019-06-25

本文共 22949 字,大约阅读时间需要 76 分钟。

hot3.png

一、StringUtils类

import java.io.UnsupportedEncodingException;import java.math.BigDecimal;import java.util.HashMap;import java.util.Map;import java.util.Set;import java.util.TreeSet;import net.sf.json.JSONObject;import sun.misc.BASE64Decoder;/** * String工具 * 主要对 StringUtils 的一些方法进行重写,达到更方便的使用 * @author cai niao * */public class StringUtils extends org.apache.commons.lang.StringUtils{        /**     * 一次性判断多个或单个对象为空。     * @param objects     * @author cai niao     * @return 只要有一个元素为Blank,则返回true     */    public static boolean isBlank(Object...objects){        Boolean result = false ;        for (Object object : objects) {            if(object == null || "".equals(object.toString().trim())                     || "null".equals(object.toString().trim())                    || "[null]".equals(object.toString().trim())                    || "[]".equals(object.toString().trim())){                result = true ;                 break ;             }        }        return result ;     }    /**     * 一次性判断多个或单个对象不为空。     * @param objects     * @author zhou-baicheng     * @return 只要有一个元素不为Blank,则返回true     */    public static boolean isNotBlank(Object...objects){        return !isBlank(objects);    }       public static String checkNullToConvert(Object obj) {        return StringUtils.isBlank(obj) ? "" : obj.toString();    }    /**     * 判断一个字符串在数组中存在几个     * @param baseStr     * @param strings     * @return     */    public static int indexOf(String baseStr,String[] strings){                if(null == baseStr || baseStr.length() == 0 || null == strings)            return 0;                int i = 0;        for (String string : strings) {            boolean result = baseStr.equals(string);            i = result ? ++i : i;        }        return i ;    }    /**     * 判断一个字符串是否为JSONObject,是返回JSONObject,不是返回null     * @param args     * @return     */    public static net.sf.json.JSONObject isJSONObject(Object args) {        net.sf.json.JSONObject result = null ;                if(args instanceof net.sf.json.JSONObject){            return (net.sf.json.JSONObject)args;        }                if(isBlank(args)){            return result ;        }        try {            return net.sf.json.JSONObject.fromObject(args);        } catch (Exception e) {            return result ;        }    }        /**     * 判断一个字符串是否为JSONArray,是返回JSONArray,不是返回null     * @param args     * @return     */    public static net.sf.json.JSONArray isJSONArray(Object args) {                if(args instanceof net.sf.json.JSONArray){            return (net.sf.json.JSONArray)args;        }                net.sf.json.JSONArray result = null ;        if(isBlank(args)){            return result ;        }        try {            return net.sf.json.JSONArray.fromObject(args);        } catch (Exception e) {            return result ;        }    }    public static String trimToEmpty(Object str){      return (isBlank(str) ? "" : str.toString().trim());    }        /**     * 将 Strig  进行 BASE64 编码     * @param str [要编码的字符串]     * @param bf  [true|false,true:去掉结尾补充的'=',false:不做处理]     * @return     */    public static String getBASE64(String str,boolean...bf) {        if (StringUtils.isBlank(str)) return null;        String base64 = new sun.misc.BASE64Encoder().encode(str.getBytes()) ;       //去掉 '='       if(isBlank(bf) && bf[0]){           base64 = base64.replaceAll("=", "");       }       return base64;    }    /** 将 BASE64 编码的字符串 s 进行解码**/    public static String getStrByBASE64(String s) {        if (isBlank(s)) return "";        BASE64Decoder decoder = new BASE64Decoder();        try {           byte[] b = decoder.decodeBuffer(s);           return new String(b);        } catch (Exception e) {           return "";        }    }    /**     * 把Map转换成get请求参数类型,如 {"name"=20,"age"=30} 转换后变成 name=20&age=30     * @param map     * @return     */    public static String mapToGet(Map
 map){        String result = "" ;        if(map == null || map.size() ==0){            return result ;        }        Set
 keys = map.keySet();        for (Object key : keys ) {            result += ((String)key + "=" + (String)map.get(key) + "&");        }                return isBlank(result) ? result : result.substring(0,result.length() - 1);    }        /**     * 把一串参数字符串,转换成Map 如"?a=3&b=4" 转换为Map{a=3,b=4}     * @param args     * @return     */    public static Map
 getToMap(String args){        if(isBlank(args)){            return null ;        }        args = args.trim();        //如果是?开头,把?去掉        if(args.startsWith("?")){            args = args.substring(1,args.length());        }        String[] argsArray = args.split("&");                Map
 result = new HashMap
();        for (String ag : argsArray) {            if(!isBlank(ag) && ag.indexOf("=")>0){                                String[] keyValue = ag.split("=");                //如果value或者key值里包含 "="号,以第一个"="号为主 ,如  name=0=3  转换后,{"name":"0=3"}, 如果不满足需求,请勿修改,自行解决.                                    String key = keyValue[0];                String value = "" ;                for (int i = 1; i < keyValue.length; i++) {                    value += keyValue[i]  + "=";                }                value = value.length() > 0 ? value.substring(0,value.length()-1) : value ;                result.put(key,value);                            }        }                return result ;    }        /**     * 转换成Unicode     * @param str     * @return     */    public static String toUnicode(String str) {        String as[] = new String[str.length()];        String s1 = "";        for (int i = 0; i < str.length(); i++) {            as[i] = Integer.toHexString(str.charAt(i) & 0xffff);            s1 = s1 + "\\u" + as[i];        }        return s1;     }        public static String getDoubleTOString(Double str){        String money = str.toString();        try {               Double.parseDouble(money);        } catch (Exception e) {            BigDecimal bDecimal = new BigDecimal(str);            money = bDecimal.toPlainString();        }         return money;            }       /**     * 把数组转换成Set 方便判断     * @param objs     * @return     */    public static TreeSet
 arrayToSet(String[] objs){        TreeSet
 result = new TreeSet
();        if(null ==objs){            return result ;        }        for (String obj:objs) {            result.add(obj);        }        return result;    }        /**     * 字符串转urlcode     * @param value     * @return     */    public static String strToUrlcode(String value){        try {            value = java.net.URLEncoder.encode(value,"utf-8");            return value ;        } catch (UnsupportedEncodingException e) {            LoggerUtils.error(StringUtils.class, "字符串转换为URLCode失败,value:" + value,e);            e.printStackTrace();            return null;        }        }    /**     * urlcode转字符串     * @param value     * @return     */    public static String urlcodeToStr(String value){        try {            value = java.net.URLDecoder.decode(value,"utf-8");            return value ;        } catch (UnsupportedEncodingException e) {            LoggerUtils.error(StringUtils.class, "URLCode转换为字符串失败;value:" + value,e);            e.printStackTrace();            return null;        }      }        /**     * 设置JSON字符串返回     *      * @param key     * @param value     * @return     */    public static String setJsonString(String key, String value) {        if (StringUtils.isNotBlank(key, value)) {                    JSONObject goodsJson = new JSONObject();            goodsJson.put(key, value);            return goodsJson.toString();        }        return "";    }        /**     * 替换字符串     *      * @param str     * @param nowStr     * @param replaceStr     * @return     */    public static String replaceString(String str, String nowStr, String replaceStr) {        nowStr = StringUtils.isBlank(nowStr) ? "" : nowStr;        replaceStr = StringUtils.isBlank(replaceStr) ? "" : replaceStr;                if (StringUtils.isNotBlank(str)) {                    return str.replaceAll(nowStr, replaceStr);        }        return "";    }    }

二、DateUtils 类

import java.text.DateFormat;import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.ArrayList;import java.util.Calendar;import java.util.Collections;import java.util.Date;import java.util.GregorianCalendar;import java.util.List;import java.util.Locale;import net.sf.json.JSONObject;import org.apache.log4j.Logger;/** *  * 区分 责任人 日期    说明
 * 

 * 时间工具类 * 

 * @author  *  *  */public class DateUtils {        private static Logger log = Logger.getLogger(DateUtils.class);        /**当前毫秒值*/    public static long NOW_DATE_MIS =getNowTime();        /**根据方法获取**/    public static long getNowTime(){        return new Date().getTime();       }        /**     * 获取当前时间的年月日时分秒+时间戳后4位  如:20140620123456   18位     * @return     */    public static String ymdhms4(){        Date date = new Date();        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");        String s = sdf.format(date);        double a = Math.random() * 9000 + 1000;        int result = (int)a;        return s + result;    }    /**     * 把一个字符串时间转换为毫秒值  如 2014-12-12 12:12:12 转换为 1406086513619     * @param strDate     * @return     */    public static long str2DateTime(String strDate){        SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");        Date date = new Date();        try {            date = df.parse(strDate);        } catch (ParseException pe) {            pe.getStackTrace();        }        return date.getTime() ;    }    /**     * 把一个日期转换为指定的格式     */      public static Date str2Date(String strDate, String formater) {        if (strDate == null) {            return null;        }        if (formater == null) {            formater = "yyyy-MM-dd";        }        SimpleDateFormat df = new SimpleDateFormat(formater);        Date date = new Date();        try {            date = df.parse(strDate);        } catch (ParseException pe) {            pe.getStackTrace();        }        return date;    }            /**     * 获取最大毫秒值     * @param dateStr 2014-12-12 年-月-日 参数     * @return     */    public static Long getMaxMillsByYMD(String dateStr){        if(StringUtils.isBlank(dateStr)){            log.error("getTodayMaxMills error , message :param is empty");            return null;        }        dateStr = dateStr.trim() + " 23:59:59";        Date date = ymdHmsStr2Date(dateStr);        return date.getTime() ;    }    /**     * 获取最小毫秒值     * @param dateStr 2014-12-12 年月日参数     * @return     */    public static Long getMinxMillsByYMD(String dateStr){        if(StringUtils.isBlank(dateStr)){            log.error("getTodayMaxMills error , message :param is empty");            return null;        }        dateStr = dateStr.trim() + " 00:00:00";        Date date = ymdHmsStr2Date(dateStr);        return date.getTime() ;    }        public static String getNextMonth() {        Calendar c = Calendar.getInstance();        c.set(Calendar.DATE, 1);// 设为当前月的1号        c.add(Calendar.MONTH, 1);// 加一个月,变为下月的1号        return formaterDate(c.getTime(), "yyyy-MM");    }    public static String getPreviousMonth() {        Calendar c = Calendar.getInstance();        c.set(Calendar.DATE, 1);// 设为当前月的1号        c.add(Calendar.MONTH, -1);// 减一个月,变为上月的1号        return formaterDate(c.getTime(), "yyyy-MM");    }    public static String getMonth(String date,int num) {        Calendar c = Calendar.getInstance();        if(StringUtils.isNotEmpty(date)){            c.setTime(DateUtils.ymdStr2Date(date));        }        c.set(Calendar.DATE, 1);// 设为当前月的1号        c.add(Calendar.MONTH, num);// 减一个月,变为上月的1号        return formaterDate(c.getTime(), "yyyy-MM-dd");    }    /**    * 计算两个日期之间相差的月数    * @param date1    * @param date2    * @return    */    public static int getMonths(Date date1, Date date2) {       int iMonth = 0;        int flag = 0;        try {            Calendar objCalendarDate1 = Calendar.getInstance();            objCalendarDate1.setTime(date1);            Calendar objCalendarDate2 = Calendar.getInstance();            objCalendarDate2.setTime(date2);            if (objCalendarDate2.equals(objCalendarDate1))                return 0;            if (objCalendarDate1.after(objCalendarDate2)) {                Calendar temp = objCalendarDate1;                objCalendarDate1 = objCalendarDate2;                objCalendarDate2 = temp;            }            if (objCalendarDate2.get(Calendar.DAY_OF_MONTH) < objCalendarDate1                    .get(Calendar.DAY_OF_MONTH))                flag = 1;            if (objCalendarDate2.get(Calendar.YEAR) > objCalendarDate1                    .get(Calendar.YEAR))                iMonth = ((objCalendarDate2.get(Calendar.YEAR) - objCalendarDate1                        .get(Calendar.YEAR))                        * 12 + objCalendarDate2.get(Calendar.MONTH) - flag)                        - objCalendarDate1.get(Calendar.MONTH);            else                iMonth = objCalendarDate2.get(Calendar.MONTH) - objCalendarDate1.get(Calendar.MONTH) - flag;        } catch (Exception e) {            e.printStackTrace();        }        return iMonth;    }    @SuppressWarnings("unchecked")    public static List getMonthList(String startDate,String endDate){        if(StringUtils.isEmpty(startDate) || StringUtils.isEmpty(endDate)) {            return new ArrayList();        }        List

 dateList = new ArrayList
();        //得到两个日期之间有多少月        int num = getMonths(ymdStr2Date(startDate),ymdStr2Date(endDate));        Calendar c = Calendar.getInstance();        c.setTime(DateUtils.ymdStr2Date(startDate));        dateList.add(formaterDate(c.getTime(), "yyyy-MM"));        for(int i=0; i
 dateList = new ArrayList
();        Calendar calendar = Calendar.getInstance();        calendar.setTime(new Date());        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");        String tomorrow = sdf.format(calendar.getTime());        dateList.add(tomorrow);        for (int i = 0; i < 6; i++) {            calendar.set(6, calendar.get(6) + 1);            tomorrow = sdf.format(calendar.getTime());            dateList.add(tomorrow);        }        return dateList;    }        public static String getWeekStartDateString(String startDate) {        return getWeekDateString(startDate, 0);    }        public static String getWeekEndDateString(String endDate) {        return getWeekDateString(endDate, 6);    }        public static String getWeekDateString(String currentDate, int day) {        // 日历        Calendar calendar = new GregorianCalendar();        // 设置日历为当前时间        calendar.setTime(ymdStr2Date(currentDate));        // 得到今天是周几        int dayofweek = calendar.get(Calendar.DAY_OF_WEEK);        int weekofYear = calendar.get(Calendar.WEEK_OF_YEAR);        // 加入不是周日,设置日期到下一周        if (dayofweek == 1) {            calendar.set(Calendar.WEEK_OF_YEAR, weekofYear - 1);        }        int nextWeekDay = calendar.get(Calendar.DATE);        // 设置日历为下周第一天,+2是下周从星期一开始,星期一是每周的第2天        calendar.set(Calendar.DATE, nextWeekDay - dayofweek + 2);        calendar.add(Calendar.DATE, day);        return ymd(calendar.getTime());    }        public static Date[] getWeekStartAndEndDate(Date currentDate, int start) {        // 将要返回的日期        Date[] days = new Date[2];        if(null != currentDate){            // 日历            Calendar calendar = new GregorianCalendar();            // 设置日历为当前时间            calendar.setTime(currentDate);            // 得到今天是周几            int dayofweek = calendar.get(Calendar.DAY_OF_WEEK);            int weekofYear = calendar.get(Calendar.WEEK_OF_YEAR);            // 加入不是周日,设置日期到下一周            if (dayofweek == 1) {                calendar.set(Calendar.WEEK_OF_YEAR, weekofYear - 1);            }            // 得到当前是全年的第几周            int nextWeekDay = calendar.get(Calendar.DATE);            // 设置日历为下周第一天,+5是下周从星期四开始,星期四是每周的第5天            calendar.set(Calendar.DATE, nextWeekDay - dayofweek + 2);            calendar.add(Calendar.DATE, start);            days[0] = calendar.getTime();            days[0] = ymdHmsStr2Date(ymd(days[0]) + " 00:00:00");            calendar.add(Calendar.DATE, 6);            days[1] = calendar.getTime();            days[1] = ymdHmsStr2Date(ymd(days[1]) + " 23:59:59");        }        return days;    }        public static String[] getWeekStartAndEndDate(String currentDate, int start) {        // 将要返回的日期        String[] days = new String[2];        if(StringUtils.isEmpty(currentDate)){            return days;        }        // 日历        Calendar calendar = new GregorianCalendar();        // 设置日历为当前时间        calendar.setTime(ymdStr2Date(currentDate));        // 得到今天是周几        int dayofweek = calendar.get(Calendar.DAY_OF_WEEK);        int weekofYear = calendar.get(Calendar.WEEK_OF_YEAR);        // 加入不是周日,设置日期到下一周        if (dayofweek == 1) {            if(weekofYear == 1){                weekofYear = 53;            }            calendar.set(Calendar.WEEK_OF_YEAR, weekofYear - 1);        }        // 得到当前是全年的第几周        int nextWeekDay = calendar.get(Calendar.DATE);        calendar.set(Calendar.DATE, nextWeekDay - dayofweek + 2);        calendar.add(Calendar.DATE, start);        days[0] = ymd(calendar.getTime());        calendar.add(Calendar.DATE, 6);        days[1] = ymd(calendar.getTime());        return days;    }        public static String[] getThisWeekStartEndDays() {        return getWeekStartAndEndDate(ymd(new Date()), 0);    }        public static String[] getLastWeekStartEndDays() {        return getWeekStartAndEndDate(ymd(new Date()), -7);    }        public static String[] getNextWeekStartEndDays() {        return getWeekStartAndEndDate(ymd(new Date()), 7);    }    @SuppressWarnings("unchecked")    public static List getWeekDateList(String date) throws ParseException {        List
 dateList = new ArrayList
();        Calendar calendar = Calendar.getInstance();        SimpleDateFormat ymd = new SimpleDateFormat("yyyy-MM-dd");        Date dateVar = ymd.parse(date);        calendar.setTime(dateVar);        dateList.add(date);        for (int i = 1; i <= 6; i++) {            calendar.set(6, calendar.get(6) + 1);            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");            String tomorrow = sdf.format(calendar.getTime());            dateList.add(tomorrow);        }        return dateList;    }        public static String getNextDay(String currentDate) {        Date d = ymdStr2Date(currentDate);        Calendar c = Calendar.getInstance();        c.setTime(d);        c.set(Calendar.DAY_OF_YEAR, c.get(Calendar.DAY_OF_YEAR) + 1);        return ymd(c.getTime());    }        /**     * 获得开始时间和结束时间之间的时间列表     * @param startDate     * @param endDate     * @return List
     * @throws ParseException     */    @SuppressWarnings("unchecked")    public static List getDateList(String startDate, String endDate) throws ParseException {        List
 dateList = new ArrayList
();        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd", Locale.ENGLISH); // 设定格式        Date start = dateFormat.parse(startDate);        Date end = dateFormat.parse(endDate);        long day = ((end.getTime() - start.getTime()) / 1000);// 秒数        day = day / (60 * 60 * 24); // 天数        for (int i = 0; i <= day; i++) {            String date = getAfterSomeDayYms(startDate, i);            dateList.add(date);        }        return dateList;    }            /**     * 判断所给时间在月的第几周     * @param date 输入时间     * @return 第几周     */    public static int weekOfMonth(String date) {        Date d = ymdStr2Date(date);        Calendar c = Calendar.getInstance();        c.setTime(d);        return c.get(Calendar.WEEK_OF_MONTH);    }        /**     * 获取当前星期几     */    public static int weekDay(String date) {        Date d = ymdStr2Date(date);        Calendar c = Calendar.getInstance();        c.setTime(d);        c.setFirstDayOfWeek(Calendar.SUNDAY);        return c.get(Calendar.DAY_OF_WEEK)-1; }    /**     * 返回日期date 前推beforHour小时后的 日期     * @param date     * @param beforHour     * @return     */    public static Date getBeforHourDate(Date date, int beforHour){                if(date != null){            Calendar c = Calendar.getInstance();            c.setTime(date);            c.set(Calendar.HOUR, c.get(Calendar.HOUR)-beforHour);                        return c.getTime();        }        return null;    }        /**     * 取给定日期的前一天     * @param date     * @return     */    public static Date getLastDay(Date date){        Calendar calendar = Calendar.getInstance();        calendar.setTime(date);        calendar.set(Calendar.DAY_OF_YEAR,                calendar.get(Calendar.DAY_OF_YEAR) - 1);        return calendar.getTime();    }        /**     * 返回两时间的相差天数     * @param d1     * @param d2     * @return     */    public static int getDayNumBetween2Date(Date d1, Date d2){                  if(isEqualsInYMD(d1, d2)){            return 0;        }                long l = d2.getTime()-d1.getTime();           int day = (int) (l/(24*60*60*1000));        if(day < 0){            day = (-day);        }                int m = (int) (l%(24*60*60*1000));        Calendar c = Calendar.getInstance();        if(d1.compareTo(d2)<=0){            c.setTime(d1);            c.add(Calendar.MILLISECOND, m);            if(isEqualsInYMD(d1, c.getTime())){                return day;            }else{                return day+1;            }        }else{            c.setTime(d2);            c.add(Calendar.MILLISECOND, m);            if(isEqualsInYMD(d2, c.getTime())){                return day;            }else{                return day+1;            }        }            }        /**     * 两个时间是否是 同年 同月 同日     * 如果是,则返回true,否则返回false     * @param d1     * @param d2     * @return     */    public static boolean isEqualsInYMD(Date d1, Date d2){                Calendar c = Calendar.getInstance();                c.setTime(d1);        int year1 = c.get(Calendar.YEAR);        int dayOfYear1 = c.get(Calendar.DAY_OF_YEAR);                c.setTime(d2);        int year2 = c.get(Calendar.YEAR);        int dayOfYear2 = c.get(Calendar.DAY_OF_YEAR);                if(year1 != year2){            return false;        }        if(dayOfYear1 != dayOfYear2){            return false;        }                return true;    }        /**     * 获得当前月的前 i 个月     * @param i (henrry)     * return 月的数组     */    public static String[] getMonthArr(int i){        String arr[] = new String[i];        Calendar c = Calendar.getInstance();        int temp = 0;        int tempp = 0;        int year = 0;        int month = 0;        int m = i-1;        for(int j=0;j
12){                temp = (i-1)/12;                tempp = (i-1)%12;                year  = c.get(Calendar.YEAR)-temp;                month = c.get(Calendar.MONTH)-tempp+1;                if(month<10 && month >0){                    arr[j] = year+"-0"+month;                }else if(month<0){                    month = 12+month;                    if(month<10){                        arr[j] = (year-1)+"-0"+month;                    }else{                        arr[j] = (year-1)+"-"+month;                    }                }else if(month == 0){                    arr[j] = (year-1)+"-"+12;                }else{                    arr[j] = year+"-"+month;                }            }else{                year  = c.get(Calendar.YEAR);                month = c.get(Calendar.MONTH)-i+2;                if(month<10 && month >0){                    arr[j] = year+"-0"+month;                }else if(month<0){                    month = 12+month;                    if(month<10){                        arr[j] = (year-1)+"-0"+month;                    }else{                        arr[j] = (year-1)+"-"+month;                    }                }else if(month==0){                    arr[j] = (year-1)+"-"+12;                }else{                    arr[j] = year+"-"+month;                }            }            i--;        }        int monthNow = c.get(Calendar.MONTH);        if(monthNow>8){            arr[m] = c.get(Calendar.YEAR) + "-" + (c.get(Calendar.MONTH)+1);        }else{            arr[m] = c.get(Calendar.YEAR) + "-0" + (c.get(Calendar.MONTH)+1);        }        return arr;    }      /**     * 得到两个时间之间的差距,根据type可返回分别以天,时,分为单位的整数     * @param d1     * @param d2     * @param type     * @return     */    public static int getBetweenDateGap(Date d1, Date d2, String type){        long time1 = d1.getTime();        long time2 = d2.getTime();        long m = (time1-time2)/1000;        int nDay = (int)m/(24*60*60);              int nHour = (int)(m-nDay*24*60*60)/(60*60);        int nMinute = (int)(m-nDay*24*60*60-nHour*60*60)/60;        int mSecond = (int)(m-nDay*24*60*60-nHour*60*60);        if("day".equals(type)){            return nDay;        }else if("minute".equals(type)){            return nMinute;        }else if("hour".equals(type)){            return nHour;        }else if("second".equals(type)){            return mSecond;        }        return nMinute;    }    /**     * *     * 通过月份计算季度 *     * @param     * month *     * @return     */    public static int getQuarter(int month) {        if (month < 1 || month > 12) {            throw new IllegalArgumentException("month is invalid.");        }        return (month - 1) / 3 + 1;    }}

转载于:https://my.oschina.net/u/1453975/blog/529521

你可能感兴趣的文章
Spring AOP 问与答
查看>>
[书目20161229]老板,千万不要把企业做得太大
查看>>
【Network】OVS、VXLAN/GRE、OVN等 实现 Docker/Kubernetes 网络的多租户隔离
查看>>
MySQL DML 整理
查看>>
GitHub上那些值得一试的JAVA开源库
查看>>
数据库被黑后留下的数据
查看>>
mongodb分片介绍—— 基于范围(数值型)的分片 或者 基于哈希的分片
查看>>
mac home/end/pageup/pageDown
查看>>
SpringMVC拦截器和过滤器
查看>>
python函数式编程
查看>>
chart 数据 图表插件
查看>>
MySQL 5.6.20-4 and Oracle Linux DTrace
查看>>
Python学习--15 日期和时间
查看>>
怎么理解impala(impala工作原理是什么)
查看>>
ES doc_values的来源,field data——就是doc->terms的正向索引啊,不过它是在查询阶段通过读取倒排索引loading segments放在内存而得到的?...
查看>>
关于Linux虚拟化技术KVM的科普 科普三(From OenHan)
查看>>
19:字符串移位包含问题
查看>>
怎么部署 .NET Core Web项目 到linux
查看>>
jQuery学习目录
查看>>
CURL详解
查看>>