Qi's Blog

不打无准备之仗


  • 首页

  • 分类

  • 关于

  • 归档

  • 标签

google-guava

发表于 2016-09-07   |   分类于 java   |  

google-guava

Guava 是一个 Google 的基于java1.6的类库集合的扩展项目,包括 collections, caching, primitives support, concurrency libraries, common annotations, string processing, I/O, 等等. 这些高质量的 API 可以使你的JAVa代码更加优雅,更加简洁。

参见Guava学习笔记:Google Guava 类库简介

javaSE

发表于 2016-09-06   |   分类于 java   |  

javaSE

泛型

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
//链接:https://www.zhihu.com/question/19801131/answer/26586203
public interface DoHomeWork {
void doHomeWork(String question, String answer);
}
public class Student implements DoHomeWork{
@Override
public void doHomeWork(String question, String answer) {
System.out.println("作业本");
if(answer != null) {
System.out.println("作业:"+question+" 答案:"+ answer);
} else {
System.out.println("作业:"+question+" 答案:"+ "(空白)");
}
}
public void ask(final String homework, final RoomMate roomMate) {
new Thread(new Runnable() {
@Override
public void run() {
roomMate.getAnswer(homework, Student.this);//a 调用 b,并且把自己(接口)传过去。
}
}).start();
goHome();
}
public void goHome(){
System.out.println("我回家了……好室友,帮我写下作业。");
}
public static void main(String[] args) {
Student student = new Student();
String homework = "当x趋向于0,sin(x)/x =?";
student.ask(homework, new RoomMate());
}
}
public class RoomMate {
public void getAnswer(String homework, DoHomeWork someone) {
//以接口的形式接受a类
if ("1+1=?".equals(homework)) {
someone.doHomeWork(homework, "2");
} else if("当x趋向于0,sin(x)/x =?".equals(homework)) {
System.out.print("思考:");
for(int i=1; i<=3; i++) {
System.out.print(i+"秒 ");
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println();
someone.doHomeWork(homework, "1"); //b再调用a
} else {
someone.doHomeWork(homework, "(空白)");
}
}
}

模拟客户端和服务器:深入浅出: Java回调机制(异步)

小王向小李问问题:一个经典例子让你彻彻底底理解java回调机制

拷贝

深拷贝(deep clone)与浅拷贝(shallow clone):
  浅拷贝(浅复制、浅克隆):被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。换言之,浅拷贝仅仅复制所考虑的对象,而不复制它所引用的对象。

​ 深拷贝(深复制、深克隆):被复制对象的所有变量都含有与原来的对象相同的值,除去那些引用其他对象的变量。那些引用其他对象的变量将指向被复制过的新对象,而不再是原有的那些被引用的对象。换言之,深拷贝把要复制的对象所引用的对象都复制了一遍。

final

final关键字可以被家到属性或者变量的声明中,final属性或者变量一旦赋值之后就不允许再发生变化。对于基本类型(primitive type),比如int、double、long、byte等,一旦被生命为final,我们就可以将其当作常量来看待,但是对于引用类型或者数组(数组在java中也是对象)来说,则不是。虽然一个引用类型被赋值之后无法发生变化,但是我们仍然可以修改被引用的那个对象或者数组中的元素。

NUll

空指针:一个对象还没有没有正常初始化,就先调用它的方法。比如 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的技巧和最佳实践

String

replace与replaceALL的区别

replace : 替换所有匹配到的

replaceAll:正则替换,replaceFirst:替换第一个匹配到的

参见java字符串的替换replace、replaceAll、replaceFirst的区别详解

技巧

30个java编程技巧(最佳实践)

ka总结博客

javaSE

java并发包学习

java学习笔记

javaweb-spring

发表于 2016-09-05   |   分类于 web   |  

spring

1.书籍《spring in action》

2.查询spring data jpa(java persistent api)

纯干货,Spring-data-jpa详解,全方位介绍。

附:JPA入门例子(采用JPA的hibernate实现版本)

3.搭建ssm框架

利用maven/eclipse搭建ssm(spring+spring mvc+mybatis)

使用Mybatis-Generator自动生成Dao、Model、Mapping相关文件(转)

ssm框架笔记

4.spring boot

java-annotation

发表于 2016-09-05   |   分类于 java   |  

Annotation

JAVA SE annotation

参考博客

1.Java注解(Annotation)

2.java注解

3.java 注解的几大作用及使用方法详解(完)

4.深入浅出Java Annotation(元注解和自定义注解)

spider_java

发表于 2016-09-04   |   分类于 web   |  

spider-java框架

java爬虫,java网络数据采集:

​ 神箭手/八爪鱼 /pyspider 采集平台,有监控平台,有云采集平台,都是一套系统。

基于java的分布式爬虫

开源爬虫框架各有什么优缺点?

Java网络爬虫

JSOUP:

使用 jsoup 对 HTML 文档进行解析和操作

Jsoup学习笔记

框架:

SeimiCrawler:据称可以实现js,

Crawler4j

WebCollector

WebMagic:webmagic-avalon 监控工具。

web magic

基于webmagic的爬虫项目经验小结

基于Webmagic爬虫框架的数据抓取

从webmagic着手浅析JAVA爬虫

WebMagic Avalon设计草图

大白痴学习webmagic

crawler imitating browser

发表于 2016-08-31   |   分类于 web   |  

crawler imitating browser

模拟浏览器

htmlunit

htmlUnit是java实现的无界面浏览器程序。网站地址:http://htmlunit.sourceforge.net/

在写HtmlUnit代码的时候,仿佛感觉到的就是在操作浏览器而非写代码,得到页面(getPage)– 寻找到文本框(getElementByID || getElementByName || getElementByXPath 等等)– 输入文字(type,setValue,setText等等)– 其他一些类似操作 – 找到提交按钮 – 提交 – 得到新的Page,这样就非常像一个人在后台帮你操作浏览器一样,而你要做的就是告诉他如何操作以及需要填入哪些值。

其原理比较简单,就是模拟浏览器点击输入操作,利用

1
2
WebClient webclient = new WebClient();//htmlunit 是一款开源的 java 页面分析工具,启动 htmlunit 之后,底层会启动一个无界面浏览器,用户可以指定浏览器类型:firefox、ie 等,如果不指定,默认采用 INTERNET_EXPLORER_7:
webclient.getPage(url);

可以获得页面对象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接口就能实现这一点。

1
2
3
4
5
6
7
8
WebDriverWait wait = new WebDriverWait(driver, 10);
driver.findElement(By.id("b")).click();
WebElement wl = wait.until(new ExpectedCondition<WebElement>() {
@Override
public WebElement apply(WebDriver d) {
return d.findElement(By.cssSelector(".red_box"));
}
});
隐式等待

隐性的等待其实就相当于设置全局的等待,在定位元素时,对所有元素设置超时时间。

1
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

参见selenium webdriver学习(十一)————如何等待页面元素加载完成

maven依赖
1
2
3
4
5
<dependency>
<groupId>net.sourceforge.htmlunit</groupId>
<artifactId>htmlunit</artifactId>
<version>2.18</version>
</dependency>
POST方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
URL url = new URL("http://www2.baidu.com");
WebRequestSettings reqSet = new WebRequestSettings(url,SubmitMethod.POST);
List reqParam = new ArrayList();
reqParam.add(new NameValuePair("entered_login", username));
reqParam.add(new NameValuePair("entered_password", password));
reqParam.add(new NameValuePair("entered_imagecode", verifycode));
reqSet.setRequestParameters(reqParam);
HtmlPage mypage = (HtmlPage)client.getPage(reqSet);

htmlUnit介绍

问题
  1. 它与selenium是什么关系,跟phantomJS是同一层级的么?

    我的理解是跟phantomJS、chrome、firefox等等是同一个层级,只不过是无界面的浏览器。selenium是提供了对其的驱动支持,直接内置了驱动。

  2. 有些地方是导入com.gargoylesoftware.htmlunit;但有些地方是用org.openqa.selenium.htmlunit.HtmlUnitDriver。

    我的理解是都可以,com.gargoylesoftware.htmlunit是http://htmlunit.sourceforge.net/项目中的写法,是最初的项目。写法就是

    1
    2
    WebClient webclient = new WebClient();
    webclient.getPage(url);

    但是后来htmlUnit又被集成到了selenium中,提供了一个htmlUnitDriver,所以也可以用selenium中的来开发。写法是

    1
    2
    3
    WebDriver driver=new HtmlUnitDriver();
    //WebDriver driver=new PhantomJSDriver(); //如果是phantomJS,
    driver.get(url);
优点

网页的模拟化

网络响应的自动处理化

并行和串行控制

  1. js错误处理监听机制
  2. 链接响应监听

缓存机制

各个driver的优缺点比较

driver类型 优点 缺点
真实浏览器 真实模拟用户行为 效率、稳定性低
htmlunit 速度快 其引擎不是主流的浏览器支持的,对js支持的不够好
phantomJS 速度中等,模拟行为接近真实 不能模拟不同/特定浏览器的行为

参考博客

htmlunit优缺点

HttpClient和HtmlUnit的比较总结以及使用技巧(一)

htmlunit使用技巧

搜索、查询具体怎么写参见HtmlUnit实现ajax网络爬虫 和 htmlunit官网简易教程(翻译)

用htmlUnit进行爬虫,参见HtmlUnit 网络爬虫 菜鸟的学习笔记(一)

HtmlUnit2.14使用样例—获取动态网页

HtmlUnit、httpclient、jsoup爬取网页信息并解析

selenium综合教程

selenium webdriver学习

webdriver中文社区

python 调用selenium备忘

黄亿华使用Selenium来抓取动态加载的页面

java-thread

发表于 2016-08-30   |   分类于 java   |  

java thread

线程池

我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题:如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间。那么有没有一种办法使得线程可以复用,就是执行完一个任务,并不被销毁,而是可以继续执行其他的任务?在Java中可以通过线程池来达到这样的效果。

阅读全文 »

formal model

发表于 2016-08-27   |   分类于 other   |  

Formal Model

形式化模型

所属分类

是软工开发模型中的一种,也可以称为形式化方法模型,与之相关的有形式验证。关于软件开发模型,不懂请点这里软件开发模型。

推荐学习路线:

  1. 软件开发模型(稍微了解下什么是瀑布模型,迭代模型即可)
  2. 形式化模型 (重点掌握)
  3. 形式验证(作为补充和延伸)
阅读全文 »

tianchi

发表于 2016-08-27   |   分类于 machine-learning   |  

tianchi-bigdata-competition

比赛答辩视频

ppt下载地址 (提取码:klUf2c)

天池官方公众号tianchibigdata001

the guidebook of redis

发表于 2016-08-26   |   分类于 big-data   |  

The GuideBook Of Redis——Redis入门指南

本博客为《Redis入门指南》一书的读书笔记。

阅读全文 »
1…567
Qi Liu

Qi Liu

Less is More

69 日志
11 分类
63 标签
© 2018 Qi Liu
由 Hexo 强力驱动
主题 - NexT.Pisces