成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

# 后端開(kāi)發(fā)技巧、常用規(guī)范

Eirunye / 3250人閱讀

摘要:在任務(wù)被拒絕添加后,會(huì)調(diào)用當(dāng)前線程池的所在的線程去執(zhí)行被拒絕的任務(wù)。會(huì)讓被線程池拒絕的任務(wù)直接拋棄,不會(huì)拋異常也不會(huì)執(zhí)行。


開(kāi)發(fā)技巧

equals() 方法的使用
  • null.equals()會(huì)出報(bào)空指針,因該是非null的值.equals()
  • 可以使用Objectsequals()方法避免空值,完美
String strOne = null;String strTwo = null;boolean oneFlag = Objects.equals(strOne, strTwo);
  • 忽略大小寫(xiě):equalsIgnoreCase()

創(chuàng)建 HashMap 指定初始化大小
public HashMap(int initialCapacity) {    this(initialCapacity, DEFAULT_LOAD_FACTOR);}
  • initialCapacity = (需要存儲(chǔ)的元素個(gè)數(shù)/負(fù)載因子)+1。負(fù)載因子默認(rèn)為0.75

  • 當(dāng)不指定HashMap的大小會(huì)發(fā)生多次擴(kuò)容會(huì)影響效率。比如map中有1000個(gè)元素,至少要將容量設(shè)置為1000/0.75=1333+1=1334,如果不設(shè)置大小那么就會(huì)多次擴(kuò)容,比較影響效率。

  • 當(dāng)無(wú)法估計(jì)大小的時(shí)候,請(qǐng)?jiān)O(shè)置為HashMap的默認(rèn)大小16


Optional.ofNullable().orElse() 避免空指針

通過(guò)Optional.ofNullable().orElse()避免空指針,例如遍歷從map中拿到的某個(gè)list,原始代碼如下:

Map<String,Object> map = new HashMap<>(16);map.put("list",null);List<Map<String ,Object>> list = (List<Map<String, Object>>) map.get("list");// list 會(huì)報(bào)控指針for (Map<String, Object> item : list) {    logger.info(String.valueOf(item));}
  • 使用Optional 完美解決
Map<String,Object> map = new HashMap<>(16);map.put("list",null);List<Map<String ,Object>> list = Optional.ofNullable((List < Map < String, Object >> ) map.get("list")).orElse(new ArrayList<>());for (Map<String, Object> item : list) {    logger.info(String.valueOf(item));}
  • 使用Optional選擇默認(rèn)數(shù)據(jù)
User user1 = new User(1, "張三", "西安");User user2 = new User(2, "李四", "新疆");user1 = null;User user = Optional.ofNullable(user1).orElseGet(() -> user2);logger.info(user.toString());

Stream 求和
  • 使用 Stream流遍歷集合中的元素進(jìn)行求和操作
List<Double> doubleList = Arrays.asList(12.2, 13.45, 12.4);double sumOne = doubleList.stream().mapToDouble(x -> x).sum();logger.info("sumOne:{}", sumOne);List<BigDecimal> decimalList = new ArrayList<>();decimalList.add(new BigDecimal("12.3"));decimalList.add(new BigDecimal("12.3"));decimalList.add(new BigDecimal("12.3"));BigDecimal bigDecimal = decimalList.stream().reduce(BigDecimal.ZERO, BigDecimal::add);logger.info("bigDecimal:{}", bigDecimal.floatValue());logger.info("bigDecimal:{}", bigDecimal.doubleValue());List<Object> objectList = Arrays.asList(12, 13, 1);int sum = objectList.stream().mapToInt(x -> (int) x).sum();logger.info("sum:{}", sum);

List 切割工具
  • Lists.partition()
for (List<DataDto> dataDtos : Lists.partition(list, 1000)) {    dataDtoMapper.insertBatch(dataDtos);}
  • 依賴(lài)
<dependency>    <groupId>com.google.guavagroupId>    <artifactId>guavaartifactId>    <version>31.0.1-jreversion>    <exclusions>        <exclusion>            <groupId>log4jgroupId>            <artifactId>log4jartifactId>        exclusion>    exclusions>dependency>

單例類(lèi)或者工具類(lèi) 添加私有構(gòu)造方法
  • 工具類(lèi)或者單例類(lèi)提供私有的構(gòu)造函數(shù),沒(méi)有過(guò)多的功能,提供私有構(gòu)造函數(shù)防止外部使用污染。

類(lèi)變量(集合)應(yīng)該在使用完成之后清空,避免內(nèi)存泄漏
  • 應(yīng)該及時(shí)銷(xiāo)毀沒(méi)用的對(duì)象,如果對(duì)象過(guò)大,虛擬機(jī)沒(méi)辦法垃圾回收的時(shí)候,有可能造成內(nèi)存泄漏,所以使用完就清空.
private static final Map<String, Object> TABLE_COLUMN_MAP = new HashMap<>();// 清空集合TABLE_COLUMN_MAP.clear();

使用 ThreaadLocal 后需要釋放資源防止內(nèi)存泄漏
private ThreadLocal<Map<String, String>> threadLocalMap = new ThreadLocal<>();@Testpublic void test1() {    Map<String, String> map = new HashMap<>();    map.put("test1", "張三");    map.put("test2", "李四");    threadLocalMap.set(map);    getThreadLocalMap();    threadLocalMap.remove();}

巧妙使用設(shè)計(jì)模式

Spring 工廠模式的結(jié)合使用
public interface CustomerService {    /**     * 獲取用戶(hù)姓名     * @return     */    String getUserName();    /**     * 注冊(cè)     */    void registered();    /**     * 登錄     */    void login();}
  • 接口的實(shí)現(xiàn)類(lèi):需要收集的對(duì)象實(shí)例可以有很多個(gè)實(shí)例
@Servicepublic class CustomerServiceOneImpl implements CustomerService {    @Override    public String getUserName() {        return "CustomerOne";    }    @Override    public void registered() {    }    @Override    public void login() {    }}@Servicepublic class CustomerServiceTwoImpl implements CustomerService {    @Override    public String getUserName() {        return "CustomerTwo";    }    @Override    public void registered() {    }    @Override    public void login() {    }}
  • 工廠方法:可以使用set注入、或者構(gòu)造函數(shù)方式、或者從當(dāng)前上下文中拿到接口的實(shí)例對(duì)象
@Componentpublic class CustomerFactory {    /**     * 對(duì)象 Map     */    private static final Map<String, CustomerService> OBJECT_MAP = new HashMap<>();    /**     * set 方法注入     *     * @param customerService     */    @Autowired    private void setObjectMap(List<CustomerService> customerService) {        for (CustomerService service : customerService) {            OBJECT_MAP.put(service.getUserName(), service);        }    }    /**     * 獲取 CustomerService 的實(shí)例     *     * @param type     * @return     */    public static CustomerService getInstance(String type) {        return OBJECT_MAP.get(type);    }}
  • 測(cè)試
/**  * Spring 工廠模式測(cè)試  */@Overridepublic void testFive() {    CustomerFactory.getInstance("CustomerOne").registered();    CustomerFactory.getInstance("CustomerTwo").registered();}

Spring、SpringBoot 經(jīng)常使用技巧

Stream 流等操作時(shí)候使用方法的引用
  • Stream
List<String> collect = list.stream().filter("lisi"::equals).map(String::toUpperCase).collect(Collectors.toList());collect.forEach(System.out::println);list.removeIf("李四"::equals);
  • HashMap
Map<String, String> map = new HashMap<String, String>() {{    put("one", "one");    put("two", "one");    put("three", "one");}};Map<String, String> mapOne = new HashMap<>();map.forEach(mapOne::put);logger.info(String.valueOf(mapOne));

Java 創(chuàng)建線程池
  • 使用 ThreadPoolExecutor創(chuàng)建線程池,使用線程,到處 new Thread() 沒(méi)有回收造成資源浪費(fèi),因該交給線程池去管理線程。
public class ThreadPooTest {    private static final Logger logger = LoggerFactory.getLogger(ThreadPooTest.class);    private static final long THREAD_TIME_OUT = 60;    @Test    public void test() {        // Cpu 核數(shù)        int cpuNum = Runtime.getRuntime().availableProcessors();        // 最大數(shù)        int maxSize = 2 * cpuNum + 1;        /**         * 拒絕策略:當(dāng)阻塞隊(duì)列和最大線程都用完之后         *         * AbortPolicy:ThreadPoolExecutor中默認(rèn)的拒絕策略就是AbortPolicy。直接拋出異常。         * CallerRunsPolicy:在任務(wù)被拒絕添加后,會(huì)調(diào)用當(dāng)前線程池的所在的線程去執(zhí)行被拒絕的任務(wù)。         * DiscardPolicy:會(huì)讓被線程池拒絕的任務(wù)直接拋棄,不會(huì)拋異常也不會(huì)執(zhí)行。         * DiscardOldestPolicy:當(dāng)任務(wù)唄拒絕添加時(shí),會(huì)拋棄任務(wù)隊(duì)列中最舊的任務(wù)也就是最先加入隊(duì)列的,再把這個(gè)新任務(wù)添加進(jìn)去。         */        ThreadPoolExecutor poolExecutor = new ThreadPoolExecutor(cpuNum,                maxSize,                THREAD_TIME_OUT,                TimeUnit.SECONDS,                new ArrayBlockingQueue<>(20),                Executors.defaultThreadFactory(),                new ThreadPoolExecutor.AbortPolicy()        );        poolExecutor.execute(new Thread(() -> {            logger.info(Thread.currentThread().toString());        }));    }}

Spring Boot 配置全局的線程池
@Configuration@EnableAsyncpublic class ThreadPoolConfig {    private static final Logger logger = LoggerFactory.getLogger(ThreadPoolConfig.class);    @Bean    public Executor globalExecutor() {        // 獲取當(dāng)前cpu核數(shù)        int cpuNum = Runtime.getRuntime().availableProcessors();        ThreadPoolTaskExecutor poolExecutor = new ThreadPoolTaskExecutor();        poolExecutor.setCorePoolSize(cpuNum);        //配置最大線程數(shù)        poolExecutor.setMaxPoolSize(cpuNum * 2);        //配置隊(duì)列大小        poolExecutor.setQueueCapacity(300);        //線程存活時(shí)間        poolExecutor.setKeepAliveSeconds(60);        //配置線程池中的線程的名稱(chēng)前綴        poolExecutor.setThreadNamePrefix("globalExecutor");        // CALLER_RUNS:不在新線程中執(zhí)行任務(wù),而是有調(diào)用者所在的線程來(lái)執(zhí)行        poolExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());        //執(zhí)行初始化        poolExecutor.initialize();        logger.info(LogConstant.FLAG);        logger.info(LogConstant.LOG_SUCCESS_PREFIX + "Spring 全局線程池初始化完成......");        logger.info(JSON.toJSONString(poolExecutor));        logger.info(LogConstant.FLAG);        return poolExecutor;    }}
  • 使用
/**  * 全局線程池配置測(cè)試  */@Async("globalExecutor")@Overridepublic void globalExecutorTest() {    logger.info("test thread!");}

Idea 熱部署插件:Jrebel
  • Idea社區(qū)版能滿(mǎn)足常用的開(kāi)發(fā),支持maven、gradle項(xiàng)目,真的沒(méi)有必要破解Idea,哈哈哈哈哈哈哈哈。

  • 使用特別Nice基本上不用重啟服務(wù),網(wǎng)上都有注冊(cè)碼。


初始化 Map
  • 慣例
Map<String, String> mapTwo = new HashMap<>();mapTwo.put("a", "b");mapTwo.put("c", "d");
  • java8新特性:雙括號(hào)初始化
Map<String, String> mapOne = new HashMap<String, String>() {    {        put("one", "testOne");        put("two", "testTwo");        put("three", "testThree");    }};
  • com.google.guava中的方法
ImmutableMap<String, Integer> map = ImmutableMap.of("a", 1, "b", 2, "c", 3);logger.info(String.valueOf(map));

List 初始化
  • 構(gòu)造List,add()
List<String> listOne = new ArrayList
                 
               
              

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/124441.html

相關(guān)文章

  • 前端開(kāi)發(fā)知識(shí)點(diǎn)整理

    摘要:前言本文主要是有關(guān)前端方面知識(shí)按照目前的認(rèn)知進(jìn)行的收集歸類(lèi)概括和整理,涵蓋前端理論與前端實(shí)踐兩方面。 前言:本文主要是有關(guān)前端方面知識(shí)按照 XX 目前的認(rèn)知進(jìn)行的收集、歸類(lèi)、概括和整理,涵蓋『前端理論』與『前端實(shí)踐』兩方面。本文會(huì)告訴你前端需要了解的知識(shí)大致有什么,看上去有很多,但具體你要學(xué)什么,還是要 follow your heart & follow your BOSS。 初衷...

    Blackjun 評(píng)論0 收藏0
  • 前端開(kāi)發(fā)知識(shí)點(diǎn)整理

    摘要:前言本文主要是有關(guān)前端方面知識(shí)按照目前的認(rèn)知進(jìn)行的收集歸類(lèi)概括和整理,涵蓋前端理論與前端實(shí)踐兩方面。 前言:本文主要是有關(guān)前端方面知識(shí)按照 XX 目前的認(rèn)知進(jìn)行的收集、歸類(lèi)、概括和整理,涵蓋『前端理論』與『前端實(shí)踐』兩方面。本文會(huì)告訴你前端需要了解的知識(shí)大致有什么,看上去有很多,但具體你要學(xué)什么,還是要 follow your heart & follow your BOSS。 初衷...

    Sike 評(píng)論0 收藏0
  • 前端開(kāi)發(fā)知識(shí)點(diǎn)整理

    摘要:前言本文主要是有關(guān)前端方面知識(shí)按照目前的認(rèn)知進(jìn)行的收集歸類(lèi)概括和整理,涵蓋前端理論與前端實(shí)踐兩方面。 前言:本文主要是有關(guān)前端方面知識(shí)按照 XX 目前的認(rèn)知進(jìn)行的收集、歸類(lèi)、概括和整理,涵蓋『前端理論』與『前端實(shí)踐』兩方面。本文會(huì)告訴你前端需要了解的知識(shí)大致有什么,看上去有很多,但具體你要學(xué)什么,還是要 follow your heart & follow your BOSS。 初衷...

    tracy 評(píng)論0 收藏0
  • 必看!java后端,亮劍誅仙(最全知識(shí)點(diǎn))

    摘要:鑒于目前大多數(shù)服務(wù)器環(huán)境都是,提前接觸能夠相輔相成。正則也是必須要掌握的一個(gè)知識(shí)點(diǎn)。有多種創(chuàng)建多線程的方式,不過(guò)目前使用線程池的多一些。 原創(chuàng):小姐姐味道(微信公眾號(hào)ID:xjjdog),歡迎分享,轉(zhuǎn)載請(qǐng)保留出處。 你可能有所感悟。零散的資料讀了很多,但是很難有提升。到處是干貨,但是并沒(méi)什么用,簡(jiǎn)單來(lái)說(shuō)就是缺乏系統(tǒng)化。另外,噪音太多,雷同的框架一大把,我不至于全都要去學(xué)了吧。 這里,我...

    陳江龍 評(píng)論0 收藏0
  • Java - 收藏集 - 掘金

    摘要:強(qiáng)大的表單驗(yàn)證前端掘金支持非常強(qiáng)大的內(nèi)置表單驗(yàn)證,以及。面向?qū)ο蠛兔嫦蜻^(guò)程的區(qū)別的種設(shè)計(jì)模式全解析后端掘金一設(shè)計(jì)模式的分類(lèi)總體來(lái)說(shuō)設(shè)計(jì)模式分為三大類(lèi)創(chuàng)建型模式,共五種工廠方法模式抽象工廠模式單例模式建造者模式原型模式。 強(qiáng)大的 Angular 表單驗(yàn)證 - 前端 - 掘金Angular 支持非常強(qiáng)大的內(nèi)置表單驗(yàn)證,maxlength、minlength、required 以及 patt...

    XiNGRZ 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<