google-guava
Guava 是一个 Google 的基于java1.6的类库集合的扩展项目,包括 collections, caching, primitives support, concurrency libraries, common annotations, string processing, I/O, 等等. 这些高质量的 API 可以使你的JAVa代码更加优雅,更加简洁。
不打无准备之仗
Guava 是一个 Google 的基于java1.6的类库集合的扩展项目,包括 collections, caching, primitives support, concurrency libraries, common annotations, string processing, I/O, 等等. 这些高质量的 API 可以使你的JAVa代码更加优雅,更加简洁。
经典的使用回调的方式:
class A实现接口InA ——背景1
class A中包含一个class B的引用b ——背景2
class B有一个参数为InA的方法test(InA a) ——背景3
A的对象a调用B的方法传入自己,test(a) ——这一步相当于you call me
然后b就可以在test方法中调用InA的方法 ——这一步相当于i call you back
|
|
模拟客户端和服务器:深入浅出: Java回调机制(异步)
小王向小李问问题:一个经典例子让你彻彻底底理解java回调机制
深拷贝(deep clone)与浅拷贝(shallow clone):
浅拷贝(浅复制、浅克隆):被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。换言之,浅拷贝仅仅复制所考虑的对象,而不复制它所引用的对象。
深拷贝(深复制、深克隆):被复制对象的所有变量都含有与原来的对象相同的值,除去那些引用其他对象的变量。那些引用其他对象的变量将指向被复制过的新对象,而不再是原有的那些被引用的对象。换言之,深拷贝把要复制的对象所引用的对象都复制了一遍。
final关键字可以被家到属性或者变量的声明中,final属性或者变量一旦赋值之后就不允许再发生变化。对于基本类型(primitive type),比如int、double、long、byte等,一旦被生命为final,我们就可以将其当作常量来看待,但是对于引用类型或者数组(数组在java中也是对象)来说,则不是。虽然一个引用类型被赋值之后无法发生变化,但是我们仍然可以修改被引用的那个对象或者数组中的元素。
空指针:一个对象还没有没有正常初始化,就先调用它的方法。比如 Object obj=null; obj.toString(); 这就会抛出空指针异常 。牢记:使用对象时要先判断是否为空在掉方法。
预防方案:
1.从已知的String对象中调用equals()和equalsIgnoreCase()方法,而非未知对象。
判断字符串时使能确定不为空的对象去调用equals,如:””.equals(str);
2.当valueOf()和toString()返回相同的结果时,宁愿使用前者。
因为调用null对象的toString()会抛出空指针异常,如果我们能够使用valueOf()获得相同的值,那宁愿使用valueOf(),传递一个null给valueOf()将会返回“null”,尤其是在那些包装类,像Integer、Float、Double和BigDecimal。
3.使用null安全的方法和库有很多开源库已经为您做了繁重的空指针检查工作。其中最常用的一个的是Apache commons 中的StringUtils。你可以使用StringUtils.isBlank(),isNumeric(),isWhiteSpace()以及其他的工具方法而不用担心空指针异常。
4.避免从方法中返回空指针,而是返回空collection或者空数组。
5.使用annotation@NotNull和@Nullable
6.避免你的代码中不必要的自动包装和自动解包。
以上参见避免Java应用中NullPointerException的技巧和最佳实践
replace与replaceALL的区别
replace : 替换所有匹配到的
replaceAll:正则替换,replaceFirst:替换第一个匹配到的
参见java字符串的替换replace、replaceAll、replaceFirst的区别详解
1.书籍《spring in action》
2.查询spring data jpa(java persistent api)
附:JPA入门例子(采用JPA的hibernate实现版本)
3.搭建ssm框架
利用maven/eclipse搭建ssm(spring+spring mvc+mybatis)
使用Mybatis-Generator自动生成Dao、Model、Mapping相关文件(转)
4.spring boot
java爬虫,java网络数据采集:
神箭手/八爪鱼 /pyspider 采集平台,有监控平台,有云采集平台,都是一套系统。
JSOUP:
框架:
SeimiCrawler:据称可以实现js,
Crawler4j
WebCollector
WebMagic:webmagic-avalon 监控工具。
htmlUnit是java实现的无界面浏览器程序。网站地址:http://htmlunit.sourceforge.net/
在写HtmlUnit代码的时候,仿佛感觉到的就是在操作浏览器而非写代码,得到页面(getPage)– 寻找到文本框(getElementByID || getElementByName || getElementByXPath 等等)– 输入文字(type,setValue,setText等等)– 其他一些类似操作 – 找到提交按钮 – 提交 – 得到新的Page,这样就非常像一个人在后台帮你操作浏览器一样,而你要做的就是告诉他如何操作以及需要填入哪些值。
其原理比较简单,就是模拟浏览器点击输入操作,利用
|
|
可以获得页面对象HtmlForm,然后可以使用其API进行操作,表单的填充,表单的提交,模仿点击链接,由于内置了Rhinojs引擎,因此可以执行Javascript。其底层还是使用的httpClient来实现的。
很重要的一点是,HtmlUnit 提供对执行 javascript 的支持:
page.executeJavaScript(javascript)
执行 js 之后,返回一个 ScriptResult 对象,通过该对象可以拿到执行 js 之后的页面等信息。默认情况下,内部浏览器在执行 js 之后,将做页面跳转,跳转到执行 js 之后生成的新页面,如果执行 js 失败,将不执行页面跳转。最后可以取得page.executeJavaScript(javascript).getNewPage(),获取执行后的页面。
要加快速度,则可以禁用css,图片,flash等等。
1.显式等待
明确的等待是指在代码进行下一步操作之前等待某一个条件的发生。selenium webdriver提供了一些方法帮助我们等待正好需要等待的时间。利用WebDriverWait类和ExpectedCondition接口就能实现这一点。
|
|
隐性的等待其实就相当于设置全局的等待,在定位元素时,对所有元素设置超时时间。
|
|
参见selenium webdriver学习(十一)————如何等待页面元素加载完成
|
|
|
|
它与selenium是什么关系,跟phantomJS是同一层级的么?
我的理解是跟phantomJS、chrome、firefox等等是同一个层级,只不过是无界面的浏览器。selenium是提供了对其的驱动支持,直接内置了驱动。
有些地方是导入com.gargoylesoftware.htmlunit;但有些地方是用org.openqa.selenium.htmlunit.HtmlUnitDriver。
我的理解是都可以,com.gargoylesoftware.htmlunit是http://htmlunit.sourceforge.net/项目中的写法,是最初的项目。写法就是
|
|
但是后来htmlUnit又被集成到了selenium中,提供了一个htmlUnitDriver,所以也可以用selenium中的来开发。写法是
|
|
网页的模拟化
网络响应的自动处理化
并行和串行控制
缓存机制
driver类型 | 优点 | 缺点 |
---|---|---|
真实浏览器 | 真实模拟用户行为 | 效率、稳定性低 |
htmlunit | 速度快 | 其引擎不是主流的浏览器支持的,对js支持的不够好 |
phantomJS | 速度中等,模拟行为接近真实 | 不能模拟不同/特定浏览器的行为 |
HttpClient和HtmlUnit的比较总结以及使用技巧(一)
搜索、查询具体怎么写参见HtmlUnit实现ajax网络爬虫 和 htmlunit官网简易教程(翻译)
用htmlUnit进行爬虫,参见HtmlUnit 网络爬虫 菜鸟的学习笔记(一)
HtmlUnit、httpclient、jsoup爬取网页信息并解析
我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题:如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间。那么有没有一种办法使得线程可以复用,就是执行完一个任务,并不被销毁,而是可以继续执行其他的任务?在Java中可以通过线程池来达到这样的效果。
是软工开发模型中的一种,也可以称为形式化方法模型,与之相关的有形式验证。关于软件开发模型,不懂请点这里软件开发模型。
推荐学习路线: