摘要:在任务被拒绝添加后,会调用当前线程池的所在的线程去执行被拒绝的任务。会让被线程池拒绝的任务直接抛弃,不会抛异常也不会执行。
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
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/124441.html
摘要:鉴于目前大多数服务器环境都是,提前接触能够相辅相成。正则也是必须要掌握的一个知识点。有多种创建多线程的方式,不过目前使用线程池的多一些。 原创:小姐姐味道(微信公众号ID:xjjdog),欢迎分享,转载请保留出处。 你可能有所感悟。零散的资料读了很多,但是很难有提升。到处是干货,但是并没什么用,简单来说就是缺乏系统化。另外,噪音太多,雷同的框架一大把,我不至于全都要去学了吧。 这里,我...
摘要:强大的表单验证前端掘金支持非常强大的内置表单验证,以及。面向对象和面向过程的区别的种设计模式全解析后端掘金一设计模式的分类总体来说设计模式分为三大类创建型模式,共五种工厂方法模式抽象工厂模式单例模式建造者模式原型模式。 强大的 Angular 表单验证 - 前端 - 掘金Angular 支持非常强大的内置表单验证,maxlength、minlength、required 以及 patt...
阅读 3185·2021-11-23 09:51
阅读 3539·2021-11-09 09:46
阅读 3558·2021-11-09 09:45
阅读 2919·2019-08-29 17:31
阅读 1797·2019-08-26 13:39
阅读 2690·2019-08-26 12:12
阅读 3567·2019-08-26 12:08
阅读 2174·2019-08-26 11:31