两款不错的AI代码补全插件

https://www.codota.comhttps://www.aixcoder.com

Objects.equals(a,b)和a.equals(b)

Objects.equals(a,b)解析首先查上源码:public static boolen equals(Object a,Object b){ return(a==b)||(a!=null&&a.equals(b))可以看到源码种有一个判空,以防止null值作为参数时报空指针异常。a.equals(b)解析a.equals(b)方法的源码:public static boolen equals(Object obj){ return(this==obj) }其并没有判空操作,当null值调用这个方法就会报空指针异常。因此才建议使用equals时常量放在前面调用,括号里写变量,或者使用Objects.equals方法

Java学习+面试指南JavaGuide

来自GitHub:https://github.com/Snailclimb/JavaGuide

几种CI持续集成工具简介

Travis CI首先要介绍的Travis CI是一个广泛使用的CI工具,因为它简直是Github爱好者的福音,而且用户份额很大。其支持绝大部分主流编程语言,包括但不限于:C、Java、Python、PHP等等。目前有超过90万的开源项目、60万的用户在使用Travis CI来作为他们的持续集成工具。Travis CI最大的特色和便利店是其与开源社区Github兼容得非常好,它可以极其方便地帮你为Github上的开源项目仓库快速地拉起一个持续集成防护网,而且对于开源项目完全免费,不花一分钱,这对学习者非常友好。而且Travis CI的用法也不复杂,也不需要你写什么复杂代码,它是用过 yml配置文件的形式来指定Travis CI要做的事情,来满足你的流程规划,先做什么,再做什么,最后做什么,挺方便。Jenkins大名鼎鼎的Jenkins简直如雷贯耳,国内很多的通信大厂、互联网大厂都正在使用中!Jenkins是一款开源的 CI&CD 工具,工具本身是Java写的,然而却支持各种编程语言项目的自动化任务,包括构建、测试、部署等。Jenkins一直是开源CI&CD软件领导者, 安装简易、配置简单、提供超过1000个插件来支持构建、部署、自动化, 满足任何项目的需要。Jenkins 支持各种运行方式,可通过系统包安装、也可以作为Java程序安装,甚至可以通过Docker来安装。而且Jenkins在企业级开发中可以非常便捷地与SVN、Git等代码管理工具无缝对接!如今已经步入2.0时代的Jenkins系统,其最大的特色便是加入了Pipeline流水线功能,Pipeline的加持,让Jenkins系统对项目做持续集成时变得更加灵活和强大。必须要说的是,Jenkins系统现在确实越来越庞大,越来越“重”了,如果真是个小项目那它来做持续集成有点浪费了。Circle CICircleCI 功能上和上面介绍的两个工具其实也差不多,但是使用起来可能更加“轻量”一些,这对学习者来说还是非常友好的!Circle CI也支持GitHub、Bitbucket等平台上的项目,只要你项目的代码有变更,就会自动抓取,根据你的配置,提供运行环境,执行测试、构建和部署等一系列自动化操作。Drone CIDrone CI与上面提到的诸如Jenkins等系统相比, 它也算是一个更加轻量级的CI工具,无论是工具本身的安装、部署,还是利用它做一些自动化工作流程的构建,都会简洁一些,更加好上手一些。Drone CI工具的使用,基本上也就是几行配置文件的事情,就像下面这样,不烦心其他工具除了前文提到的这四个主流工具,其他还有诸如像:flow.ciCodeShipSemaphore CI等等工具和网站,思想都差不多,都可以帮我们完成持续集成的目标!作者:CodeSheephttps://www.bilibili.com/read/cv4147684出处: bilibili

适合Java初学者的Spring Boot实战文章合集Spring-Boot-In-Action

来自b站大佬codesheep的文章合集仓库:https://github.com/hansonwang99/Spring-Boot-In-Action

几个常用正则

匹配非特殊字符串:([\\u2E80-\\u9FFF]|\\w|[,,\\.。()])*匹配手机号:1[34578][0-9]{8,10}匹配任意字符:[\s\S]+?匹配汉字:[\u4e00-\u9fa5]{0,}匹配邮箱:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*匹配网址:[a-zA-z]+://[^\s]*

一个讲解开源项目系列文章库

无意中看到的,存个书签吧:https://github.com/HelloGitHub-Team/Article

EasyExcel的简单使用

EasyExcel是一个基于Java的简单、省内存的读写Excel的开源项目。在尽可能节约内存的情况下支持读写百M的Excel。 github地址:https://github.com/alibaba/easyexcel依赖 <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.17</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>3.17</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml-schemas</artifactId> <version>3.17</version> </dependency> <!-- https://mvnrepository.com/artifact/com.alibaba/easyexcel --> <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>2.2.7</version> </dependency>若是使用jar包方式请下载:https://hik.lanzoux.com/i1qEtk5mvzi使用官方文档:https://www.yuque.com/easyexcel/doc/easyexcel一般操作官网都有,下列介绍不创建对象方式创建Excel,并且自定义列宽、单元格对齐方式。示例为导出表格其中代码设置样式参考:https://www.yuque.com/easyexcel/doc/write#W4u1e示例 response.reset(); response.setContentType("application/vnd.ms-excel"); response.setHeader("Content-disposition", "attachment;filename=" + new String(fileName.getBytes("UTF-8"), "ISO8859-1")); ServletOutputStream out = response.getOutputStream(); // 头的策略 WriteCellStyle headWriteCellStyle = new WriteCellStyle(); // 内容的策略 WriteCellStyle contentWriteCellStyle = new WriteCellStyle(); contentWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER); // 这个策略是 头是头的样式 内容是内容的样式 其他的策略可以自己实现 HorizontalCellStyleStrategy horizontalCellStyleStrategy = new HorizontalCellStyleStrategy(headWriteCellStyle, contentWriteCellStyle); EasyExcel.write(out).registerConverter(new TimestampCovert()) .registerWriteHandler(horizontalCellStyleStrategy) .registerWriteHandler(new FixedColumnWidthStyleStrategy()) .head(Utils.toTead(titles)) .sheet("sheet1").doWrite(list); out.flush();Converter由于表格数据list来自数据库,包含Timestamp类型数据,因此这里需要自己写了个转换器:import com.alibaba.excel.converters.Converter;import com.alibaba.excel.enums.CellDataTypeEnum;import com.alibaba.excel.metadata.CellData;import com.alibaba.excel.metadata.GlobalConfiguration;import com.alibaba.excel.metadata.property.ExcelContentProperty;import java.sql.Timestamp;import java.text.SimpleDateFormat;public class TimestampCovert implements Converter<Timestamp> { @Override public Class supportJavaTypeKey() { return Timestamp.class; } @Override public CellDataTypeEnum supportExcelTypeKey() { return CellDataTypeEnum.STRING; } @Override public Timestamp convertToJavaData(CellData cellData, ExcelContentProperty excelContentProperty, GlobalConfiguration globalConfiguration) throws Exception { return Timestamp.valueOf(cellData.getStringValue()); } @Override public CellData convertToExcelData(Timestamp timestamp, ExcelContentProperty excelContentProperty, GlobalConfiguration globalConfiguration) throws Exception { return new CellData<>(new SimpleDateFormat("yyyy/MM/dd HH:mm:ss").format(timestamp)); }}详细可参考:https://blog.csdn.net/fsadkjl/article/details/105823830WriteHandler示例代码中使用了样式的与列宽的Handler,FixedColumnWidthStyleStrategy继承了AbstractColumnWidthStyleStrategy,代码如下:import com.alibaba.excel.metadata.CellData;import com.alibaba.excel.metadata.Head;import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;import com.alibaba.excel.write.style.column.AbstractColumnWidthStyleStrategy;import org.apache.poi.ss.usermodel.Cell;import java.util.List;public class FixedColumnWidthStyleStrategy extends AbstractColumnWidthStyleStrategy { private int columnWidth = 23; @Override protected void setColumnWidth(WriteSheetHolder writeSheetHolder, List<CellData> list, Cell cell, Head head, Integer integer, Boolean aBoolean) { writeSheetHolder.getSheet().setColumnWidth(cell.getColumnIndex(), columnWidth * 256); } public FixedColumnWidthStyleStrategy() { } public FixedColumnWidthStyleStrategy(int columnWidth) { this.columnWidth = columnWidth; }}headhead设置头信息,由于head是一个List<List<String>>集合,这里封装成方法,传表头集合进去生成合适的表头类型。 public static List<List<String>> toTead(List<String> titles) { List<List<String>> list = new ArrayList<List<String>>(); List<String> head = new ArrayList<String>(); for (String title : titles) { head.add(title); list.add(head); head = new ArrayList<String>(); } return list; }筛选列导出可以根据传入的需要显示的字段titles动态改变sql获取数据,若查出所有字段的话筛选如下: /** * 设置表格信息 * @param dataList 查询出的数据 * @param titles 需要显示的字段 * @return */ private static List<List<Object>> dataList(List<Object> dataList, List<String> titles) { List<List<Object>> list = new ArrayList<>(); for (Object person : dataList) { List<Object> data = new ArrayList<>(); for (String fieldName : titles) { /**通过反射根据需要显示的字段,获取对应的属性值*/ data.add(getFieldValue(fieldName, person)); } list.add(data); } return list; } /** * 根据传入的字段获取对应的get方法,如name,对应的getName方法 * @param fieldName 字段名 * @param person 对象 * @return */ private static Object getFieldValue(String fieldName, Object person) { try { String firstLetter = fieldName.substring(0, 1).toUpperCase(); String getter = "get" + firstLetter + fieldName.substring(1); Method method = person.getClass().getMethod(getter); return method.invoke(person); } catch (Exception e) { logger.error("使用反射获取对象属性值失败", e); return null; } }参考:https://my.oschina.net/zjiamin/blog/4710076

java selenium webdriver无头模式参数设置

java webdriver无头模式参数设置Chrome设置mac linux需浏览器59版本以上,windows 60版本以上 ChromeOptions options = new ChromeOptions();// 设置 chrome 的无头模式 options.addArguments("--headless"); options.addArguments("--no-sandbox"); options.addArguments("--disable-gpu"); options.addArguments("--disable-dev-shm-usage"); WebDriver driver = new ChromeDriver(options);selenium add_argument 参数表https://peter.sh/experiments/chromium-command-line-switches/chrome_options.add_argument('--user-agent=""') # 设置请求头的User-Agentchrome_options.add_argument('--window-size=1280x1024') # 设置浏览器分辨率(窗口大小)chrome_options.add_argument('--start-maximized') # 最大化运行(全屏窗口),不设置,取元素会报错chrome_options.add_argument('--disable-infobars') # 禁用浏览器正在被自动化程序控制的提示chrome_options.add_argument('--incognito') # 隐身模式(无痕模式)chrome_options.add_argument('--hide-scrollbars') # 隐藏滚动条, 应对一些特殊页面chrome_options.add_argument('--disable-javascript') # 禁用javascriptchrome_options.add_argument('--blink-settings=imagesEnabled=false') # 不加载图片, 提升速度chrome_options.add_argument('--headless') # 浏览器不提供可视化页面chrome_options.add_argument('--ignore-certificate-errors') # 禁用扩展插件并实现窗口最大化chrome_options.add_argument('--disable-gpu') # 禁用GPU加速chrome_options.add_argument('–disable-software-rasterizer')chrome_options.add_argument('--disable-extensions')chrome_options.add_argument('--start-maximized')参考:https://blog.csdn.net/weixin_43968923/article/details/87899762火狐设置 FirefoxOptions options1 = new FirefoxOptions(); options1.addArguments("-headless");

Java selenium+webdriver使用教程

java selenium+webdriver使用教程webdriver驱动下载Chrome:http://npm.taobao.org/mirrors/chromedriver/https://chromedriver.storage.googleapis.com/index.htmlFirefox:https://github.com/mozilla/geckodriver/releases所需依赖只需要selenium-server依赖即可 <dependencies><!-- <dependency> <groupId>org.seleniumhq.selenium</groupId> <artifactId>selenium-java</artifactId> <version>3.141.59</version> </dependency> <dependency> <groupId>org.seleniumhq.selenium</groupId> <artifactId>selenium-api</artifactId> <version>3.141.59</version> </dependency>--> <!--或者用注释的坐标亦可--> <dependency> <groupId>org.seleniumhq.selenium</groupId> <artifactId>selenium-server</artifactId> <version>3.141.59</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13.1</version> </dependency> </dependencies>示例代码以下是模拟打开本站登陆页面,各位可使用Katalon Recorder浏览器插件自动生成代码,也可以参考下之前的一个示例 public static void main(String[] args) throws InterruptedException { System.setProperty("webdriver.chrome.driver", "C:\\Users\\Administrator\\Downloads\\chromedriver_win32\\chromedriver.exe"); WebDriver driver = new ChromeDriver(); driver.manage().window().maximize(); driver.manage().deleteAllCookies(); // 与浏览器同步非常重要,必须等待浏览器加载完毕 driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); driver.get("https://cway.top"); Thread.sleep(2000); driver.findElement(By.linkText("登录后台")).click(); Thread.sleep(2000); driver.close(); driver.quit(); }其他操作打开各种浏览器//IE浏览器System.setProperty("webdriver.ie.driver", ".\\Tools\\IEDriverServer.exe");WebDriver driver = new InternetExplorerDriver();//ChromeSystem.setProperty("webdriver.chrome.driver", ".\\Tools\\chromedriver.exe");WebDriver driver = new ChromeDriver();//FireFox(自定义安装)System.setProperty("webdriver.firefox.bin", "D:\\ProgramFiles\\Mozilla Firefox\\firefox.exe");//FireFox版本大于48,默认安装System.setProperty("webdriver.firefox.marionette", ".\\Tools\\geckodriver.exe");//FireFox版本小于48System.setProperty("webdriver.firefox.marionette", ".\\Tools\\geckodriver.exe");WebDriver driver = new FirefoxDriver();亦可用ChromeDriverService类构建驱动String webDriverPath = LagouSpider.class.getResource("chromedriver.exe").getPath(); // 这里需要注意一定要和打开的Chrome版本匹配 System.setProperty("webdriver.chrome.driver", webDriverPath); // 构建驱动 ChromeDriverService service = new ChromeDriverService.Builder(). usingDriverExecutable(new File(webDriverPath)).usingAnyFreePort().build(); try { service.start(); } catch (IOException e) { e.printStackTrace(); } // 获取Web驱动 WebDriver driver = new RemoteWebDriver(service.getUrl(), DesiredCapabilities.chrome());只是最后要关闭service // 退出驱动线程 driver.quit(); // 关闭service服务 service.stop();打开URL// 后退,跳转到上一页driver.navigate().back();// 前进,跳转到下一页driver.navigate().forward ();// 当前页刷新driver.navigate().refresh();// 浏览器窗口最大driver.manage().window().maximize();// 自定义设置浏览器尺寸driver.manage().window().setSize(new Dimension(width, heigth));关闭浏览器// 关闭当前页面driver.close(); // 关闭由selenium所启动的所有页面driver.quit();返回当前页标题与URL // 返回当前页面的Ttile String title = driver.getTitle(); // 返回当前页面的url String currentUrl = driver.getCurrentUrl();其它常见方法// 返回当前的浏览器的窗口句柄 String currentWindowHandle = driver.getWindowHandle() // 返回当前的浏览器的所有窗口句柄 Set<String> allWindowHandles = driver.getWindowHandles(); // 返回当前页面的源码 String currentPageSource = getPageSource() // 通过xpath获取元素 使用By还可以通过其他条件获取 WebElement titleElement = driver.findElement(By.xpath(titleExpression)); //获取文本 String titleElementText = titleElement.getText(); //获取属性 String titleElementHref = titleElement.getAttribute("href");参考:https://www.cnblogs.com/andrew209/archive/2004/01/13/9011399.html