第一种形式用当前类作为引用类型,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的区别
需要判断某个字符串是否为数字。我用的是第二种,正则表达式:
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(*),至少在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(列名)的区别
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:
还有就是stubbing的连续调用:(需要连续调用某个方法几次,需要注意次序)
when(mock.someMethod("some arg")) .thenReturn("one", "two", "three");
参考:Mockito 简明教程
这个框架使用非常简单,相比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中的导出方法。需提前定义好格式等。
和转义字符