国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

# 后端開發技巧、常用規范

Eirunye / 3215人閱讀

摘要:在任務被拒絕添加后,會調用當前線程池的所在的線程去執行被拒絕的任務。會讓被線程池拒絕的任務直接拋棄,不會拋異常也不會執行。


開發技巧

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

創建 HashMap 指定初始化大小
public HashMap(int initialCapacity) {    this(initialCapacity, DEFAULT_LOAD_FACTOR);}
  • initialCapacity = (需要存儲的元素個數/負載因子)+1。負載因子默認為0.75

  • 當不指定HashMap的大小會發生多次擴容會影響效率。比如map中有1000個元素,至少要將容量設置為1000/0.75=1333+1=1334,如果不設置大小那么就會多次擴容,比較影響效率。

  • 當無法估計大小的時候,請設置為HashMap的默認大小16


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

通過Optional.ofNullable().orElse()避免空指針,例如遍歷從map中拿到的某個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 會報控指針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選擇默認數據
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流遍歷集合中的元素進行求和操作
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);}
  • 依賴
<dependency>    <groupId>com.google.guavagroupId>    <artifactId>guavaartifactId>    <version>31.0.1-jreversion>    <exclusions>        <exclusion>            <groupId>log4jgroupId>            <artifactId>log4jartifactId>        exclusion>    exclusions>dependency>

單例類或者工具類 添加私有構造方法
  • 工具類或者單例類提供私有的構造函數,沒有過多的功能,提供私有構造函數防止外部使用污染。

類變量(集合)應該在使用完成之后清空,避免內存泄漏
  • 應該及時銷毀沒用的對象,如果對象過大,虛擬機沒辦法垃圾回收的時候,有可能造成內存泄漏,所以使用完就清空.
private static final Map<String, Object> TABLE_COLUMN_MAP = new HashMap<>();// 清空集合TABLE_COLUMN_MAP.clear();

使用 ThreaadLocal 后需要釋放資源防止內存泄漏
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();}

巧妙使用設計模式

Spring 工廠模式的結合使用
public interface CustomerService {    /**     * 獲取用戶姓名     * @return     */    String getUserName();    /**     * 注冊     */    void registered();    /**     * 登錄     */    void login();}
  • 接口的實現類:需要收集的對象實例可以有很多個實例
@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注入、或者構造函數方式、或者從當前上下文中拿到接口的實例對象
@Componentpublic class CustomerFactory {    /**     * 對象 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 的實例     *     * @param type     * @return     */    public static CustomerService getInstance(String type) {        return OBJECT_MAP.get(type);    }}
  • 測試
/**  * Spring 工廠模式測試  */@Overridepublic void testFive() {    CustomerFactory.getInstance("CustomerOne").registered();    CustomerFactory.getInstance("CustomerTwo").registered();}

Spring、SpringBoot 經常使用技巧

Stream 流等操作時候使用方法的引用
  • 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 創建線程池
  • 使用 ThreadPoolExecutor創建線程池,使用線程,到處 new Thread() 沒有回收造成資源浪費,因該交給線程池去管理線程。
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 核數        int cpuNum = Runtime.getRuntime().availableProcessors();        // 最大數        int maxSize = 2 * cpuNum + 1;        /**         * 拒絕策略:當阻塞隊列和最大線程都用完之后         *         * AbortPolicy:ThreadPoolExecutor中默認的拒絕策略就是AbortPolicy。直接拋出異常。         * CallerRunsPolicy:在任務被拒絕添加后,會調用當前線程池的所在的線程去執行被拒絕的任務。         * DiscardPolicy:會讓被線程池拒絕的任務直接拋棄,不會拋異常也不會執行。         * DiscardOldestPolicy:當任務唄拒絕添加時,會拋棄任務隊列中最舊的任務也就是最先加入隊列的,再把這個新任務添加進去。         */        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() {        // 獲取當前cpu核數        int cpuNum = Runtime.getRuntime().availableProcessors();        ThreadPoolTaskExecutor poolExecutor = new ThreadPoolTaskExecutor();        poolExecutor.setCorePoolSize(cpuNum);        //配置最大線程數        poolExecutor.setMaxPoolSize(cpuNum * 2);        //配置隊列大小        poolExecutor.setQueueCapacity(300);        //線程存活時間        poolExecutor.setKeepAliveSeconds(60);        //配置線程池中的線程的名稱前綴        poolExecutor.setThreadNamePrefix("globalExecutor");        // CALLER_RUNS:不在新線程中執行任務,而是有調用者所在的線程來執行        poolExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());        //執行初始化        poolExecutor.initialize();        logger.info(LogConstant.FLAG);        logger.info(LogConstant.LOG_SUCCESS_PREFIX + "Spring 全局線程池初始化完成......");        logger.info(JSON.toJSONString(poolExecutor));        logger.info(LogConstant.FLAG);        return poolExecutor;    }}
  • 使用
/**  * 全局線程池配置測試  */@Async("globalExecutor")@Overridepublic void globalExecutorTest() {    logger.info("test thread!");}

Idea 熱部署插件:Jrebel
  • Idea社區版能滿足常用的開發,支持mavengradle項目,真的沒有必要破解Idea,哈哈哈哈哈哈哈哈。

  • 使用特別Nice基本上不用重啟服務,網上都有注冊碼。


初始化 Map
  • 慣例
Map<String, String> mapTwo = new HashMap<>();mapTwo.put("a", "b");mapTwo.put("c", "d");
  • java8新特性:雙括號初始化
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 初始化
  • 構造List,add()
List<String> listOne = new ArrayList
                 
               
              

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/124441.html

相關文章

  • 前端開發知識點整理

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

    Blackjun 評論0 收藏0
  • 前端開發知識點整理

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

    Sike 評論0 收藏0
  • 前端開發知識點整理

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

    tracy 評論0 收藏0
  • 必看!java后端,亮劍誅仙(最全知識點)

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

    陳江龍 評論0 收藏0
  • Java - 收藏集 - 掘金

    摘要:強大的表單驗證前端掘金支持非常強大的內置表單驗證,以及。面向對象和面向過程的區別的種設計模式全解析后端掘金一設計模式的分類總體來說設計模式分為三大類創建型模式,共五種工廠方法模式抽象工廠模式單例模式建造者模式原型模式。 強大的 Angular 表單驗證 - 前端 - 掘金Angular 支持非常強大的內置表單驗證,maxlength、minlength、required 以及 patt...

    XiNGRZ 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<