作者归档:老王

Java 8十个lambda表达式案例

1. 实现Runnable线程案例

使用() -> {} 替代匿名类:

//Before Java 8:
new Thread(new Runnable() {
    @Override
    public void run() {
        System.out.println("Before Java8 ");
    }
}).start();

//Java 8 way:
new Thread( () -> System.out.println("In Java8!") ).start();
     
Output:
too much code, for too little to do
Lambda expression rocks !!

你可以使用 下面语法实现Lambda:

(params) -> expression
(params) -> statement
(params) -> { statements }

如果你的方法并不改变任何方法参数,比如只是输出,那么可以简写如下:

() -> System.out.println(“Hello Lambda Expressions”);

如果你的方法接受两个方法参数,如下:

(int even, int odd) -> even + odd 继续阅读

为什么面试要问 hashmap 的原理

我们都知道哪里要用HashMap,知道Hashtable和HashMap之间的区别,那么为何这道面试题如此特殊呢?是因为这道题考察的深度很深。这题经常出现在高级或中高级面试中。投资银行更喜欢问这个问题,甚至会要求你实现HashMap来考察你的编程能力。ConcurrentHashMap和其它同步集合的引入让这道题变得更加复杂。

1. 什么是HashMap?

HashMap可以接受null键值,而Hashtable则不能。HashMap是非synchronized,因此HashMap也很快。以及HashMap储存的是键值对。

 

2. 你知道HashMap和get()方法的工作原理吗?

HashMap是基于hashing的原理,我们使用put(key, value)存储对象到HashMap中,使用get(key)从HashMap中获取对象。当我们给put()方法传递键和值时,我们先对键调用hashCode()方法,返回的hashCode用于找到bucket位置来储存Entry对象。

这里关键点在于指出,HashMap是在bucket中储存键对象和值对象,作为Map.Entry。这一点有助于理解获取对象的逻辑。如果你没有意识到这一点,或者错误的认为仅仅只在bucket中存储值的话,你将不会回答如何从HashMap中获取对象的逻辑。这个答案相当的正确,也显示出面试者确实知道hashing以及HashMap的工作原理。

 

3. 当两个对象的hashcode相同会发生什么?

这个问题是关于HashMap中的碰撞探测(collision detection),因为hashcode相同,所以它们的bucket位置相同,‘碰撞’会发生。因为HashMap使用LinkedList存储对象,这个Entry(包含有键值对的Map.Entry对象)会存储在LinkedList中。

这个答案非常的合理,虽然有很多种处理碰撞的方法,这种方法是最简单的,也正是HashMap的处理方法。

 

4. 如果两个键的hashcode相同,你如何获取值对象?

当我们调用get()方法,HashMap会使用键对象的hashcode找到bucket位置,获取值对象。如果两个值对象存储在一个bucket中,将会遍历LinkedList直到调用keys.equals()方法去找到LinkedList中正确的节点,最终找到要找的值对象。(当程序通过 key 取出对应 value 时,系统只要先计算出该 key 的 hashCode() 返回值,在根据该 hashCode 返回值找出该 key 在 table 数组中的索引,然后取出该索引处的 Entry,最后返回该 key 对应的 value 即可。)

 

5. 如果HashMap的大小超过了负载因子(load factor)定义的容量,怎么办?

当一个map填满了75%的bucket时候,和其它集合类(如ArrayList等)一样,将会创建原来HashMap大小的两倍的bucket数组,来重新调整map的大小,并将原来的对象放入新的bucket数组中。这个过程叫作rehashing,因为它调用hash方法找到新的bucket位置。

 

6. 重新调整HashMap大小存在什么问题吗?

当重新调整HashMap大小的时候,确实存在条件竞争,因为如果两个线程都发现HashMap需要重新调整大小了,它们会同时试着调整大小。在调整大小的过程中,存储在LinkedList中的元素的次序会反过来,因为移动到新的bucket位置的时候,HashMap并不会将元素放在LinkedList的尾部,而是放在头部,这是为了避免尾部遍历(tail traversing)。如果条件竞争发生了,那么就死循环了。这个时候,你可以质问面试官,为什么这么奇怪,要在多线程的环境下使用HashMap呢?

继续阅读

Gradle 构建工程时jcenter下载慢或超时以及INSTALL_FAILED_OLDER_SDK解决

在使用 Gradle 构建工程时,jcenter 下载慢、超时的解决方法。

方法一:

https 改成 http 协议下载,修改项目根目录下 build.gradle 文件:

// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
repositories {
google()
// jcenter()
jcenter(){url ‘http://jcenter.bintray.com/’}
}
dependencies {
classpath ‘com.android.tools.build:gradle:3.2.1’

// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}

allprojects {
repositories {
google()
// jcenter()
jcenter(){url ‘http://jcenter.bintray.com/’}
}
}

task clean(type: Delete) {
delete rootProject.buildDir
}

方法二:

切换到国内的Maven镜像仓库。如:
// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
repositories {
google()
maven{url ‘http://maven.aliyun.com/nexus/content/groups/public/’}
}
dependencies {
classpath ‘com.android.tools.build:gradle:3.2.1’

// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}

allprojects {
repositories {
google()
maven{url ‘http://maven.aliyun.com/nexus/content/groups/public/’}
}
}

task clean(type: Delete) {
delete rootProject.buildDir
}

INSTALL_FAILED_OLDER_SDK原因就是您设备的Android版本过低,app不支持。 在程序的Manifest文件(或build.gradle)中修改minSdkVersion和targetSdkVersion版本号即可。

年轻的时候为什么不努力就是在犯罪!【力荐】

        爱,金钱,健康。这三样是我认为代表了一个人最重要的安全感来源。然而健康未必是爱的基础,爱也未必是健康的保障,但金钱却可以同时保障爱与健康。

    舒的小说《喜宝》中,女主角姜喜宝的自白说“我要很多很多爱,不然就要很多很多钱,最差也要有健康才好。”
  而没钱所带来的怯弱,是说不尽的。也许是初中时一双破了洞鞋子,紧紧的缩在校服的裤子里,体育课宁可受罚也躲着不去。也许是大学时室友聚餐找了借口不去,一个人躲在寝室煮青菜面条,吃完还要小心翼翼的打扫不被发现。也许是工作后捡到被遗弃的小猫,仍犹犹豫豫要不要买上百块的猫奶粉,错过拯救它的最佳时机,最后看它死在怀里又懊悔的痛哭流涕。

继续阅读

centos 7不能联网的处理

VMWare虚拟机中centos7安装vim提示错误,经检查发现是没有联网,尝试使用ifconfig命令检查网卡情况时提示command not found。继而cd去了sbin目录发现并没有ifconfig文件。作为一个linux门外汉,查阅了很多资料后才知道是因为centos7已经不使用ifconfig命令了,而是使用ip命令代替。并且网卡名称也不是eth0,而是改成ens33了。 解决方式如下:

1,如解决ifconfig命令找不到,可以使用ip addr 即查看分配网卡情况。
2,激活网卡:cd /etc/sysconfig/network-scripts/, vi ifcfg-ens33 进入编辑模式,将 ONBOOT=no 改为 ONBOOT=yes,保存后service network restart重启网卡服务就OK了。

万能的Ctrl + Z可以中断ping命令。

Ionic.Utils.Zip大全

项目开发中用到了Koogra,处理excel2007时遇到Invalid header magic number的问题。不得不吐嘈一下关于Koogra的资源是真的少,不过好再找到了问题的根源:Koogra读取2003和2007是不一样的,需要写两个不同的配置类。代码稍后贴出来(也是网上找的)。

但是在使用过程中,编译项目时new Net.SourceForge.Koogra.Excel2007.Workbook报错,提示缺少Ionic.Utils.Zip.dll的引用。于是到网上down了一个引用进来,编译通过了,但在运行时又报黄页了,看了一下错误提示,Koogra引用了个1.3.0版本的Ionic.Utils.Zip。 找半天终于找着了1.3.0版本的dll,整理了一下,有需要的自行下载吧。 继续阅读

.Net 高效开发之不可错过的实用工具

工欲善其事,必先利其器,没有好的工具,怎么能高效的开发出高质量的代码呢?本文为各ASP.NET 开发者介绍一些高效实用的工具,涉及SQL 管理,VS插件,内存管理,诊断工具等,涉及开发过程的各个环节,让开发效率翻倍。

Visual Studio
Visual Studio Productivity Power tool: VS 专业版的效率工具。 继续阅读

依赖反转Ioc和unity,autofac,castle框架差异及教程汇总

1、依赖倒置的相关概念

http://www.cnblogs.com/fuchongjundream/p/3873073.html

IoC模式(依赖、依赖倒置、依赖注入、控制反转)

2、依赖倒置的方式

http://www.cnblogs.com/muzinian/p/3357741.html

于依赖反转原则、控制反转和依赖注入的抽象的初学者指南

3、主流ioc框架

http://www.cnblogs.com/bchp/articles/1527693.html

http://www.cnblogs.com/liping13599168/archive/2011/07/17/2108734.html
继续阅读

mongodb数据去重

又是好久不更新了,至于为什么没更的原因,就是懒了。扯淡完,入正题。
因业务需要对mongodb中一亿八千多万的数据,针对其中一个字段进行去重处理。一把辛酸泪,分享一下踩过的坑。

第一种方式(网上扒的,然并卵的那种),使用mongodb游标dbcursor和while循环。看起来长成下面这样。 继续阅读