ArrayList和List<String>+字符串是否“都为数字”“包含数字”“截取数字”+count()+mockito+easyExcel简单使用+其他记录=11/23~27

目录

一、ArrayList list = new ArrayList() 和List list = new ArrayList() 的区别??
二、java中判断一个字符串是否“都为数字”和“是否包含数字”和“截取数字”
三、count(*)和count(1)和count(列名)的区别
四、mockito
五、easyExcel导入导出
六、其他记录

一、ArrayList list = new ArrayList() 和List list = new ArrayList() 的区别??

第一种形式用当前类作为引用类型,bai那么可以访问到ArrayList这个类中的所有公用方法。第二种形式,用ArrayList实现的接口List作为引用类型,那么通过list引用可以访问到接口中定义的方法。也就是说ArrayList这个类实现了List接口,除了要必须实现接口List中声明的方法外,还可以实现额外的一些方法。但是,第二种形式就无法调用的List接口以外的方法
使用上,设计模式中有:“代码尽量依赖于抽象,不依赖于具体”。第一种形式就是依赖具体,第二种形式就是依赖于抽象。因为List是接口。代码依赖于抽象的好处是,代码可以方便替换。例如,代码List list = new ArrayList();下面通过list来操作集合。代码编写后发现集合使用的不准确,应该使用LinkedList,那么只要修改一行代码List list = new LinkedList();就可以,这行以后的代码不需要修改,因为List接口保证了调用的都是接口中的方法,而ArrayList与LinkedList都实现了List接口。而如果当时用ArrayList list = new ArrayList()这种形式的话,那么list访问到的就可能是ArrayList里独有的方法而非List接口中的方法。这样替换成LinkedList的时候就有可能需要修改很多的代码。

参考:ArrayList list = new ArrayList() 和List list = new ArrayList() 的区别
另:list集合为空或为null的区别

二、java中判断一个字符串是否“都为数字”和“是否包含数字”和“截取数字”

需要判断某个字符串是否为数字。我用的是第二种,正则表达式:

public static boolean isNumeric(String str){ 
   for (int i = str.length();--i>=0;){   
    if (!Character.isDigit(str.charAt(i))){ 
     return false; 
    } 
   } 
   return true; 
 } 
 
 2用正则表达式 
 public static boolean isNumeric(String str){ 
     Pattern pattern = Pattern.compile("[0-9]*"); 
     return pattern.matcher(str).matches();    
 } 
 
 3用ascii码 
 
 public static boolean isNumeric(String str){ 
    for(int i=str.length();--i>=0;){ 
       int chr=str.charAt(i); 
       if(chr<48 || chr>57) 
          return false; 
    } 
    return true; 
 } 

参考:java 判断字符串含有数字
java中判断一个字符串是否都为数字和截取数字

三、count(*)和count(1)和count(列名)的区别

先说结论:在进行统计的时候最好就是使用count(*),至少在5.5+的版本可以这样做,不管是在InnoDB还是MyISAM都能达到最佳性能。
目前mysql官方最新的文档版本是8.0,链接为:
https://dev.mysql.com/doc/refman/8.0/en/group-by-functions.html#function_count

5.5文档这样说:https://dev.mysql.com/doc/refman/5.5/en/group-by-functions.html
InnoDB handles SELECT COUNT(*) and SELECT COUNT(1) operations in the same way. There is no performance difference.

For MyISAM tables, COUNT(*) is optimized to return very quickly if the SELECT retrieves from one table, no other columns are retrieved, and there is no WHERE clause. For example: This optimization only applies to MyISAM tables, because an exact row count is stored for this storage engine and can be accessed very quickly. COUNT(1) is only subject to the same optimization if the first column is defined as NOT NULL.

从执行结果来说:

    count(1)和count(*)之间没有区别,因为count(*)count(1)都不会去过滤空值,

     但count(列名)就有区别了,因为count(列名)会去过滤空值。

从执行效率来说:

     他们之间根据不同情况会有些许区别,MySQL会对count(*)做优化。

     (1)如果列为主键,count(列名)效率优于count(1)  

     (2)如果列不为主键,count(1)效率优于count(列名)  

     (3)如果表中存在主键,count(主键列名)效率最优  

     (4)如果表中只有一列,则count(*)效率最优  

      (5)如果表有多列,且不存在主键,则count(1)效率优于count(*)

参考: mysql下count()和count(1)的区别
count()和count(1)和count(列名)的区别

另高性能sql中有这样一种技巧值得借鉴:在这里插入图片描述

四、mockito

Mock 测试就是在测试过程中,对于某些不容易构造(如 HttpServletRequest 必须在Servlet 容器中才能构造出来)或者不容易获取比较复杂的对象(如 JDBC 中的ResultSet 对象),用一个虚拟的对象(Mock 对象)来创建以便测试的测试方法。

Mock 最大的功能是帮你把单元测试的耦合分解开,如果你的代码对另一个类或者接口有依赖,它能够帮你模拟这些依赖,并帮你验证所调用的依赖的行为。

最近刚刚运用这个,记录一下:

@ExtendWith(MockitoExtension.class)
class XxxTest {

    @Resource
    private XxxServiceImpl xxxServiceImpl;

    @Mock
    private XxxMapper xxxMapper;

    @BeforeEach
    public void init() {
        xxxServiceImpl = new XxxServiceImpl();
        XxxServiceImpl.setXxxMapper(xxxMapper);
    }


 	@Test
    void test(){
        String input = "XXX";
        String except = "YYY";
		//被测试方法里面用到的查询结果,mock出来,也就是stubbing
        Mockito.when(xxxMapper.findNameById(1)).thenReturn("username");
		//被测试的方法
        String result= xxxServiceImpl.getNameMethod(x);
        assertEquals(except, result);
    }

看起来最简单的情况就差不多这样,@ExtendWith(MockitoExtension.class),@Resource,@Mock,@BeforeEach,@Test。主要就是把Mapper调用的方法的结果给提前存根,代替去数据库查。

抛开这些,我觉得主要注意就是stubbing:

  1. 默认情况下,所有方法都会返回值,一个 mock 将返回要么 null,一个原始/基本类型的包装值或适当的空集。例如,对于一个 int/Integer 就是 0,而对于 boolean/Boolean 就是 false。
  2. Stubbing 可以被覆盖。
  3. 一旦 stub,该方法将始终返回一个 stub 的值,无论它有多少次被调用。
  4. 最后的 stubbing 是很重要的 - 当你使用相同的参数 stub 多次同样的方法。换句话说:stubbing 的顺序是重要的,但它唯一有意义的却很少,例如当 stubbing 完全相同的方法调用,或者有时当参数匹配器的使用,等等。

还有就是stubbing的连续调用:(需要连续调用某个方法几次,需要注意次序)
when(mock.someMethod("some arg")) .thenReturn("one", "two", "three");

参考:Mockito 简明教程

五、easyExcel导入导出

这个框架使用非常简单,相比poi,jxl(太老了),easypoi。我这次使用的是Excel的导入功能,
1、引入

<!--easyExcel-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>1.1.2-beat1</version>
        </dependency>

2、controller层service层:

首先我用的是MultipartFile接收,然后inputStream=multipartFile.getInputStream()取得流

其次是sheet,好理解,就是Excel的页码:把new com.alibaba.excel.metadata.Sheet(1)传入就表示第一页。

最后调用这个:EasyExcelFactory.read(inputStream, sheet)//主要是这个方法
这个会返回一个List<Object> 是Excel表中一行一行的存在list中。自己将其遍历出来就好

我是将List中Object转成list。需要注意的是:如果Excel中某行内容列数少于标题行列数。转换后的list大小不是标题行大小。我用null填充,使每个list大小相同然后入库。

导出的话也是用EasyExcelFactory中的导出方法。需提前定义好格式等。

六、其他记录

  1. java.lang.UnsupportedOperationException解决方法
  2. <![CDATA[]]>和转义字符
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值