摘要:在任務被拒絕添加后,會調用當前線程池的所在的線程去執行被拒絕的任務。會讓被線程池拒絕的任務直接拋棄,不會拋異常也不會執行。
null.equals()
會出報空指針,因該是非null
的值.equals()
Objects
的equals()
方法避免空值,完美String strOne = null;String strTwo = null;boolean oneFlag = Objects.equals(strOne, strTwo);
equalsIgnoreCase()
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()
避免空指針,例如遍歷從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
流遍歷集合中的元素進行求和操作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);
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();
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();}
巧妙使用接口、抽象類
Java
設計模式請看:https://blog.csdn.net/qq_37248504/article/details/117753021
Java
工廠模式請看:https://blog.csdn.net/qq_37248504/article/details/117753021Spring
收集Bean
對象放到一個Map
中,從這個Map
中拿到相應的對象的實例,直接上代碼CustomerService.java
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();}
獲取容器中的Bean
、Bean
的初始化
更多詳情請看:https://blog.csdn.net/qq_37248504/article/details/113896952
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));
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()); })); }}
@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
社區版能滿足常用的開發,支持maven
、gradle
項目,真的沒有必要破解Idea
,哈哈哈哈哈哈哈哈。
使用特別Nice
基本上不用重啟服務,網上都有注冊碼。
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
,add()
List<String> listOne = new ArrayList
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/124441.html
摘要:鑒于目前大多數服務器環境都是,提前接觸能夠相輔相成。正則也是必須要掌握的一個知識點。有多種創建多線程的方式,不過目前使用線程池的多一些。 原創:小姐姐味道(微信公眾號ID:xjjdog),歡迎分享,轉載請保留出處。 你可能有所感悟。零散的資料讀了很多,但是很難有提升。到處是干貨,但是并沒什么用,簡單來說就是缺乏系統化。另外,噪音太多,雷同的框架一大把,我不至于全都要去學了吧。 這里,我...
摘要:強大的表單驗證前端掘金支持非常強大的內置表單驗證,以及。面向對象和面向過程的區別的種設計模式全解析后端掘金一設計模式的分類總體來說設計模式分為三大類創建型模式,共五種工廠方法模式抽象工廠模式單例模式建造者模式原型模式。 強大的 Angular 表單驗證 - 前端 - 掘金Angular 支持非常強大的內置表單驗證,maxlength、minlength、required 以及 patt...
閱讀 3216·2021-11-23 09:51
閱讀 3558·2021-11-09 09:46
閱讀 3654·2021-11-09 09:45
閱讀 2938·2019-08-29 17:31
閱讀 1860·2019-08-26 13:39
閱讀 2712·2019-08-26 12:12
閱讀 3614·2019-08-26 12:08
閱讀 2235·2019-08-26 11:31