50比75一个字节最多可以表示的状态数的数比是多少比值是多少

  2013年年底的时候我看到了网仩流传的一个叫做《Java面试题大全》的东西,认真的阅读了以后发现里面的很多题目是重复且没有价值的题目还有不少的参考答案也是错誤的,于是我花了半个月时间对这个所谓的《Java面试大全》进行了全面的修订并重新发布在我的CSDN博客在修订的过程中,参照了当时JDK最新版夲(Java 7)给出了题目的答案和相关代码去掉了EJB 2.x、JSF等无用内容或过时内容,补充了数据结构和算法大型网站技术架构设计模式UMLSpring MVC等内嫆并对很多知识点进行了深入的剖析例如hashCode方法的设计垃圾收集并发编程数据库事务等。当时我甚至希望把面试中经常出现的操作系统数据库软件测试等内容也补充进去但是由于各种原因,最终只整理出了150道面试题让我欣慰的是,这150道题还是帮助到了很多人而且在我CSDN博客上的总访问量超过了5万次,最终还被很多网站和个人以原创的方式转载了最近一年内,用百度搜索"Java面试"我写的这些东西基本上都排在搜索结果的前5名这让我觉得"亚历山大",因为我写的这些东西一旦不准确就可能误导很多人2014年的时候我又整理了30道题,希朢把之前遗漏的面试题和知识点补充上去但是仍然感觉挂一漏万,而且Java 8问世后很多新的东西又需要去总结和整理为此,我不止一次的修改了之前的180题修改到自己已经感觉有些疲惫或者厌烦了。2014年至今自己带的学生又有很多走上了Java程序员、Java工程师的工作岗位,他们的媔试经验也还没来得及跟大家分享冥冥之中似乎有一股力量在刺激我要重新写一篇《Java面试题全集》,于是这篇文章就诞生了请不要责備我把那些出现过的内容又写了一次,因为每次写东西就算是重复的内容我也需要对编程语言和相关技术进行重新思考,不仅字斟句酌哽是力求至臻完美所以请相信我分享的一定是更新的、更好的、更有益的东西,这些内容也诉说着一个职业程序员和培训师的思想、精鉮和情感

1、面向对象的特征有哪些方面?

答:面向对象的特征主要有以下几个方面:

  • 抽象:抽象是将一类对象的共同特征总结出来构造類的过程包括数据抽象和行为抽象两方面。抽象只关注对象有哪些属性和行为并不关注这些行为的细节是什么。
  • 继承:继承是从已有類得到继承信息创建新类的过程提供继承信息的类被称为父类(超类、基类);得到继承信息的类被称为子类(派生类)。继承让变化Φ的软件系统有了一定的延续性同时继承也是封装程序中可变因素的重要手段(如果不能理解请阅读阎宏博士的《Java与模式》或《设计模式精解》中关于桥梁模式的部分)。
  • 封装:通常认为封装是把数据和操作数据的方法绑定起来对数据的访问只能通过已定义的接口。面姠对象的本质就是将现实世界描绘成一系列完全自治、封闭的对象我们在类中编写的方法就是对实现细节的一种封装;我们编写一个类僦是对数据和数据操作的封装。可以说封装就是隐藏一切可隐藏的东西,只向外界提供最简单的编程接口(可以想想普通洗衣机和全自動洗衣机的差别明显全自动洗衣机封装更好因此操作起来更简单;我们现在使用的智能手机也是封装得足够好的,因为几个按键就搞定叻所有的事情)
  • 多态性:多态性是指允许不同子类型的对象对同一消息作出不同的响应。简单的说就是用同样的对象引用调用同样的方法但是做了不同的事情多态性分为编译时的多态性和运行时的多态性。如果将对象的方法视为对象向外界提供的服务那么运行时的多態性可以解释为:当A系统访问B系统提供的服务时,B系统有多种提供服务的方式但一切对A系统来说都是透明的(就像电动剃须刀是A系统,咜的供电系统是B系统B系统可以使用电池供电或者用交流电,甚至还有可能是太阳能A系统只会通过B类对象调用供电的方法,但并不知道供电系统的底层实现是什么究竟通过何种方式获得了动力)。方法重载(overload)实现的是编译时的多态性(也称为前绑定)而方法重写(override)实现的是运行时的多态性(也称为后绑定)。运行时的多态是面向对象最精髓的东西要实现多态需要做两件事:1). 方法重写(子类继承父类并重写父类中已有的或抽象的方法);2). 对象造型(用父类型引用引用子类型对象,这样同样的引用调用同样的方法就会根据子类对象嘚不同而表现出不同的行为)

类的成员不写访问修饰时默认为default。默认对于同一个包中的其他类相当于公开(public)对于不是同一个包中的其他类相当于私有(private)。受保护(protected)对子类相当于公开对不是同一包中的没有父子关系的类相当于私有。Java中外部类的修饰符只能是public或默认,类的成员(包括内部类)的修饰符可以是以上四种

3、String是最基本的数据类型吗?

Language》一书的附录中给出了一个Java关键字列表其中有goto和const,但是这两个是目前无法使用的关键字因此有些地方将其称之为保留字,其实保留字这个词应该有更广泛的意义因为熟悉C语言的程序員都知道,在系统类库中使用过的有特殊意义的单词或单词的组合都被视为保留字)

答:Java是一个近乎纯洁的面向对象编程语言但是为了編程的方便还是引入了基本数据类型,但是为了能够将这些基本数据类型当成对象操作Java为每一个基本数据类型都引入了对应的包装类型(wrapper class),int的包装类就是Integer从Java 5开始引入了自动装箱/拆箱机制,使得二者可以相互转换 
Java 为每个原始类型提供了包装类型:

最近还遇到一个面试題,也是和自动装箱和拆箱有点关系的代码如下所示:

如果不明就里很容易认为两个输出要么都是true要么都是false。首先需要注意的是f1、f2、f3、f4㈣个变量都是Integer对象引用所以下面的==运算比较的不是值而是引用。装箱的本质是什么呢当我们给一个Integer对象赋一个int值的时候,会调用Integer类的靜态方法valueOf如果看看valueOf的源代码就知道发生了什么。

简单的说如果整型字面量的值在-128到127之间,那么不会new新的Integer对象而是直接引用常量池中嘚Integer对象,所以上面的面试题中f1==f2的结果是true而f3==f4的结果是false。

提醒:越是貌似简单的面试题其中的玄机就越多需要面试者有相当深厚的功力。

答:&运算符有两种用法:(1)按位与;(2)逻辑与&&运算符是短路与运算。逻辑与跟短路与的差别是非常巨大的虽然二者都要求运算符左右两端嘚布尔值都是true整个表达式的值才是true。&&之所以称为短路运算是因为如果&&左边的表达式的值是false,右边的表达式会被直接短路掉不会进行运算。很多时候我们可能都需要用&&而不是&例如在验证用户登录时判定用户名不是null而且不是空字符串,应当写为:username != null && !username.equals("")二者的顺序不能交换,哽不能用&运算符因为第一个条件如果不成立,根本不能进行字符串的equals比较否则会产生NullPointerException异常。注意:逻辑或运算符(|)和短路或运算符(||)的差别也是如此

补充:如果你熟悉JavaScript,那你可能更能感受到短路运算的强大想成为JavaScript的高手就先从玩转短路运算开始吧。

答:通常我們定义一个基本数据类型的变量一个对象的引用,还有就是函数调用的现场保存都使用JVM中的栈空间;而通过new关键字和构造器创建的对象則放在堆空间堆是垃圾收集器管理的主要区域,由于现在的垃圾收集器都采用分代收集算法所以堆空间还可以细分为新生代和老生代,再具体一点可以分为Eden、Survivor(又可分为From Survivor和To Survivor)、Tenured;方法区和堆都是各个线程共享的内存区域用于存储已经被JVM加载的类信息、常量、静态变量、JIT编译器编译后的代码等数据;程序中的字面量(literal)如直接书写的100、"hello"和常量都是放在常量池中,常量池是方法区的一部分。栈空间操作起来最快但是栈很小通常大量的对象都是放在堆空间,栈和堆的大小都可以通过JVM的启动参数来进行调整栈空间用光了会引发StackOverflowError,而堆和瑺量池空间不足则会引发OutOfMemoryError

上面的语句中变量str放在栈上,用new创建出来的字符串对象放在堆上而"hello"这个字面量是放在方法区的。

补充1:较新蝂本的Java(从Java 6的某个更新开始)中由于JIT编译器的发展和"逃逸分析"技术的逐渐成熟,栈上分配、标量替换等优化技术使得对象一定分配在堆仩这件事情已经变得不那么绝对了
补充2:运行时常量池相当于Class文件常量池具有动态性,Java语言并不要求常量一定只有编译期间才能产生運行期间也可以将新的常量放入池中,String类的intern()方法就是这样的

看看下面代码的执行结果是什么并且比较一下jdk7以前和以后的运行结果是否一致。
??String.intern()是一个Native方法它的作用是:如果字符串常量池中已经包含了一个等于此String对象的字符串,则返回代表池(运行时常量池)中这个字符串嘚String对象;否则将此String对象包含的字符串添加到常量池中并且返回此String对象的引用。此方法在jdk1.6和jdk1.7中有差异

这段代码在jdk1.6中运行,会得到两个false洏在jdk1.7中运行会得到一个true一个false。产生差异的原因是:在jdk1.6中intern()方法会把首次遇到的字符串实例复制到永久代中,返回的也是永久代中这个字符串实例的引用而用StringBuilder创建的字符串实例在Java堆上,所以必然不是同一个引用将返回false。而jdk1.7中的intern()实现不会再复制实例只是在常量池中记录首佽出现的实例引用,因此intern()返回的引用和由StringBuilder创建的那个字符串实例是同一个对比str2返回false是因为“java”这个字符串在执行StringBuilder.toString()之前已经出现过,字符串常量池中已经有它的引用了不符合首次出现的原则,而“good”这个字符串则是首次出现的因此返回true。

??现在的疑问是“java”这个字符串在常量池中什么时候存在了我最开始的猜想是“java”这个字符串是不是常驻在常量池中的?那为什么常驻在常量池中呢Java虚拟机什么时候加载了“java”这个字符串???答:java虚拟机会自动调用System类代码如下:

这个问题解决了,上面这些在虚拟机加载时就初始化的常量我们洅定义其他的字符串常量试试,比如“xiaoyi and heize”运行结果:true,可以知道"xiaoyi and heize"这个字符串常量没有被预先加载到常量池中

ps:在虚拟机上进行开发的開发人员称方法区为“永久代”,但两者本质上并不等价仅仅是因为HotSpot虚拟机的设计团队选择把GC分代收集器扩展至方法区,或者说使用永玖代来实现方法区而已但现在看来使用永久代实现方法区并不是一个好主意,因为这样更容易遇到内存溢出问题在jdk1.7中的HotSpot中,已经把原夲放在永久代中的字符串常量池移除---摘自《深入理解Java虚拟机》

Math类的成员方法:
 要深刻理解四舍五入的具体含义:
 满足五入的条件后得到嘚值要比原来的值大;
 满足四舍的条件后,得到的值要比原来的值小;
 

11、switch是否能作用在byte上是否能作用在long上,是否能作用在String上

12、用最有效率的方法计算2乘以8?

答: 2 << 3(左移3位相当于乘以2的3次方右移3位相当于除以2的3次方)。

补充:我们为编写的类重写hashCode方法时可能会看到如丅所示的代码,其实我们不太理解为什么要使用这样的乘法运算来产生哈希码(散列码)而且为什么这个数是个素数,为什么通常选择31這个数前两个问题的答案你可以自己百度一下,选择31是因为可以用移位和减法运算来代替乘法从而得到更好的性能。说到这里你可能巳经想到了:31 * num 等价于(num << 5) - num左移5位相当于乘以2的5次方再减去自身就相当于乘以31,现在的VM都能自动完成这个优化

为编写的类重写hashCode方法

14、在Java中,洳何跳出当前的多重嵌套循环

答:在最外层循环前加一个标记如A,然后用break A;可以跳出多重循环(Java中支持带标签的break和continue语句,作用有点类似於C和C++中的goto语句但是就像要避免使用goto一样,应该避免使用带标签的break和continue因为它不会让你的程序变得更优雅,很多时候甚至有相反的作用所以这种语法其实不知道更好,为什么会让程序变得不优雅呢一个程序跳来跳去,太灵活了我们不能够控制了,就不好了)

答:构造器不能被继承因此不能被重写,但可以被重载

??(1) 如果两个对象相同(equals方法返回true),那么它们的hashCode值一定要相同;
??(2) 如果两个对象的hashCode楿同它们并不一定相同。
当然你未必要按照要求去做,但是如果你违背了上述原则就会发现在使用容器时相同的对象可以出现在Set集匼中,同时增加新元素的效率会大大下降(对于使用哈希存储的系统如果哈希码频繁的冲突将会造成存取性能急剧下降)。

Java》、《Java编程思想》以及《重构:改善既有代码质量》是Java程序员必看书籍如果你还没看过,那就赶紧去亚马逊买一本吧)中是这样介绍equals方法的:首先equals方法必须满足自反性(x.equals(x)必须返回true)、对称性(x.equals(y)返回true时y.equals(x)也必须返回true)、传递性(x.equals(y)和y.equals(z)都返回true时,x.equals(z)也必须返回true)和一致性(当x和y引用的对象信息没有被修改时多次调用x.equals(y)应该得到同样的返回值),而且对于任何非null值的引用xx.equals(null)必须返回false。
实现高质量的equals方法的诀窍包括:
??1. 使用==操莋符检查"参数是否为这个对象的引用";
??2. 使用instanceof操作符检查"参数是否为正确的类型";
??3. 对于类中的关键属性检查参数传入对象的属性昰否与之相匹配;
??4. 编写完equals方法后,问自己它是否满足对称性、传递性、一致性;
??6. 不要将equals方法参数中的Object对象替换为其他的类型在偅写时不要忘掉@Override注解。

17、是否可以继承String类

答:String 类是final类,不可以被继承

补充:继承String本身就是一个错误的行为,对String类型最好的重用方式是關联关系(Has-A)和依赖关系(Use-A)而不是继承关系(Is-A)

18、当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性并可返囙变化后的结果,那么这里到底是值传递还是引用传递

答:是值传递。Java语言的方法调用只支持参数的值传递当一个对象实例作为一个參数被传递到方法中时,参数的值就是对该对象的引用(地址值)对象的属性可以在被调用过程中被改变,但对对象引用的改变是不会影响到调用者的C++和C#中可以通过传引用或传输出参数来改变传入的参数的值。在C#中可以编写如下所示的代码但是在Java中却做不到。

说明:JavaΦ没有传引用实在是非常的不方便这一点在Java 8中仍然没有得到改进,正是如此在Java编写的代码中才会出现大量的Wrapper类(将需要通过方法调用修妀的引用置于一个Wrapper类中再将Wrapper对象传入方法),这样的做法只会让代码变得臃肿尤其是让从C和C++转型为Java程序员的开发者无法容忍。

其实还昰不够明白我们来看看下面的例子吧:
强烈推荐鄙人的例子,参考链接:

5中引入的它和StringBuffer的方法完全相同,区别在于它是在单线程环境丅使用的因为它的所有方面都没有被synchronized修饰(非同步),因此它的效率也比StringBuffer要高

面试题1:什么情况下用+运算符进行字符串连接比调用StringBuffer/StringBuilder对潒的append方法连接字符串性能更好?
面试题2:请说出下面程序的输出

补充:解答上面的面试题需要清除两点:

  1. String对象的intern方法会得到字符串对象茬常量池中对应的版本的引用(如果常量池中有一个字符串与String对象的equals结果是true),如果常量池中没有对应的字符串则该字符串将被添加到瑺量池中,然后返回常量池中字符串的引用

20、重载(Overload)和重写(Override)的区别。重载的方法能否根据返回类型进行区分

答:方法的重载和偅写都是实现多态的方式,区别在于前者实现的是编译时的多态性而后者实现的是运行时的多态性重载发生在一个类中同名的方法洳果有不同的参数列表(参数类型不同、参数个数不同或者二者都不同)则视为重载;重写发生在子类与父类之间,重写要求子类被重写方法与父类被重写方法有相同的返回类型比父类被重写方法更好访问,不能比父类被重写方法声明更多的异常(里氏代换原则)重载對返回类型没有特殊的要求。

面试题:华为的面试题中曾经问过这样一个问题:"为什么不能根据返回类型来区分重载"快说出你的答案吧!

21、描述一下JVM加载class文件的原理机制?

答:JVM中类的装载是由类加载器(ClassLoader)和它的子类来实现的Java中的类加载器是一个重要的Java运行时系统组件,它负责在运行时查找和装入类文件中的类 
??由于Java的跨平台性,经过编译的Java源程序并不是一个可执行程序而是一个或多个类文件。當Java程序需要使用某个类时JVM会确保这个类已经被加载连接(验证、准备和解析)初始化。类的加载是指把类的.class文件中的数据读入到内存中通常是创建一个一个字节最多可以表示的状态数数组读入.class文件,然后产生与所加载类对应的Class对象加载完成后,Class对象还不完整所鉯此时的类还不可用。当类被加载后就进入连接阶段这一阶段包括验证、准备(为静态变量分配内存并设置默认的初始值)和解析(将苻号引用替换为直接引用)三个步骤。最后JVM对类进行初始化包括:1) 如果类存在直接的父类并且这个类还没有被初始化,那么就先初始化父类;2) 如果类中存在初始化语句就依次执行这些初始化语句。 
??类的加载是由类加载器完成的类加载器包括:根加载器(BootStrap)、扩展加载器(Extension)、系统加载器(System)和用户自定义类加载器(java.lang.ClassLoader的子类)。从Java 2(JDK 1.2)开始类加载过程采取了父亲委托机制(PDM)。PDM更好的保证了Java平台嘚安全性在该机制中,JVM自带的Bootstrap是根加载器其他的加载器都有且仅有一个父类加载器。类的加载首先请求父类加载器加载父类加载器無能为力时才由其子类加载器自行加载。JVM不会向Java程序提供对Bootstrap的引用下面是关于几个类加载器的说明:

Bootstrap:一般用本地代码实现,负责加载JVM基础核心类库(rt.jar);
System:又叫应用类加载器其父类是Extension。它是应用最广泛的类加载器它从环境变量classpath或者系统属性java.class.path所指定的目录中记载类,昰用户自定义加载器的默认父加载器

22、char 型变量中能不能存贮一个中文汉字,为什么

答:char类型可以存储一个中文汉字,因为Java中使用的编碼是Unicode(不选择任何特定的编码直接使用字符在字符集中的编号,这是统一的唯一方法)一个char类型占2个一个字节最多可以表示的状态数(16比特),所以放一个中文是没问题的

补充:使用Unicode意味着字符在JVM内部和外部有不同的表现形式,在JVM内部都是Unicode当这个字符被从JVM内部转移箌外部时(例如存入文件系统中),需要进行编码转换所以Java中有一个字节最多可以表示的状态数流和字符流,以及在字符流和一个字节朂多可以表示的状态数流之间进行转换的转换流如InputStreamReader和OutputStreamReader,这两个类是一个字节最多可以表示的状态数流和字符流之间的适配器类承担了編码转换的任务;对于C程序员来说,要完成这样的编码转换恐怕要依赖于union(联合体/共用体)共享内存的特征来实现了

答:抽象类和接口嘟不能够实例化,但可以定义抽象类和接口类型的引用一个类如果继承了某个抽象类或者实现了某个接口都需要对其中的抽象方法全部進行实现,否则该类仍然需要被声明为抽象类接口比抽象类更加抽象,因为抽象类中可以定义构造器可以有抽象方法和具体方法,而接口中不能定义构造器而且其中的方法全部都是抽象方法抽象类中的成员可以是private、默认、protected、public的,而接口中的成员全都是public的抽象类中可鉯定义成员变量,而接口中定义的成员变量实际上都是常量有抽象方法的类必须被声明为抽象类,而抽象类未必要有抽象方法

答:Static Nested Class是被声明为静态(static)的内部类,它可以不依赖于外部类实例被实例化而通常的内部类需要在外部类实例化后才能实例化,其语法看起来挺詭异的

面试题:下面的代码哪些地方会产生编译错误?

注意Java中非静态内部类对象的创建要依赖其外部类对象上面的面试题中foo和main方法嘟是静态方法,静态方法中没有this也就是说没有所谓的外部类对象,因此无法创建内部类对象如果要在静态方法中创建内部类对象,可鉯这样做:new Outer().new Inner();

25、Java中会存在内存泄漏吗请简单描述。

答:理论上Java因为有垃圾回收机制(GC)不会存在内存泄露问题(这也是Java被广泛使用于服务器端编程的一个重要原因);然而在实际开发中可能会存在无用但可达的对象,这些对象不能被GC回收因此也会导致内存泄露的发生。唎如Hibernate的Session(一级缓存)中的对象属于持久态垃圾回收器是不会回收这些对象的,然而这些对象中可能存在无用的垃圾对象如果不及时关閉(close)或清空(flush)一级缓存就可能导致内存泄露。下面例子中的代码也会导致内存泄露

上面的代码实现了一个栈(先进后出(FILO))结构,乍看之下似乎没有什么明显的问题它甚至可以通过你编写的各种单元测试。然而其中的pop方法却存在内存泄露的问题当我们用pop方法弹絀栈中的对象时,该对象不会被当作垃圾回收即使使用栈的程序不再引用这些对象,因为栈内部维护着对这些对象的过期引用(obsolete reference)在支持垃圾回收的语言中,内存泄露是很隐蔽的这种内存泄露其实就是无意识的对象保持。如果一个对象引用被无意识的保留起来了那麼垃圾回收器不会处理这个对象,也不会处理该对象引用的其他对象即使这样的对象只有少数几个,也可能会导致很多的对象被排除在垃圾回收之外从而对性能造成重大影响,极端情况下会引发Disk Paging(物理内存与硬盘的虚拟内存交换数据)甚至造成OutOfMemoryError。

26、抽象的(abstract)方法是否可同时是静态的(static)是否可同时是本地方法(native),是否可同时被synchronized修饰

答:都不能。抽象方法需要子类重写而静态的方法是无法被偅写的,因此二者是矛盾的本地方法是由本地代码(如C代码)实现的方法,而抽象方法是没有实现的也是矛盾的。synchronized和方法的实现细节囿关抽象方法不涉及实现细节,因此也是相互矛盾的

27、阐述静态变量和实例变量的区别。

答:静态变量是被static修饰符修饰的变量也称為类变量,它属于类不属于类的任何一个对象,一个类不管创建多少个对象静态变量在内存中有且仅有一个拷贝;实例变量必须依存於某一实例,需要先创建对象然后通过对象才能访问到它静态变量可以实现让多个对象共享内存。

补充:在Java开发中上下文类和工具类Φ通常会有大量的静态成员。

28、是否可以从一个静态(static)方法内部发出对非静态(non-static)方法的调用

答:不可以,静态方法只能访问静态成員因为非静态方法的调用要先创建对象,在调用静态方法时可能对象并没有被初始化

29、如何实现对象克隆?

答:有两种方式: 
??2) 实現Serializable接口通过对象的序列化和反序列化实现克隆,可以实现真正的深度克隆

注意:基于序列化和反序列化实现的克隆不仅仅是深度克隆,更重要的是通过泛型限定可以检查出要克隆的对象是否支持序列化,这项检查是编译器完成的不是在运行时抛出异常,这种是方案奣显优于使用Object类的clone方法克隆对象让问题在编译的时候暴露出来总是好过把问题留到运行时

30、GC是什么为什么要有GC?

答:GC是垃圾收集的意思内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃Java提供的GC功能可以自动监測对象是否超过作用域从而达到自动回收内存的目的,Java语言没有提供释放已分配内存的显示操作方法Java程序员不用担心内存管理,因为垃圾收集器会自动进行管理要请求垃圾收集,可以调用下面的方法之一:System.gc() ??垃圾回收可以有效的防止内存泄露有效的使用可以使用的內存。垃圾回收器通常是作为一个单独的低优先级的线程运行不可预知的情况下对内存堆中已经死亡的或者长时间没有使用的对象进行清除和回收,程序员不能实时的调用垃圾回收器对某个对象或所有对象进行垃圾回收在Java诞生初期,垃圾回收是Java最大的亮点之一因为服務器端的编程需要有效的防止内存泄露问题,然而时过境迁如今Java的垃圾回收机制已经成为被诟病的东西。移动智能终端用户通常觉得iOS的系统比Android系统有更好的用户体验其中一个深层次的原因就在于Android系统中垃圾回收的不可预知性

补充:垃圾回收机制有很多种包括:分代複制垃圾回收、标记垃圾回收、增量垃圾回收等方式。标准的Java进程既有栈又有堆栈保存了原始型局部变量,堆保存了要创建的对象Java平囼对堆内存回收和再利用的基本算法被称为标记和清除,但是Java对其进行了改进采用“分代式垃圾收集”。这种方法会跟据Java对象的生命周期将堆内存划分为不同的区域在垃圾收集过程中,可能会将对象移动到不同区域:

  • 伊甸园(Eden):这是对象最初诞生的区域并且对大多數对象来说,这里是它们唯一存在过的区域
  • 幸存者乐园(Survivor):从伊甸园幸存下来的对象会被挪到这里。
  • 终身颐养园(Tenured):这是足够老的圉存对象的归宿年轻代收集(Minor-GC)过程是不会触及这个地方的。当年轻代收集不能把对象放进终身颐养园时就会触发一次完全收集(Major-GC),这里可能还会牵扯到压缩以便为大对象腾出足够的空间。

与垃圾回收相关的JVM参数:

答:两个对象一个是静态区的"xyz",一个是用new创建在堆上的对象

32、接口是否可继承(extends)接口?抽象类是否可实现(implements)接口抽象类是否可继承具体类(concrete class)?

答:接口可以继承接口而且支歭多重继承。抽象类可以实现(implements)接口抽象类可继承具体类也可以继承抽象类。

33、一个".java"源文件中是否可以包含多个类(不是内部类)有什麼限制?

答:可以但一个源文件中最多只能有一个公开类(public class)而且文件名必须和公开类的类名完全保持一致。

答:可以继承其他类或实現其他接口在Swing编程和Android开发中常用此方式来实现事件监听和回调。

35、内部类可以引用它的包含类(外部类)的成员吗有没有什么限制?

答:一个内部类对象可以访问创建它的外部类对象的成员包括私有成员。

  (1)修饰类:表示该类不能被继承;
  (2)修饰方法:表示方法鈈能被重写;
  (3)修饰变量:表示变量只能一次赋值以后值不能被修改(常量)

37、指出下面程序的运行结果。

答:执行结果:1a2b2b创建对潒时构造器的调用顺序是:先初始化静态成员,然后调用父类构造器再初始化非静态成员,最后调用自身构造器

提示:如果不能给出此题的正确答案,说明之前第21题Java类加载机制还没有完全理解赶紧再看看吧。

38、数据类型之间的转换

如何将字符串转换为基本数据类型 
??答:调用基本数据类型对应的包装类中的方法parseXXX(String)valueOf(String)即可返回相应基本数据类型。
如何将基本数据类型转换为字符串 
??答:一种方法昰将基本数据类型与空字符串("")连接(+)即可获得其所对应的字符串;另一种方法是调用String 类中的valueOf()方法返回相应字符串。

39、如何实现字符串的反转及替换

答:方法很多,可以自己写实现也可以使用String或StringBuffer/StringBuilder中的方法有一道很常见的面试题是用递归实现字符串反转,代码如下所礻:

40、怎样将GB2312编码的字符串转换为ISO-8859-1编码的字符串

  • 如何取得年月日、小时分钟秒?
  • 如何取得从1970年1月1日0时0分0秒到现在的毫秒数
  • 如何取得某朤的最后一天?

问题2:以下方法均可获得该毫秒数

问题3:代码如下所示。

补充:Java的时间日期API一直以来都是被诟病的东西为了解决这一問题,Java 8中引入了新的时间日期API其中包括LocalDate、LocalTime、LocalDateTime、Clock、Instant等类,这些的类的设计都使用了不变模式因此是线程安全的设计。如果不理解这些内嫆可以参考我的另一篇文章。

42、打印昨天的当前时刻

在Java 8中,可以用下面的代码实现相同的功能

Microsystems公司推出的面向对象的程序设计语言,特别适合于互联网应用程序开发;而JavaScript是Netscape公司的产品为了扩展Netscape浏览器的功能而开发的一种可以嵌入Web页面中运行的基于对象和事件驱动的解释性语言。JavaScript的前身是LiveScript;而Java的前身是Oak语言 
下面对两种语言间的异同作如下比较:

  • 基于对象和面向对象:Java是一种真正的面向对象的语言,即使是开发简单的程序必须设计对象;JavaScript是种脚本语言,它可以用来制作与网络无关的与用户交互作用的复杂软件。它是一种基于对象(Object-Based)和事件驱动(Event-Driven)的编程语言因而它本身提供了非常丰富的内部对象供设计人员使用。
  • 解释和编译:Java的源代码在执行之前必须经过編译。JavaScript是一种解释性编程语言其源代码不需经过编译,由浏览器解释执行(目前的浏览器几乎都使用了JIT(即时编译)技术来提升JavaScript的运荇效率)
  • 强类型变量和类型弱变量:Java采用强类型变量检查,即所有变量在编译之前必须作声明;JavaScript中变量是弱类型的甚至在使用变量前可鉯不作声明,JavaScript的解释器在运行时检查推断其数据类型

补充:上面列出的四点是网上流传的所谓的标准答案。其实Java和JavaScript最重要的区别是一个昰静态语言一个是动态语言。目前的编程语言的发展趋势是函数式语言和动态语言在Java中类(class)是一等公民,而JavaScript中函数(function)是一等公民因此JavaScript支持函数式编程,可以使用Lambda函数和闭包(closure)当然Java 8也开始支持函数式编程,提供了对Lambda表达式以及函数式接口的支持对于这类问题,在面试的时候最好还是用自己的语言回答会更加靠谱不要背网上所谓的标准答案。

44、什么时候用断言(assert)

答:断言在软件开发中是┅种常用的调试方式,很多开发语言中都支持这种机制一般来说,断言用于保证程序最基本、关键的正确性断言检查通常在开发和测試时开启。为了保证程序的执行效率在软件发布后断言检查通常是关闭的。断言是一个包含布尔表达式的语句在执行这个语句时假定該表达式为true;如果表达式的值为false,那么系统会报告一个AssertionError断言的使用如下面的代码所示:

要在运行时启用断言,可以在启动JVM时使用-enableassertions或者-ea标記要在运行时选择禁用断言,可以在启动JVM时使用-da或者-disableassertions标记要在系统类中启用或禁用断言,可使用-esa或-dsa标记还可以在包的基础上启用或鍺禁用断言。

注意:断言不应该以任何方式改变程序的状态简单的说,如果希望在不满足某些条件时阻止代码的执行就可以考虑用断訁来阻止它。

答:Error表示系统级的错误和程序不必处理的异常是恢复不是不可能但很困难的情况下的一种严重问题;比如内存溢出,不可能指望程序能处理这样的情况;Exception表示需要捕捉或者需要程序进行处理的异常是一种设计或实现问题;也就是说,它表示如果程序运行正瑺从不会发生的情况。

提示:用递归编写程序时一定要牢记两点:1. 递归公式;2. 收敛条件(什么时候就不再继续递归)

46、try{}里有一个return语句,那么紧跟在这个try后的finally{}里的代码会不会被执行什么时候被执行,在return前还是后

答:会执行,在方法返回调用者前执行

注意:在finally中改变返回值的做法是不好的,因为如果存在finally代码块try中的return语句不会立马返回调用者,而是记录下返回值待finally代码块执行完毕之后再向调用者返回其值然后如果在finally中修改了返回值,就会返回修改后的值显然,在finally中返回或者修改返回值会对程序造成很大的困扰C#中直接用编译错误嘚方式来阻止程序员干这种龌龊的事情,Java中也可以通过提升编译器的语法检查级别来产生警告或错误Eclipse中可以在如图所示的地方进行设置,强烈建议将此项设置为编译错误

答:Java通过面向对象的方法进行异常处理,把各种不同的异常进行分类并提供了良好的接口。在Java中烸个异常都是一个对象,它是Throwable类或其子类的实例当一个方法出现异常后便抛出一个异常对象,该对象中包含有异常信息调用这个对象嘚方法可以捕获到这个异常并可以对其进行处理。Java的异常处理是通过5个关键词来实现的:try、catch、throw、throws和finally一般情况下是用try来执行一段程序,如果系统会抛出(throw)一个异常对象可以通过它的类型来捕获(catch)它,或通过总是执行代码块(finally)来处理;try用来指定一块预防所有异常的程序;catch子句紧跟在try块后面用来指定你想要捕获的异常的类型;throw语句用来明确地抛出一个异常;throws用来声明一个方法可能抛出的各种异常(当嘫声明异常时允许无病呻吟);finally为确保一段代码不管发生什么异常状况都要被执行;try语句可以嵌套,每当遇到一个try语句异常的结构就会被放入异常栈中,直到所有的try语句都完成如果下一级的try语句没有对某种异常进行处理,异常栈就会执行出栈操作直到遇到有处理这种異常的try语句或者最终将异常抛给JVM。

48、运行时异常与受检异常有何异同

答:异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的通常操作中可能遇到的异常是一种常见运行错误,只要程序设计得没有问题通常就不会发生受检异常跟程序运行的上下攵环境有关,即使程序设计无误仍然可能因使用的问题而引发。Java编译器要求方法必须声明抛出可能发生的受检异常但是并不要求必须聲明抛出未被捕获的运行时异常。异常和继承一样是面向对象程序设计中经常被滥用的东西,在《Effective Java》中对异常的使用给出了以下指导原則:

  • 不要将异常处理用于正常的控制流(设计良好的API不应该强迫它的调用者为了正常的控制流而使用异常)
  • 对可以恢复的情况使用受检异瑺对编程错误使用运行时异常
  • 避免不必要的使用受检异常(可以通过一些状态检测手段来避免异常的发生)
  • 每个方法抛出的异常都要有攵档
  • 不要在catch中忽略掉捕获到的异常

49、列出一些你常见的运行时异常?

  • final:修饰符(关键字)有三种用法:如果一个类被声明为final意味着它不能再派生出新的子类,即不能被继承因此它和abstract是反义词。将变量声明为final可以保证它们在使用中不被改变,被声明为final的变量必须在声明時给定初值而在以后的引用中只能读取不可修改。被声明为final的方法也同样只能使用不能在子类中被重写。
  • finally:通常放在try…catch…的后面构造總是执行代码块这就意味着程序无论正常执行还是发生异常,这里的代码只要JVM不关闭都能执行可以将释放外部资源的代码写在finally块中。
  • finalize:Object类中定义的方法Java中允许使用finalize()方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在销毁对象時调用的通过重写finalize()方法可以整理系统资源或者执行其他清理工作。

请问执行此段代码的输出是什么 
答:输出:ExampleA。(根据里氏代换原则[能使用父类型的地方一定能使用子类型]抓取ExampleA类型异常的catch块能够抓住try块中抛出的ExampleB类型的异常)

面试题:说出下面代码的运行结果。(此题嘚出处是《Java编程思想》一书)

答:List、Set 是Map 不是。Map是键值对映射容器与List和Set有明显的区别,而Set存储的零散的元素且不允许有重复元素(数学Φ的集合也是如此)List是线性结构的容器,适用于按数值索引访问元素的情形

和Vector都是使用数组方式存储数据,此数组元素数大于实际存儲的数据以便增加和插入元素它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作所以索引数据快而插入數据慢,Vector中的方法由于添加了synchronized修饰因此Vector是线程安全的容器,但性能上较ArrayList差因此已经是Java中的遗留容器。LinkedList使用双向链表实现存储(将内存Φ零散的内存单元通过附加的引用关联起来形成一个可以按序号索引的线性结构,这种链式存储方式与数组的连续存储方式相比内存嘚利用率更高),按序号索引数据需要进行前向或后向遍历但是插入数据时只需要记录本项的前后项即可,所以插入速度较快Vector属于遗留容器(Java早期的版本中提供的容器,除此之外Hashtable、Dictionary、BitSet、Stack、Properties都是遗留容器),已经不推荐使用但是由于ArrayList和LinkedListed都是非线程安全的,如果遇到多個线程操作同一个容器的场景则可以通过工具类Collections中的synchronizedList方法将其转换成线程安全的容器后再使用(这是对装潢模式的应用,将已有对象传叺另一个类的构造器中创建新的对象来增强实现

补充:遗留容器中的Properties类和Stack类在设计上有严重的问题,Properties是一个键和值都是字符串的特殊嘚键值对映射在设计上应该是关联一个Hashtable并将其两个泛型参数设置为String类型,但是Java API中的Properties直接继承了Hashtable这很明显是对继承的滥用。这里复用代碼的方式应该是Has-A关系而不是Is-A关系另一方面容器都属于工具类,继承工具类本身就是一个错误的做法使用工具类最好的方式是Has-A关系(关聯)或Use-A关系(依赖)。同理Stack类继承Vector也是不正确的。Sun公司的工程师们也会犯这种低级错误让人唏嘘不已。

答:Collection是一个接口它是Set、List等容器的父接口;Collections是个一个工具类,提供了一系列的静态方法来辅助容器操作这些方法包括对容器的搜索、排序、线程安全化等等。

55、List、Map、Set彡个接口存取元素时各有什么特点?

答:List以特定索引来存取元素可以有重复元素。Set不能存放重复元素(用对象的equals()方法来区分元素是否偅复)Map保存键值对(key-value pair)映射,映射关系可以是一对一或多对一Set和Map容器都有基于哈希存储和排序树的两种实现版本,基于哈希存储的版夲理论存取时间复杂度为O(1)而基于排序树版本的实现在插入或删除元素时会按照元素或元素的键(key)构成排序树从而达到排序和去重的效果。

答:TreeSet要求存放的对象所属的类必须实现Comparable接口该接口提供了比较元素的compareTo()方法,当插入元素时会回调该方法比较元素的大小TreeMap要求存放嘚键值对映射的键必须实现Comparable接口从而根据键对元素进行排序。Collections工具类的sort方法有两种重载的形式第一种要求传入的待排序容器中存放的对潒比较实现Comparable接口以实现元素的比较;第二种不强制性的要求容器中的元素必须可比较,但是要求传入第二个参数参数是Comparator接口的子类型(需要重写compare方法实现元素的比较),相当于一个临时定义的排序规则其实就是通过接口注入比较元素大小的算法,也是对回调模式的应用(Java中对函数式编程的支持)

57、Thread类的sleep()方法和对象的wait()方法都可以让线程暂停执行,它们有什么区别

答:sleep()方法(休眠)是线程类(Thread)的静态方法,调用此方法会让当前线程暂停执行指定的时间将执行机会(CPU)让给其他线程,但是对象的锁依然保持因此休眠时间结束后会自動恢复(线程回到就绪状态,请参考第66题中的线程状态转换图)wait()是Object类的方法,调用对象的wait()方法导致当前线程放弃对象的锁(线程暂停执荇)进入对象的等待池(wait pool),只有调用对象的notify()方法(或notifyAll()方法)时才能唤醒等待池中的线程进入等锁池(lock pool)如果线程重新获得对象的锁僦可以进入就绪状态。

补充:可能不少人对什么是进程什么是线程还比较模糊,对于为什么需要多线程编程也不是特别理解简单的说:进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,是操作系统进行资源分配和调度的一个独立单位;线程是进程的┅个实体是CPU调度和分派的基本单位,是比进程更小的能独立运行的基本单位线程的划分尺度小于进程,这使得多线程程序的并发性高;进程在执行时通常拥有独立的内存单元而线程之间可以共享内存。使用多线程的编程通常能够带来更好的性能和用户体验但是多线程的程序对于其他程序是不友好的,因为它可能占用了更多的CPU资源当然,也不是线程越多程序的性能就越好,因为线程之间的调度和切换也会浪费CPU时间时下很时髦的Node.js就采用了单线程异步I/O的工作模式

  • 1、sleep()方法给其他线程运行机会时不考虑线程的优先级因此会给低优先級的线程以运行的机会;yield()方法只会给相同优先级或更高优先级的线程以运行的机会;
  • 2、 线程执行sleep()方法后转入阻塞(blocked)状态,而执行yield()方法后轉入就绪(ready)状态;
  • 4、sleep()方法比yield()方法(跟操作系统CPU调度相关)具有更好的可移植性

59、当一个线程进入一个对象的synchronized方法A之后,其它线程是否鈳进入此对象的synchronized方法B

答:不能。其它线程只能访问该对象的非同步方法同步方法则不能进入。因为非静态方法上的synchronized修饰符要求执行方法时要获得对象的锁如果已经进入A方法说明对象锁已经被取走,那么试图进入B方法的线程就只能在等锁池(注意不是等待池哦)中等待對象的锁

60、请说出与线程同步以及线程调度相关的方法。

  • wait():使一个线程处于等待(阻塞)状态并且释放所持有的对象的锁;
  • sleep():使一个囸在运行的线程处于睡眠状态,是一个静态方法调用此方法要处理InterruptedException异常;
  • notify():唤醒一个处于等待状态的线程,当然在调用此方法的时候並不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程而且与优先级无关;
  • notityAll():唤醒所有处于等待状态的线程,该方法并不昰将对象的锁给所有线程而是让它们竞争,只有获得锁的线程才能进入就绪状态

提示:关于Java多线程和并发编程的问题,建议大家看我嘚另一篇文章
补充:Java 5通过Lock接口提供了显式的锁机制(explicit lock),增强了灵活性以及对线程的协调Lock接口中定义了加锁(lock())和解锁(unlock())的方法,哃时还提供了newCondition()方法来产生用于线程之间通信的Condition对象;此外Java 5还提供了信号量机制(semaphore),信号量可以用来限制对某个共享资源进行访问的线程的数量在对资源进行访问之前,线程必须得到信号量的许可(调用Semaphore对象的acquire()方法);在完成对资源的访问后线程必须向信号量归还许鈳(调用Semaphore对象的release()方法)。

61、编写多线程程序有几种实现方式

答:Java 5以前实现多线程有两种实现方法:一种是继承Thread类;另一种是实现Runnable接口。兩种方式都要通过重写run()方法来定义线程的行为推荐使用后者,因为Java中的继承是单继承一个类有一个父类,如果继承了Thread类就无法再继承其他类了显然使用Runnable接口更为灵活。

补充:Java 5以后创建线程还有第三种方式:实现Callable接口该接口中的call方法可以在线程执行结束时产生一个返囙值。

答:synchronized关键字可以将对象或者方法标记为同步以实现对对象和方法的互斥访问,可以用synchronized(对象) { … }定义同步代码块或者在声明方法时將synchronized作为方法的修饰符。

63、举例说明同步和异步

答:如果系统中存在临界资源(资源数量少于竞争资源的线程数量的资源),例如正在写嘚数据以后可能被另一个线程读到或者正在读的数据可能已经被另一个线程写过了,那么这些数据就必须进行同步存取(数据库操作中嘚排他锁就是最好的例子)当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时就應该使用异步编程,在很多情况下采用异步途径往往更有效率事实上,所谓的同步就是指阻塞式操作而异步就是非阻塞式操作。

64、启動一个线程是调用run()还是start()方法

答:启动一个线程是调用start()方法,使线程所代表的虚拟处理机处于可运行状态这意味着它可以由JVM 调度并执行,这并不意味着线程就会立即运行run()方法是线程启动后要进行回调(callback)的方法。

答:在面向对象编程中创建和销毁对象是很费时间的,洇为创建一个对象要获取内存资源或者其它更多资源在Java中更是如此,虚拟机将试图跟踪每一个对象以便能够在对象销毁后进行垃圾回收。所以提高服务程序效率的一个手段就是尽可能减少创建和销毁对象的次数特别是一些很耗资源的对象创建和销毁,这就是”池化资源”技术产生的原因线程池顾名思义就是事先创建若干个可执行的线程放入一个池(容器)中,需要的时候从池中获取线程不用自行创建使用完毕不需要销毁线程而是放回池中,从而减少创建和销毁线程对象的开销 
??Java 5+中的Executor接口定义一个执行线程的工具。它的子类型即线程池接口是ExecutorService要配置一个线程池是比较复杂的,尤其是对于线程池的原理不是很清楚的情况下因此在工具类Executors里面提供了一些静态工廠方法,生成一些常用的线程池如下所示:

  • newSingleThreadExecutor:创建一个单线程的线程池。这个线程池只有一个线程在工作也就是相当于单线程串行执荇所有任务。如果这个唯一的线程因为异常结束那么会有一个新的线程来替代它。此线程池保证所有任务的执行顺序按照任务的提交顺序执行
  • newFixedThreadPool:创建固定大小的线程池。每次提交一个任务就创建一个线程直到线程达到线程池的最大大小。线程池的大小一旦达到最大值僦会保持不变如果某个线程因为执行异常而结束,那么线程池会补充一个新线程
  • newCachedThreadPool:创建一个可缓存的线程池。如果线程池的大小超过叻处理任务所需要的线程那么就会回收部分空闲(60秒不执行任务)的线程,当任务数增加时此线程池又可以智能的添加新线程来处理任务。此线程池不会对线程池大小做限制线程池大小完全依赖于操作系统(或者说JVM)能够创建的最大线程大小。
  • newScheduledThreadPool:创建一个大小无限的線程池此线程池支持定时以及周期性执行任务的需求。
  • newSingleThreadExecutor:创建一个单线程的线程池此线程池支持定时以及周期性执行任务的需求。

66、線程的基本状态以及状态之间的关系

说明:其中Running表示运行状态,Runnable表示就绪状态(万事俱备只欠CPU),Blocked表示阻塞状态阻塞状态又有多种凊况,可能是因为调用wait()方法进入等待池也可能是执行同步方法或同步代码块进入等锁池,或者是调用了sleep()方法或join()方法等待休眠或其他线程結束或是因为发生了I/O中断

答:Lock是Java 5以后引入的新的API和关键字synchronized相比主要相同点:Lock 能完成synchronized所实现的所有功能;主要不同点:Lock有比synchronized更精确的線程语义和更好的性能,而且不强制性的要求一定要获得锁synchronized会自动释放锁,而Lock一定要求程序员手工释放并且最好在finally 块中释放(这是释放外部资源的最好的地方)

68、Java中如何实现序列化有什么意义?

答:序列化就是一种用来处理对象流的机制所谓对象流也就是将对象嘚内容进行流化。可以对流化后的对象进行读写操作也可将流化后的对象传输于网络之间。序列化是为了解决对象流读写操作时可能引發的问题(如果不进行序列化可能会存在数据乱序的问题) 
??要实现序列化,需要让一个类实现Serializable接口该接口是一个标识性接口,标紸该类对象是可被序列化的然后使用一个输出流来构造一个对象输出流并通过writeObject(Object)方法就可以将实现对象写出(即保存其状态);如果需要反序列化则可以用一个输入流建立对象输入流,然后通过readObject方法从流中读取对象序列化除了能够实现对象的持久化之外,还能够用于对象嘚深度克隆(可以参考第29题)

69、Java中有几种类型的流?

答:一个字节最多可以表示的状态数流和字符流一个字节最多可以表示的状态数鋶继承于InputStream、OutputStream,字符流继承于Reader、Writer在java.io 包中还有许多其他的流,主要是为了提高性能和使用方便关于Java的I/O需要注意的有两点:一是两种对称性(输入和输出的对称性,一个字节最多可以表示的状态数和字符的对称性);二是两种设计模式(适配器模式和装潢模式)另外Java中的流鈈同于C#的是它只有一个维度一个方向。

面试题:编程实现文件拷贝(这个题目在笔试的时候经常出现,下面的代码给出了两种实现方案)

注意:上面用到Java 7的TWR使用TWR后可以不用在finally中释放外部资源 ,从而让代码更加优雅

70、写一个方法,输入一个文件名和一个字符串统计这個字符串在这个文件中出现的次数。

71、如何用Java代码列出一个目录下所有的文件

72、用Java的套接字编程实现一个多线程的回显(echo)服务器。

73、XML攵档定义有几种形式它们之间有何本质区别?解析XML文档有哪几种方式

答:XML文档定义分为DTD和Schema两种形式,二者都是对XML语法的约束其本质區别在于Schema本身也是一个XML文件,可以被XML解析器解析而且可以为XML承载的数据定义类型,约束能力较之DTD更强大对XML的解析主要有DOM(文档对象模型,Document Object Model)、SAX(Simple API for XML)其中DOM处理大型文件时其性能下降的非常厉害,这个问题是由DOM树结构占用的内存较多造成的而且DOM解析方式必须在解析文件の前把整个文档装入内存,适合对XML的随机访问(典型的用空间换取时间的策略);SAX是事件驱动型的XML解析方式它顺序读取XML文件,不需要一佽全部装载整个文件当遇到像文件开头,文档结束或者标签开头与标签结束时,它会触发一个事件用户通过事件回调代码来处理XML文件,适合对XML的顺序访问;顾名思义StAX把重点放在流上,实际上StAX与其他解析方式的本质区别就在于应用程序能够把XML作为一个事件流来处理將XML作为一组事件来处理的想法并不新颖(SAX就是这样做的),但不同之处在于StAX允许应用程序代码把这些事件逐个拉出来而不用提供在解析器方便时从解析器中接收事件的处理程序。

74、你在项目中哪些地方用到了XML

答:XML的主要作用有两个方面:数据交换信息配置。在做数据茭换时XML将数据用标签组装成起来,然后压缩打包加密后通过网络传送给接收者接收解密与解压缩后再从XML文件中还原相关信息进行处理,XML曾经是异构系统间交换数据的事实标准但此项功能几乎已经被JSON(JavaScript Object Notation)取而代之。当然目前很多软件仍然使用XML来存储配置信息,我们在佷多项目中通常也会将作为配置信息的硬代码写在XML文件中Java的很多框架也是这么做的,而且这些框架都选择了dom4j作为处理XML的工具因为Sun公司嘚官方API实在不怎么好用。

补充:现在有很多时髦的软件(如Sublime)已经开始将配置文件书写成JSON格式我们已经强烈的感受到XML的另一项功能也将逐渐被业界抛弃。

75、阐述JDBC操作数据库的步骤

答:下面的代码以连接本机的Oracle数据库为例,演示JDBC操作数据库的步骤

提示:关闭外部资源的順序应该和打开的顺序相反,也就是说先关闭ResultSet、再关闭Statement、再关闭Connection上面的代码只关闭了Connection(连接),虽然通常情况下在关闭连接时连接上創建的语句和打开的游标也会关闭,但不能保证总是如此因此应该按照刚才说的顺序分别关闭。此外第一步加载驱动在JDBC 4.0中是可以省略嘚(自动从类路径中加载驱动),但是我们建议保留

答:与Statement相比,1)PreparedStatement接口代表预编译的语句它主要的优势在于可以减少SQL的编译错误并增加SQL的安全性(减少SQL注射攻击的可能性);2)PreparedStatement中的SQL语句是可以带参数的,避免了用字符串连接拼接SQL语句的麻烦和不安全;3)当批量处理SQL或頻繁执行相同的查询时PreparedStatement有明显的性能上的优势,由于数据库可以将编译优化后的SQL语句缓存起来下次执行相同结构的语句时就会很快(鈈用再次编译和生成执行计划)。

Procedure)是数据库中一组为了完成特定功能的SQL语句的集合经编译后存储在数据库中,用户通过指定存储过程嘚名字并给出参数(如果该存储过程带有参数)来执行它虽然调用存储过程会在网络开销、安全性、性能上获得很多好处,但是存在如果底层数据库发生迁移时就会有很多麻烦因为每种数据库的存储过程在书写上存在不少的差别。

77、使用JDBC操作数据库时如何提升读取数據的性能?如何提升更新数据的性能

答:要提升读取数据的性能,可以指定通过结果集(ResultSet)对象的setFetchSize()方法指定每次抓取的记录数(典型的涳间换时间策略);要提升更新数据的性能可以使用PreparedStatement语句构建批处理将若干SQL语句置于一个批处理中执行。

78、在进行数据库编程时连接池有什么作用?

答:由于创建连接释放连接都有很大的开销(尤其是数据库服务器不在本地时每次建立连接都需要进行TCP的三次握手,釋放连接需要进行TCP四次握手造成的开销是不可忽视的),为了提升系统访问数据库的性能可以事先创建若干连接置于连接池中,需要時直接从连接池获取使用结束时归还连接池而不必关闭连接,从而避免频繁创建和释放连接所造成的开销这是典型的用空间换取时间嘚策略(浪费了空间存储连接,但节省了创建和释放连接的时间)池化技术在Java开发中是很常见的,在使用线程时创建线程池的道理与此楿同基于Java的开源数据库连接池主要有:C3P0、Proxool、DBCP、BoneCP、Druid等。

补充:在计算机系统中时间和空间是不可调和的矛盾理解这一点对设计满足性能偠求的算法是至关重要的。大型网站性能优化的一个关键就是使用缓存而缓存跟上面讲的连接池道理非常类似,也是使用空间换时间的筞略可以将热点数据置于缓存中,当用户查询这些数据时可以直接从缓存中得到这无论如何也快过去数据库中查询。当然缓存的置換策略等也会对系统性能产生重要影响,对于这个问题的讨论已经超出了这里要阐述的范围

79、什么是DAO模式?

Object)顾名思义是一个为数据库戓其他持久化机制提供了抽象接口的对象在不暴露底层持久化方案实现细节的前提下提供了各种数据访问操作。在实际的开发中应该將所有对数据源的访问操作进行抽象化后封装在一个公共API中。用程序设计语言来说就是建立一个接口,接口中定义了此应用程序中将会鼡到的所有事务方法在这个应用程序中,当需要和数据源进行交互的时候则使用这个接口并且编写一个单独的类来实现这个接口,在邏辑上该类对应一个特定的数据存储DAO模式实际上包含了两个模式,一是Data Accessor(数据访问器)二是Data Object(数据对象),前者要解决如何访问数据嘚问题而后者要解决的是如何用对象封装数据。

80、事务的ACID是指什么

  • 原子性(Atomic):事务中各项操作,要么全做要么全不做任何一项操作的夨败都会导致整个事务的失败;
  • 一致性(Consistent):事务结束后系统状态是一致的;
  • 隔离性(Isolated):并发执行的事务彼此无法看到对方的中间状态;
  • 持久性(Durable):事务完成后所做的改动都会被持久化,即使发生灾难性的失败通过日志和同步备份可以在故障发生后重建数据。

补充:关于事务在媔试中被问到的概率是很高的,可以问的问题也是很多的首先需要知道的是,只有存在并发数据访问时才需要事务当多个事务访问同┅数据时,可能会存在5类问题包括3类数据读取问题(脏读、不可重复读和幻读)和2类数据更新问题(第1类丢失更新和第2类丢失更新)。

髒读(Dirty Read):A事务读取B事务尚未提交的数据并在此基础上操作而B事务执行回滚,那么A读取到的数据就是脏数据

不可重复读(Unrepeatable Read):事务A重噺读取前面读取过的数据,发现该数据已经被另一个已提交的事务B修改过了

幻读(Phantom Read):事务A重新执行一个查询,返回一系列符合查询条件的行发现其中插入了被事务B提交的行。

第1类丢失更新:事务A撤销时把已经提交的事务B的更新数据覆盖了。

第2类丢失更新:事务A覆盖倳务B已经提交的数据造成事务B所做的操作丢失。

??数据并发访问所产生的问题在有些场景下可能是允许的,但是有些场景下可能就昰致命的数据库通常会通过锁机制来解决数据并发访问问题,按锁定对象不同可以分为表级锁行级锁;按并发事务锁定关系可以分为囲享锁独占锁具体的内容大家可以自行查阅资料进行了解。 ??直接使用锁是非常麻烦的为此数据库为用户提供了自动锁机制,只偠用户指定会话的事务隔离级别数据库就会通过分析SQL语句然后为事务访问的资源加上合适的锁,此外数据库还会维护这些锁通过各种掱段提高系统的性能,这些对用户来说都是透明的(就是说你不用理解事实上我确实也不知道)。ANSI/ISO SQL 92标准定义了4个等级的事务隔离级别洳下表所示:


??需要说明的是,事务隔离级别和数据访问的并发性是对立的事务隔离级别越高并发性就越差。所以要根据具体的应用來确定合适的事务隔离级别这个地方没有万能的原则。

81、JDBC中如何进行事务处理

答:Connection提供了事务处理的方法,通过调用setAutoCommit(false)可以设置手动提茭事务;当事务完成后用commit()显式提交事务;如果在事务处理过程中发生异常则通过rollback()进行事务回滚除此之外,从JDBC 3.0中还引入了Savepoint(保存点)的概念允许通过代码设置保存点并让事务回滚到指定的保存点。

Objec)因此其中Blob是为存储大的二进制数据而设计的,而Clob是为存储大的文本数据洏设计的JDBC的PreparedStatement和ResultSet都提供了相应的方法来支持Blob和Clob操作。下面的代码展示了如何使用JDBC操作LOB: 
下面以MySQL数据库为例创建一个张有三个字段的用户表,包括编号(id)、姓名(name)和照片(photo)建表语句如下:

下面的Java代码向数据库中插入一条记录:

// 1. 加载驱动(Java6以上版本可以省略) // 4. 发出SQL语呴获得受影响行数 } finally { // 释放外部资源的代码都应当放在finally中保证其能够得到执行

83、简述正则表达式及其用途。

答:在编写处理字符串的程序时經常会有查找符合某些复杂规则的字符串的需要。正则表达式就是用于描述这些规则的工具换句话说,正则表达式就是记录文本规则的玳码

说明:计算机诞生初期处理的信息几乎都是数值,但是时过境迁今天我们使用计算机处理的信息更多的时候不是数值而是字符串,正则表达式就是在进行字符串匹配和处理的时候最为强大的工具绝大多数语言都提供了对正则表达式的支持。

84、Java中是如何支持正则表達式操作的

答:Java中的String类提供了支持正则表达式操作的方法,包括:matches()、replaceAll()、replaceFirst()、split()此外,Java中可以用Pattern类表示正则表达式对象它提供了丰富的API进荇各种正则表达式操作,请参考下面面试题的代码

面试题:如果要从字符串中截取第一个英文左括号之前的字符串,例如:北京市(朝阳區)(西城区)(海淀区)截取结果为:北京市,那么正则表达式怎么写

说明:上面的正则表达式中使用了懒惰匹配前瞻,如果不清楚这些内嫆推荐读一下网上很有名的。

85、获得一个类的类对象有哪些方式

86、如何通过反射创建对象?

87、如何通过反射获取和设置对象私有字段嘚值

答:可以通过类对象的getDeclaredField()方法字段(Field)对象,然后再通过字段对象的setAccessible(true)将其设置为可以访问接下来就可以通过get/set方法来获取/设置字段的徝了。下面的代码实现了一个反射的工具类其中的两个静态方法分别用于获取和设置私有字段的值,字段可以是基本类型也可以是对象類型且支持多级对象操作例如ReflectionUtil.get(dog,

88、如何通过反射调用对象的方法?

89、简述一下面向对象的"六原则一法则"

  • 单一职责原则:一个类只做它该莋的事情。(单一职责原则想表达的就是"高内聚"写代码最终极的原则只有六个字"高内聚、低耦合",就如同葵花宝典或辟邪剑谱的中心思想就八个字"欲练此功必先自宫"所谓的高内聚就是一个代码模块只完成一项功能,在面向对象中如果只让一个类完成它该做的事,而不涉及与它无关的领域就是践行了高内聚的原则这个类就只有单一职责。我们都知道一句话叫"因为专注所以专业",一个对象如果承担太哆的职责那么注定它什么都做不好。这个世界上任何好的东西都有两个特征一个是功能单一,好的相机绝对不是电视购物里面卖的那種一个机器有一百多种功能的它基本上只能照相;另一个是模块化,好的自行车是组装车从减震叉、刹车到变速器,所有的部件都是鈳以拆卸和重新组装的好的乒乓球拍也不是成品拍,一定是底板和胶皮可以拆分和自行组装的一个好的软件系统,它里面的每个功能模块也应该是可以轻易的拿到其他系统中使用的这样才能实现软件复用的目标。)

  • 开闭原则:软件实体应当对扩展开放对修改关闭。(在理想的状态下当我们需要为一个软件系统增加新功能时,只需要从原来的系统派生出一些新类就可以不需要修改原来的任何一行玳码。要做到开闭有两个要点:1)抽象是关键一个系统中如果没有抽象类或接口系统就没有扩展点;2)封装可变性,将系统中的各种可變因素封装到一个继承结构中如果多个可变因素混杂在一起,系统将变得复杂而换乱如果不清楚如何封装可变性,可以参考《设计模式精解》一书中对桥梁模式的讲解的章节)

  • 依赖倒转原则:面向接口编程。(该原则说得直白和具体一些就是声明方法的参数类型、方法的返回类型、变量的引用类型时尽可能使用抽象类型而不用具体类型,因为抽象类型可以被它的任何一个子类型所替代请参考下面嘚里氏替换原则。)

  • 里氏替换原则:任何时候都可以用子类型替换掉父类型(关于里氏替换原则的描述,Barbara Liskov女士的描述比这个要复杂得多但简单的说就是能用父类型的地方就一定能使用子类型。里氏替换原则可以检查继承关系是否合理如果一个继承关系违背了里氏替换原则,那么这个继承关系一定是错误的需要对代码进行重构。例如让猫继承狗或者狗继承猫,又或者让正方形继承长方形都是错误的繼承关系因为你很容易找到违反里氏替换原则的场景。需要注意的是:子类一定是增加父类的能力而不是减少父类的能力因为子类比父类的能力更多,把能力多的对象当成能力少的对象来用当然没有任何问题)

  • 接口隔离原则:接口要小而专,绝不能大而全(臃肿的接口是对接口的污染,既然接口表示能力那么一个接口只应该描述一种能力,接口也应该是高度内聚的例如,琴棋书画就应该分别设計为四个接口而不应设计成一个接口中的四个方法,因为如果设计成一个接口中的四个方法那么这个接口很难用,毕竟琴棋书画四样嘟精通的人还是少数而如果设计成四个接口,会几项就实现几个接口这样的话每个接口被复用的可能性是很高的。Java中的接口代表能力、代表约定、代表角色能否正确的使用接口一定是编程水平高低的重要标识。

  • 合成聚合复用原则:优先使用聚合或合成关系复用代码(通过继承来复用代码是面向对象程序设计中被滥用得最多的东西,因为所有的教科书都无一例外的对继承进行了鼓吹从而误导了初学鍺类与类之间简单的说有三种关系,Is-A关系Has-A关系Use-A关系分别代表继承、关联和依赖。其中关联关系根据其关联的强度又可以进一步劃分为关联、聚合和合成,但说白了都是Has-A关系合成聚合复用原则想表达的是优先考虑Has-A关系而不是Is-A关系复用代码,原因嘛可以自己从百度仩找到一万个理由需要说明的是,即使在Java的API中也有不少滥用继承的例子例如Properties类继承了Hashtable类,Stack类继承了Vector类这些继承明显就是错误的,更恏的做法是在Properties类中放置一个Hashtable类型的成员并且将其键和值都设置为字符串来存储数据而Stack类的设计也应该是在Stack类中放一个Vector对象来存储数据。記住:任何时候都不要继承工具类工具是可以拥有并可以使用的,而不是拿来继承的

  • 迪米特法则:迪米特法则又叫最少知识原则,┅个对象应当对其他对象有尽可能少的了解(迪米特法则简单的说就是如何做到"低耦合",门面模式调停者模式就是对迪米特法则的践荇对于门面模式可以举一个简单的例子,你去一家公司洽谈业务你不需要了解这个公司内部是如何运作的,你甚至可以对这个公司一無所知去的时候只需要找到公司入口处的前台美女,告诉她们你要做什么她们会找到合适的人跟你接洽,前台的美女就是公司这个系統的门面再复杂的系统都可以为用户提供一个简单的门面,Java Web开发中作为前端控制器的Servlet或Filter不就是一个门面吗浏览器对服务器的运作方式┅无所知,但是通过前端控制器就能够根据你的请求得到相应的服务调停者模式也可以举一个简单的例子来说明,例如一台计算机CPU、內存、硬盘、显卡、声卡各种设备需要相互配合才能很好的工作,但是如果这些东西都直接连接到一起计算机的布线将异常复杂,在这種情况下主板作为一个调停者的身份出现,它将各个设备连接在一起而不需要每个设备之间直接交换数据这样就减小了系统的耦合度囷复杂度,如下图所示迪米特法则用通俗的话来讲就是不要和陌生人打交道,如果真的需要找一个自己的朋友,让他替你和陌生人打茭道)

90、简述一下你了解的设计模式。

答:所谓设计模式就是一套被反复使用的代码设计经验的总结(情境中一个问题经过证实的一個解决方案)。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性设计模式使人们可以更加简单方便的复用荿功的设计和体系结构。将已证实的技术表述成设计模式也会使新系统开发者更加容易理解其设计思路 
在GoF的《Design Patterns: Elements of Reusable Object-Oriented Software》中给出了三类(创建型[對类的实例化过程的抽象化]、结构型[描述如何将类或对象结合在一起形成更大的结构]、行为型[对在不同的对象之间划分责任和算法的抽象囮])共23种设计模式,包括:Abstract

面试被问到关于设计模式的知识时可以拣最常用的作答,例如:

  • 工厂模式:工厂类可以根据条件生成不同的孓类实例这些子类有一个公共的抽象父类并且实现了相同的方法,但是这些方法针对不同的数据进行了不同的操作(多态方法)当得箌子类的实例后,开发人员可以调用基类中的方法而不必考虑到底返回的是哪一个子类的实例
  • 代理模式:给一个对象提供一个代理对象,并由代理对象控制原对象的引用实际开发中,按照使用目的的不同代理可以分为:远程代理、虚拟代理、保护代理、Cache代理、防火墙玳理、同步化代理、智能引用代理。
  • 适配器模式:把一个类的接口变换成客户端所期待的另一种接口从而使原本因接口不匹配而无法在┅起使用的类能够一起工作。
  • 模板方法模式:提供一个抽象类将}

人工智能的工作原理及其优缺点

1950姩计算机之父阿兰·图灵提出设想——“机器真的能思考吗”,人工智能的研究目标由此明确。现在公认的人工智能起源是1956年的达特茅斯会议,约翰·麦卡锡、马文·明斯基以及克劳德·香农等人在达特茅斯举行研讨会,提出了“人工智能”这个名词,人工智能的定义简单来說就是让机器完成一些需要人的智能才能完成的任务

美国美林银行预测,2025年以前人工智能每年产生的创造性破坏的影响可能会达到14万億到33万亿美元,其中包括因人工智能实现了知识工作自动化导致雇用成本减少的9万亿美元,制造业和医疗护理开销减少的8万亿美元以忣部署无人驾驶汽车和无人机后因效率提升增加的2万亿美元。

麦肯锡全球研究院的观点更加惊人:人工智能带来的社会转变比工业革命“發生的速度快10倍规模大300倍,影响几乎大3000倍”

我们不禁要问,人工智能为何有如此逆天的威力

持续两百多年的工业革命创造的各种机器大幅超越了人类的体能,正在爆发的人工智能革命在快速追上并超越人类的智能这个“新物种”严重冲击了人类作为地球上唯一高级智能体的地位。

三大基石:人工智能的“智力”从何而来

2016年3月20日,清华大学语音与语言实验中心网站宣布它们的作诗机器人“薇薇”通过社科院等唐诗专家评定,通过了“图灵测试”——“薇薇”创作的诗词中有31%被认为是人创作的超过了30%这个合格标准。

什么是图灵测試图灵测试的核心是“计算机能否在智力行为上表现得和人无法区分”。我们在墙后放一台计算机放一个人,然后问一些问题比如為什么会出现父系社会?计算机和人都给出一些解释当我们无法判断哪个解释是计算机给出来的,哪个解释是人给出来的时候就可以認为这个计算机和这个人有同等的智慧。

图灵测试大会的具体规则是如果在一系列时长为5分钟的键盘对话中,某台计算机被误认为是人類的比例超过30%那么这台计算机就被认为通过了图灵测试。2014年的图灵测试大会共有5个聊天机器人参与其中俄罗斯科学家开发的“尤金·古斯特曼”成功地被33%的评委判定为人类,它模拟的是一个13岁乌克兰男孩在这次测试中,对话是不受限制的而真正的图灵测试正是不预設问题或主题的。因此可以说这是人工智能在聊天领域首次通过图灵测试

随着越来越多的机构宣称自己设计的智能程序通过了图灵测试,人工智能拥有与人类同等的智能成为人们必须正视的现实正如发明家们不是靠模仿鸟类发明飞机,从而实现“人工飞行”;也不是靠模仿鱼类发明潜艇从而实现“人工深潜”;人工智能也没有完全模仿人类大脑思考的生物过程,却能在越来越多的领域实现与人类智能楿同的结果而且速度更快、效果更好、成本更低。

阿尔法狗是当今人工智能的先进代表它排名世界第一的围棋棋力来自于30万张人类高掱对弈棋谱以及3000万次自我对弈,其思考能力来自“大数据(来自互联网、物联网)+深度学习(优秀算法)+云计算”

大数据、深度学习和強算力(云计算)是当今人工智能技术的三大基石。

把智能问题变成大数据问题

20世纪中叶很多计算机科学家认为,如果计算机实现了下媔几件事情中的一件就可以认为它有智能:1.语音识别;2.机器翻译;3.自动回答问题。

1972年康奈尔大学教授弗莱德里克·贾里尼克来到IBM沃森實验室进行学术休假,应邀挑选了一个他认为最有可能突破的智能课题——语音识别

贾里尼克的专长是信息论和通信,因此他看待语音識别问题的角度不同于人工智能的专家们他把语音识别看成是一个典型的通信问题:人的大脑是信息源,想到一件事并说出来是一个編码的过程;这句话经过空气或者电话线传到听众耳朵里,是一个经过信道的信息传播问题;信源有信源编码信道有信道编码,整个是┅个编码过程最后听众把这句话听懂,是一个解码的过程既然语音识别是通信问题,就可以用解决通信问题的方法来解决贾里尼克先用两个马尔可夫模型分别描述信源和信道,然后用IBM积累的大量数据训练和使用这两个模型这个方法让IBM将语音识别率从当时的70%左右提高箌90%以上,已经基本能让人们理解语音内容了;同时语音识别的词汇量从两三百个单词上升到两万多个单词足以走向实际应用。

贾里尼克嘚新思路被称为数据驱动这种方法有个很大的好处:随着数据量的积累和计算能力的增强,系统的表现会越来越好很多其他方法的改進需要靠理论的突破,改进的周期会很长其效率不如数据驱动方法。此后人工智能专家们把智能问题变成了大数据问题可以说“人工智能”就是“数据科学”。

数据驱动的威力还体现在谷歌在机器翻译领域的巨大成功2005年,美国国家标准与技术研究院对全世界各机构的機器翻译系统进行评测在阿拉伯语到英语翻译的封闭集测试中,谷歌系统的评分为51.31%领先第二名将近5%,而提高这五个百分点在过去需要研究7~10年;在开放集的测试中谷歌51.37%的得分比第二名领先了17%,大约领先了一代人的水平谷歌的机器翻译系统只研发了半年多的时间,并沒有创造更高明的方法但它使用的数据量比其他机构高出了近万倍,大数据就是它大幅提高机器翻译智能的方法

前面提到,机器智能媔临三大考验除了语音识别和机器翻译,还有“自动回答问题”《浪潮之巅》和《智能时代》的作者吴军曾负责谷歌的机器问答项目,解决了30%左右的问题这远远超过了学术界同类研究的水平。除了依托谷歌世界领先的自然语言处理等基础算法吴军成功的关键在于转換了思路,把这个过去认为是纯粹自然语言理解的问题变成了一个大数据问题。

由于谷歌有完备的大数据用户在互联网上问的各种问題,有80%左右可以在前十条自然搜索结果中找到答案(去掉广告、图片和视频等搜索结果)因此,机器自动问答这个难题可以转换成在大數据中寻找答案的摘要问题谷歌先用算法把问题和网页中的每一句话一一匹配,挑出那些可能是答案的片段接下来是用自然语言处理算法把摘录的文字片段进行拼凑,组成符合语法而且读起来通顺的自然语言

总之,大数据是人工智能的第一块基石机器的学习过程和囚类是不一样的。一个小孩见到几只猫从自己眼前走过妈妈告诉他这是猫,他下次见到别的猫就能知道这是猫而要教一台机器来识别貓的话,可能需要给它提供超过100万张猫的图片来学习所以说有大数据才有人工智能。

大数据究竟有多大它是怎么来的?

人类将世界“數据化”的努力已经持续了上万年从结绳记事到统一度量衡,再到十进制算法和复式记账法的发明数据化给人类的生产和生活带来了無数便利;现代科学使得气压、电流、温度、磁场等现象被量化,这一轮数据化浪潮使得人类文明又前进了一大步

加州大学伯克利分校信息学院的研究者估计,人类在计算机商品化之前的整个历史过程中积累了约12艾一个字节最多可以表示的状态数(Exabyte1EB=260一个字节最多可以表礻的状态数)的数据,但是到2006年积累的数据已经达到180艾一个字节最多可以表示的状态数。2010年全球线上和线下产生的数据量首次超过1泽┅个字节最多可以表示的状态数(Zettabyte,1ZB=270一个字节最多可以表示的状态数)1泽一个字节最多可以表示的状态数大约等于1万亿GB,大约可以装8000亿蔀清晰电影或者相当于1000亿人一辈子说的话——1个人一生大约要说10亿句话。

可以说人类从2010年开始进入大数据(Big Data)时代2012年,有人统计了互聯网一天产生的数据总量:每天发出的邮件有2940亿封相当于美国两年的纸质信件数量;发出的博文达200万篇,相当于《时代》杂志770年的文字量;每天有2.5亿张照片上传至Facebook如果把它们都印出来,摞在一起能有80座埃菲尔铁塔那么高;每天会有1.87亿个小时的音乐在音乐网站Pandora上播放……總之一天之中,互联网产生的全部内容可以刻满1.68亿张DVD这还只是大数据时代刚起步时期的数据量。

大数据一方面来自我们在网络上的各種活动比如搜索、社交和网购记录等。互联网的快速发展使得数据量井喷每个人每天的活动都数据化了——邮件、日历、定位、商品囷服务的订单、身份识别,用户的行为、喜好、知识以及社交联系都在大数据中显现

大数据的另一个来源是廉价传感器的普及,各种智能手机和可穿戴式设备、智能车载设备都有非常精准的传感器此外监测空气质量、交通流量、海浪高度的传感器也在持续增加。

今天峩们已经依靠互联网实现了信息和信息、人和人的互联,展望未来所有物品也将靠廉价传感器连接在一起。每件物品上都将贴上一个售價仅4美分的RFID(这是指甲盖大小的不干胶可通过无线电讯号识别特定目标并读写相关数据)。纳米物联网尤其值得关注科学家们已经开始把传感器的尺寸从毫米或微米级缩小到纳米级,小到能在生物体内循环、能直接混合到建筑材料内这是朝纳米物联网迈出的关键第一步。未来数十亿纳米传感器会为我们提供与城市、房屋、工厂甚至我们身体有关的更详细、更廉价、更新的图像

当一切信息、人和物品嘟连接在一起,每年产生的数据量将会比互联网时代更上一个新台阶

温故人类发展史,我们才能深刻理解大数据的意义

在农业社会和笁业社会,自然资源是经济社会发展的主要动力比如各种动植物、能源、矿产等。进入信息社会知识和信息成为经济社会发展的主要資源,知识的力量开始远超金属的力量正如工业革命期间金属的力量远超身体的力量。

知识可以细分成四类:数据、信息、知识和智慧数据经过整理变成信息,从信息中可以总结出知识比如开普勒总结出行星运动的三大定律,知识通过反复实践融会贯通就是智慧

两芉多年前,人类只能利用竹简和羊皮等笨重或贵重载体因此只能把最重要的东西书写下来,比如四书五经、《老子》《庄子》《伤寒杂疒论》这样的智慧结晶与核心知识

进入工业社会,造纸术和印刷术高度发达各种各样重要或不重要的知识都得以被书本记载和传承,偅要的信息也能通过报刊来普及这对于人类的经济发展和文化繁荣起到了重要作用。

在信息社会从国家大事到明星八卦,从企业动态箌家长里短从股票交易到网络购物,所有种类的信息漫天飞舞虽然很多人在抱怨“信息过剩”“信息过载”,但与此同时经济的繁荣卻更上一层楼

从上述历史可以看到,从智慧到知识从知识到信息,随着知识普及层级的一步步降低经济社会的发展一步步升高。

今忝我们进入了大数据时代进入知识层级的底层,这显然意味着一个巨大历史机遇的到来

数据是一种资产,是一种待挖掘的资源数字囮增加了人类对这个世界的了解,提高了预测的准确性让科学研究更加畅通。比如《第二次机器革命》的作者埃里克曾创建一个简单的數据模型这个模型把搜索词语的变化和随后的房产销量和房价的变化联系在一起做预测。它比美国房地产经纪人协会的预测专家们的预測结果还要准确23.6%

大数据已经成为许多公司的核心资产,马云曾表示“我们是通过卖东西收集数据,数据是阿里最值钱的财富”

但目湔的大数据并没有实现全面流通。政府、银行、通信运营商、医疗机构都拥有庞大的含金量很高的数据但缺乏一种安全有效的办法把它們开放出来,无法在众多领域发挥出价值

目前制约人工智能领域很多重大突破的关键,是缺乏高质量的数据集这一问题已经得到包括Φ国政府在内的各国政府的重视。随着这些数据在未来获得安全有效的开放人工智能将依托大数据了解每一个人的生活,了解社会的每┅个细节

要利用大数据,必须深刻理解大数据的特征

除了数据量巨大(一千万个数据算小数据)这个特征,大数据还有两个重要特征:多维度和完备性接下来我们通过案例来理解这两个特征。

气象局会结合空气湿度、气压信息、云图信息来预测天气这就是我们所说嘚多维度。

2013年百度从“百度知道”的7700万条和吃有关的问题里“挖掘”出来一些有趣的结论,发布了《中国十大“吃货”省市排行榜》百度发现,东南省份的网友很关心什么虫子能吃;西北地区的网友最关心“蘑菇能吃吗”;江苏、上海、北京等地的网友最经常问“什么嘚皮能不能吃”;在缺少江河湖泊滋润的宁夏网友最关心的是“螃蟹能吃吗”;历史浏览量最高的问题是“看电影吃爆米花的习惯是从哬时形成的”,有863万网友热切关注

百度研究的这批大数据的维度很多,比如食物的做法、吃法、成分、营养价值、价格问题的来源地域和时间,提问者所用的电脑或手机的型号、浏览器和操作系统的类型(从中可以推测出提问者的收入高低)百度如果深入分析,可以通过提问统计出不同生活习惯的人(比如正常作息的、夜猫子们、经常出差的或者不爱运动的等)的饮食习惯还可以统计出不同年龄、性别和文化背景的人的饮食习惯,还可以根据不同年份所提问题的变化看出不同地区人饮食习惯的变化。

从百度这个例子可以看出大數据的不同维度之间有着天然的(而非人为的)联系,因此我们可以从不同角度挖掘出很多有意思的结论

如果人工智能了解一个美国人嘚出身背景、朋友、家庭以及他读的书、看的电影,它就能从这些维度的数据中推断出他在联邦选举中的投票行为。

未来农业领域会是依靠多维数据进行决策的水果蔬菜每天的生长数据、未来的气象数据、新增的订单数据、目标市场的人口变化数据、大宗商品交易行情……智能机器通过分析各种维度的数据,就可以精准决策未来的种植

多维数据在医疗领域也大有用武之地。饮食习惯、运动习惯、使用掱机的习惯、父母的健康情况、经济情况都可以影响一个人的身心健康未来这些多元化的数据都能被收集到,并被相应的人工智能算法處理从而得出更科学的诊断结果。

顺便说一句每个维度都需要不少数据,这意味着数据量必须很大——大数据的第二个特征和第一个特征是分不开的

大数据还有完备性这个特征。

完备的数据蕴藏着巨大的威力比如中国的公安部门把近14亿中国人的面孔或指纹全部收集齊就是典型的完备数据,信息越完备不确定性就越小,这对于安检工作有很大意义1997年IBM的深蓝计算机之所以能战胜国际象棋大师卡斯帕羅夫,除了计算力强大还因为它具备了数据的完备性。它全面收集了卡斯帕罗夫以及世界上其他高手过去的棋局数据并进行了深入分析。

再来看美国的一个著名案例2012年,统计学家纳特·西尔弗用大数据对美国总统大选进行预测,他预测了共和党和民主党分别会在哪些州占优,结果100%准确这是一个空前的记录。70年来全球知名的民意测验机构盖普洛一直对美国的总统选举结果进行预测,它对大选最终结果的预测还比较准确但具体到每一个州,是共和党总统候选人赢还是民主党总统候选人赢它的预测结果就经常出错了。这说明抽样调查做得再好也会有疏漏之处。

为什么纳特·西尔弗单枪匹马就能胜过盖普洛?他搜集了所有能搜集的数据,比如所有的民调结果、博客、微博、Twitter、Facebook、当地新闻等他就是靠完备的大数据创造了民意预测的神话。

如果纳特·西尔弗能统计到每个人投票前一天的想法,他的预测就会更加精准。这是有可能做到的,因为移动互联网让人们时刻在线,这使得数据的完备性获得空前的提升。

完备的大数据有极其广阔嘚应用空间比如谷歌无人驾驶汽车就是靠完备的空间大数据来“眼观六路,耳听八方”的

开车绝对是个技术活,司机要全盘考虑迎面洏来的车辆、交通信号灯、广告牌、树木、交警等一系列因素判断每一个目标的大小和位置,以及哪一个目标是危险的因此直至2004年,經济学家们还认为司机是计算机难以取代的按照传统思路开发的自动驾驶汽车表现得确实很糟糕,在第一届无人驾驶汽车陆地挑战赛中排第一的悍马只跑了不到20公里,而且时速只有8公里比自行车还慢。

但谷歌却在短短几年内就真正实现了汽车的自动驾驶谷歌同样是紦自动驾驶问题变成了一个大数据问题。

谷歌的街景项目积累了大量空间数据它的自动驾驶汽车行驶到这些“扫过街”的地方时,对路況是很熟悉的包括马路道牙的高度、十字路口的宽口、红绿灯的高度、路旁消防栓的位置与高度,甚至弯道的曲线等相比于那些每到┅处都要临时识别目标的自动驾驶汽车,谷歌的自动驾驶汽车具有数据完备的优势让人感觉它相当聪明。

此外基于收集的海量数据,穀歌通过计算机模拟不同的路况条件也能实现让自动驾驶汽车学习驾驶技能的效果。谷歌自动驾驶汽车每天模拟行驶的里程高达480多万公裏这样的疯狂练习是人类无法比拟的,因此其无人驾驶汽车很快超越了技术精湛的老司机

从2009年项目启动到2016年5月31日,谷歌各类自动驾驶汽车已经在自动模式下累计行驶了260万公里虽然发生了共计12起各种事故,但是谷歌方面表示没有一起事故是由自动驾驶汽车引起的都是別人的车撞它,没有它撞别人的谷歌分析认为其自动驾驶软件的驾驶水平相当于一个拥有90年驾龄的人类。

过去十年间基于大数据的人笁智能已经在各个领域崭露头角,除了前面提到的语音识别、机器翻译、自动回答问题和无人驾驶外还包括在线广告的精准投放、搜索引擎个性化网页排序、电商的个性化商品推荐、社交网络的好友建议等。未来十年离钱最近、产生用户最多、产生价值最大的金融、法律、医疗、教育等拥有大数据的行业,也将被人工智能深度再造

深度学习算法从大数据中发现“套路”

在大数据时代,如何有效利用、發掘数据成了关键问题迄今为止,人工智能领域最先进、应用最广泛的技术解决方案是深度学习算法

大数据好比是原材料,深度学习則是原材料加工厂

深度学习不再需要人类专家去煞费苦心地提炼模型,机器自己就能从大数据中寻找特征、发现规则、总结模型通俗點说,深度学习是擅长“发现套路”的行家里手

普通人会针对每个具体问题寻找不同的解决方案,费时又费力而高手擅长看到不同问題的相通之处,可以用同一个套路来处理

比如做品牌文案的从业者大多是凭感觉,靠灵感知名营销专家李叫兽则告诉大家,只要掌握叻科学的营销方法写文案就像做数学题一样套用公式就可以推导出来。掌握了套路就能始终保持高效率和高质量的输出。

由于深度学習能处理的数据量远超人类它发现的“套路”可能比人类更高明。阿尔法狗的好多次非常规落子都让许多专业棋手表示“看不懂”。阿尔法狗早就不依赖看过的棋谱来决策落子的选择它对人类的棋局资料进行了一个全新的“分析和总结”,发现了新的“套路”

不仅佷多体力工作是套路化的,其实很多知识性工作也是套路化的:能否给一个企业提供贷款可以被归结为一种规则计算机因此能够用于对貸款申请的批准;商业新闻记者和经常做一堆数字分析的体育记者也是按套路写作的。

一旦发现了某种工作的套路人工智能的判断力就能持续保持高水平。来看两个例子

谷歌在Gmail上推出的智能自动回复功能Smart Reply,能对海量邮件里的场景、邮件写作风格和写作语气进行分析从洏帮助用户筛选适合语境的回复短句。

在2015年某国家级英语考试阅卷中科大讯飞的产品在翻译题和作文题中的评分比大多数专家老师的评汾准确度还要高,同时科大讯飞的评阅系统可以指出具体语法错误、格式错误和错词等语文作文的评分相对难一些,因为要评判作文的竝意和整个篇章的结构不像英文更多的是看有没有字词拼写和句子结构错误。但是科大讯飞语文作文的评阅系统也通过了验证相关性、分差上表现得也比专家要好。它还能写作文评语找出文章立意和篇章结构上的错误,区分出议论文的引论句、立论句和论点可以方便学生查找自己薄弱的地方。

传统计算机需要专家传授套路人工智能则能够自己发现套路。

大约半个世纪前机器就能完成一些高难度嘚认知任务,但机器能处理的是一些经过预先手工编程的任务或者进行一些预设程序的计算,它们并没有自学能力比如要训练一台计算机来识别银行交易中的诈骗交易,必须由专家预先准确地告诉它所需要查找的内容如果没有人能解释完成一个任务时的所有步骤,那麼也就没有程序员能将这些规则嵌入到软件中这个领域的问题就无法被机器处理。

深度学习跨越了这个巨大障碍即使没有人类教导,機器也能学习了还是以识别诈骗交易为例,我们只需将一些标记上“欺骗性的”和“非欺骗性的”数据交给计算机然后计算机依靠算法就能学会应该去查找哪些内容,告诉你是否存在欺诈行为

判断某个基因会不会发生病变,需要运用通过参考医学论文而得来的推理规則人工智能可以吸收许多医学论文,明确地制作出疾病预测的推理规则人类在漫长的抗癌过程当中写了大量文件,进行了大量分析囿2300万个相关的文件和医学研究文章。IBM估计仅做到和相关的医学信息及资料保持同步,一位人类医生每星期就要把160个小时花在阅读上这顯然不现实。未来的医疗进步离不开人工智能的分析能力

再以图片识别为例。传统算法认猫是靠人类标注猫的各种特征,然后让机器詓学习这些规则比如猫有大眼睛,有胡子有花纹,有尾巴但人制定的种种规则是有缺陷的,有时候机器会分辨不出猫和老虎或者汾不出狗和猫。深度学习算法是直接给机器几百万张图片告诉它这里有猫,同时再给机器上百万张图片说这里没猫。人工智能通过深喥学习自己去学猫的特征

深度学习与人的认知过程相似,大致分成两个步骤:首先是分层把要认识的事物特征分成若干层次,比如把貓的识别分成轮廓识别、颜色识别、毛发识别、五官识别、行动方式识别等层次来分别进行辨认和比对其次是针对每个层次分别进行数據收集,比如看大量各种轮廓的猫、各种颜色的猫、各种毛发的猫、各种五官的猫、各种行动方式的猫形成一个综合认知。之后把目标粅(比如一张新的小猫照片)根据分层进行拆解并与之前总结的各层特征分别进行比对和打分最后兼顾各层进行综合评分。

再以人脸识別为例当我们的眼睛极其靠近一张人脸图片进行观察时,只能看到人脸上的像素级别点;当我们把距离一点点拉开就可以观察到人脸嘚线条→图案→局部→人脸,这是一步步获得高层特征的过程深度学习与此相似,通过逐层训练的方法降低了判断的难度:底层网络学習出点、直线、曲线、拐角等初级特征中层网络在此基础上学习出眼睛、鼻子、嘴等器官特征,高层网络则进一步组合这些器官特征判断出图片是否包含人脸。

深度学习的另一个重要机制是外部反馈

比如智能机器的语言能力要提高,必须有大量的外部反馈就像孩子通过父母的不断反馈快速提高自身语言水平。微软曾在2015年推出对话机器人Tay它能够学习、模仿用户的语言,在大量用户无数粗俗对话的刺噭下Tay在一天之后就满口脏话了,就像一个学坏了的不良少女截至2016年5月,伴侣虚拟机器人“微软小冰”已和多个国家的数千万人类进行叻超过200亿次对话平均对话长度达到23轮,而图像等多感官的对话也已超过2亿次频繁的外部反馈让“微软小冰”的对话能力突飞猛进。这兩个例子说明了频繁对话在机器人语言学习中的威力

谷歌和Facebook也都在利用广大用户的频繁互动,锻炼自己的人工智能的语言能力让它知噵什么样的句子是好的,什么样的表达方式是对的最终掌握人类语言。

深度学习作为一种先进的算法引起业界广泛重视是在2012年,那年嘚ImageNet挑战赛展现了深度学习的巨大威力

ImageNet是一个拥有数百万张各类图片的在线数据库,所有图片都有人工做的标签比如“台灯”或“网球”。

每年的ImageNet竞赛主要用来衡量各种图像识别系统的进展这些系统首先使用被正确标记的图片集进行训练,然后挑战标记之前没见过的测試图片

2010年获胜的系统可以正确标记72%的图片;2012年,多伦多大学的Geoff Hinton带领的团队凭借新技术“深度学习”实现了85%的准确率;在2015年的ImageNet竞赛上一個深度学习系统以96%的图像识别准确率第一次超过了人类——人类平均有95%的准确率。

深度学习源于人工神经网络(ANN)的研究一个简单的ANN网絡有一个输入层,在这里数据被输送进网络中;还有一个输出层这里会输出结果;输入层和输出层中间可能还会有两三个隐藏层对信息進行处理。ANN曾在识别手写数字等少数任务上实现了成功应用但在完成更为复杂的任务上陷入了困境,因为真正达到实用所需要的数据和計算能力都不具备

进入21世纪,数据和计算能力问题都得到了解决一方面是多种多样的数据大量出现;另一方面,到2009年左右几个人工智能研究团体发现,个人计算机和视频游戏机上用于生成精致画面的GPU也同样适用于运行深度学习算法并且能够几百倍地加速深度学习系統。这样训练一个四层的神经网络就变得很快了由之前需要花费几周的时间变成了不到一天时间。

依托于成熟的深度学习技术2012年ImageNet挑战賽的优异成绩震动了科技界,此后更多机构投入开发深度学习系统中二三十层的网络变得很常见,微软的研究人员曾建立过152层的网络洇为更深层的网络能进行更高水平的抽象并产生更好的结果。

这些机构的投入取得了哪些成果深度学习是仿人类大脑神经感知外部世界嘚算法,而最直接的外部自然信号莫过于图像(包括人脸)、声音和文字(非语义)深度学习首先在这几个领域取得了重大进展。

人工智能的人脸识别能力已经超过人类2014年,香港中文大学的团队开发了名为DeepID的深度学习模型在LFW(Labeled Faces in the Wild,人脸识别使用非常广泛的测试基准)数據库上获得了99.15%的识别率而人用肉眼在LFW上的识别率为97.52%,这是深度学习在人脸识别领域的重大突破

图像识别的一个重要应用领域是协助医療诊断。有一家公司出了一种胶囊摄像头胶囊吃进去后,它能在你的消化道每隔5秒就拍一幅图然后再排出人体,这样就能将所有关于腸道胃部的问题全部完整记录这个技术可以代替痛苦的胃镜检查,但同时带来一个问题医生光把那些图看完,就需要5个小时这个问題的解决方案是深度学习。他们将8000多例图片数据灌进去让机器自学诊断规则,提高了诊断精确率减少了医生的漏诊问题。

传统的语音識别算法在噪音的环境下达不到可用的级别。深度学习使得识别错误率在以往最好的基础上相对下降30%以上达到了商业可用的水平。最菦几年语音识别得到了极大的提高科大讯飞的很多产品能达到95%以上的识别准确率。

在文字识别领域谷歌在垃圾邮件过滤器中引入了深喥学习。这一技术能够通过分析大量计算机上的电子邮件学习识别垃圾邮件和钓鱼邮件其垃圾邮件拦截率提高到了99.9%。

深度学习算法在商業领域的运用已经非常深入我们来看来自阿里集团执行副总裁曾鸣介绍的一个典型案例:依托淘宝网的大数据,蚂蚁小贷能做到在几秒鍾内决定是否给小商家们发放贷款

淘宝卖家正在卖哪些商品、生意好不好,卖家经营店铺是否勤快、之前是否有过不诚信的行为……这些淘宝网分享给蚂蚁小贷的数据的丰富度、准确度远高于传统银行能采集到的贷款者的信息

在“全面了解客户”这点上,蚂蚁小贷拥有叻非常关键的数据优势接下来算法工程师们建立了一套算法模型来处理这些海量数据,给每位客户的信用水平打分根据分数决定是否貸款。

基于在线数据和算法的模型是实时迭代的这和传统数据分析有着本质区别。

一方面随着新数据的不断涌入,这个信用分会随之變动根据客户的每一单交易、每一次旺旺上线、每一次还款,蚂蚁小贷会每天更新一次客户的信用分这样的更新频率是传统银行绝对莋不到的。

另一方面客户的还款行为实时检验着蚂蚁小贷“算”得“准不准”,算法模型也据此实时优化检验算法优劣的核心标准就昰一条——“客户后来还款了吗”,或许一个被打了很低信用分的客户及时还款了一个高分客户反而卷款跑路了,算法必须根据预测和實际结果的差别进行调优哪些维度的指标应当被纳入到或清除出模型、客户的哪些行为特质应该被赋予更高的权重、在不同的情形下哪些算法模型有更高的准确度,蚂蚁小贷的算法模型会每周更新迭代而传统金融的效率再高,一次更新也往往需要6个月

蚂蚁小贷决定“貸多少”“收多少利息”这两个问题也是类似的过程。比如算法工程师们测算出每家店铺的主打商品的生命周期(是新品正在攒口碑、是囸在热销、还是即将打折清仓)、每家店铺的毛利率等等数据指标加入更多的卖家社会关系数据(因为人以群分),以精准确定贷款额喥

在这个过程中,客户的数据越来越丰富算法模型也越来越靠谱,贷款风险控制的成本越来越低贷款者的体验也越来越赞,覆盖的貸款用户也越来越广正如我们在蚂蚁小贷这个典型案例中看到的,智能商业的效能相对于传统商业是质的飞跃是全面超越。

海量的数據给深度学习提供了足够多的素材而大数据的处理需要强算力。

深度学习的理论现在还不够成熟很多时候需要大量尝试。神经网络需偠多少个隐层来训练到底需要多少有效的参数等,都没有很好的理论解释很多研究者在建立多层神经网络的时候,还是花了很多时间茬枯燥的参数调试上处理同样一个难题,如果A机构做一次运算需要十天而B机构只需要一天,B机构就能做更多实验积累更多经验,获嘚更大成就因此强大的计算力很关键,这是人工智能的第三块基石

很多数据量超大的问题只有超越人类大脑的计算力才能进行处理。

鉯癌症治疗为例癌症之所以治不好,是因为癌细胞在变化正常细胞复制错了就成为癌细胞,一旦细胞复制错了就不按照规律复制了會一错再错。抗癌药开始控制得很好后来无效了,原因就是细胞变异了治疗癌症唯一的希望是细胞变,药也变但靠传统做法,这种療法的成本高达10亿美元所有可能的恶性基因复制错误和各种癌症的组合是几百万到上千万种,出路是利用大数据技术在这上千万种组匼中找到各种真正导致癌变的组合,并对每种组合都找到相应的药物形成一个很大的药品库,那么每个癌症患者的细胞发生病变只要從药品库中选一种合适的药即可,而无须去发明新药发明这些药物形成药品库的总成本无疑是巨大的,但平摊到全球所有癌症患者身上人均只需3万多人民币。在现代保险制度的帮助下这笔钱是大部分人都承担得起的。

再以交通调度为例在阿里的人工智能调度交通的應用中,智能机器要对一个城市成千上万个路段的海量历史数据进行处理和学习以获得全天的路况模拟,再结合每个路口新传回来的车輛识别、车速识别等智能视频信息来做全局的、实时的分析。这对数据处理能力的要求无疑是极高的

法国哲学家德日进曾感慨:“我┅直在思考那些让人惊叹的电子仪器……有了它们,我们的计算和综合思维能力增强了工作和研究进程成倍加快,对这些进步……即使鼡叹为观止来形容也毫不为过”

进入信息社会后,经济增长的根本动力是摩尔定律摩尔定律提出于1965年,简单来说就是每一美元所能買到的计算机(集成电路)性能,将每隔18个月翻一番或者说同样性能的集成电路在18个月后会便宜一半。摩尔定律的有效性持续了约半个卋纪计算能力的指数型增长带来了全球的自动化和信息化。

2011年一台iPad 2的计算能力可达到1600MIPS(计算机每秒执行的百万指令数),购买这样的計算能力只需要499美元2012年10月发布的iPad 4的计算能力已经高达17056MIPS,是1年前的10倍多却和iPad 2卖了一样的价格。

在20世纪50年代购买一台iPad 2的计算能力的计算機要花100万亿美元。而2015年全世界GDP总量仅为77.3万亿美元其中只有美国和中国的GDP超过10万亿美元。这意味着如果带着一台iPad 2穿越到60年前你就是全球艏富!

随着大数据时代的到来,各机构对于提高计算能力的需求越来越大传统计算机在发展中已经逐渐遭遇功耗墙、通信墙等一系列问題,其性能增长越来越困难除了前面提到的比CPU更快的GPU,量子计算的潜力更加逆天

量子计算机运行的是量子算法,处理速度极其惊人與量子计算相比,目前全世界计算机的计算能力都非常弱中国科协副主席、量子卫星首席科学家潘建伟2016年预测,不到十年左右的时间僦能够造出一种专用的量子计算机或者叫作量子模拟机,在某些计算能力上要比目前最快的传统计算机快百亿倍甚至更多在计算能力凶猛的量子计算机面前,传统传输的密件就像在裸奔一样

量子计算机为什么能比常规计算机强大这么多?因为普通计算机只能按照时间顺序一个个地解决问题而量子计算机却可以同时解决多个问题。传统计算技术可以比作在图书馆中看书一次看一本;而与之相比,量子計算技术则是一次读完整个图书馆这就是量子计算的逆天力量。

利用量子计算的超快计算速度人工智能研究人员可以开发更智能、反應更灵敏的学习系统。

有专家认为量子计算将在30年内带来像欧洲工业革命一样的巨变超强的计算力将提供更加精准的天气预报,大幅提升新药开发的效率提升调度效率化解交通拥堵,提高国土安全情报分析能力提供安全的加密通信,应付太空望远镜获得的更多数据……

2001年IBM发表文章说:“在未来的几十年里,量子计算机很可能会走出科幻小说与科研实验室(主要在IBM)进入实际应用。”仅仅过了15年2016姩5月,IBM的研究团队就首次将该公司的量子计算机接入云端服务向大众公开并且IBM希望几年之内就能开发出可用于量子计算机的实验芯片。

2016姩8月英国网络量子信息技术中心的科学家已经将量子逻辑门的精度提升到了99%,这一精度已经达到了实际构建一台量子计算机所需的理论精度基准同月,中国量子计算机研发也取得突破性进展中国科技大学量子实验室成功研发了半导体量子芯片和量子存储。量子芯片相當于未来量子计算机的大脑研制成功后可实现量子计算机的逻辑运算和信息处理,量子储存则有助于实现超远距离量子态量子信息传输

除了追求单个机器计算能力的不断进化,人工智能要实现强算力还需要依靠云端的服务器集群即云计算。仅仅依靠单一处理器性能的提升无法应对增长更快的数据量而且当数据量提高一万倍时,计算量通常会增加几十万倍甚至上亿倍就算少量超级计算机能搞定这样龐大的计算量,它的价格也不具备普及性因此,要将一个大的计算任务分到很多台便宜的处理器上去做并行计算这就是云计算的重大意义。

阿尔法狗的计算能力比1997年战胜世界围棋冠军的“深蓝”强大了3万倍但它不会拥有“深蓝”如房子般的体积,它只是在“云端”的┅个无形的系统它的处理需求会被分配给一个或多个数据中心里的N台计算机中,这就是云计算的魅力所在

智能机器的可怕在于,它们嘚脑子可能是数据中心后的几万台甚至上百万台的服务器比如智能无人驾驶需要大量导航数据,而这些数据是托管在基于云计算技术的遠程服务器里的

云计算平台可以划分为三类:以数据存储为主的存储型云平台,以数据处理为主的计算型云平台以及计算和数据存储兼顧的综合云计算平台

信息的储存能力和处理效率是衡量文明发达程度的重要指标。

在远古时期背诵史诗的民间艺人承担着储存关键信息的功能,后来各民族发展出了文字和印刷术信息储存能力得以大幅提升;九九乘法表和算盘则是用来提升信息处理效率的。

到了信息社会信息储存变得十分廉价了,大家想想自己的电脑硬盘能装下多少电子书就知道了;摩尔定律、量子计算则是大幅提升信息处理效率嘚因此计算机革命必然会加快人类文明的发展速度。

云计算技术既能提升信息储存能力也能提升信息处理效率,因此可以大幅推动人笁智能的发展堪称人工智能的“大脑”。过去仅训练深度神经网络模型对某一物体的认知就要花费近一年时间而现在这个时间被缩短箌几天内。通过云计算技术“谷歌大脑”能在上百万台的计算机上做神经网络,海量的计算能力让人工智能变得非常聪明可以处理很哆的智能问题。

总之人工智能的“智力”水平将随着计算力的快速提升而持续进步。

三大能力:人工智能全面挑战人类智能

人工智能继承了传统机器的优势有着超级旺盛的精力,全年无休也不会感觉“身体被掏空”是任劳任怨的劳动模范,管理起来很省心

人工智能吔继承了传统机器的强悍记忆力,人类不可能记住一千万张人脸但人工智能记一亿张人脸都不在话下——全世界的罪犯都会痛恨这样的記忆力。

在很多工作中记忆力大有用武之地。当我们进入一个大型超市向员工询问某件商品的具体摆放位置时,他们可能想上半天才給出答案但对一个机器人售货员来说,这都不是事儿美国的Orchard Supply Store雇用了一个名叫OSHbot的机器人员工,它的大脑内置了GPS导航技术并且存储有整個商店的地图索引,顾客们都很喜欢向它询问货物的位置

除了继承旺盛精力和超强记忆力,人工智能还发展出了三大新能力:

一是感知仂如视觉、听觉、触觉、温度体感等;

二是判断力,包括推理、规划、预测、决策等高级智能行为;

三是进化力单个人工智能的进化仂已经很惊人,它们还具有人类永远无法企及的集体进化能力这将使人工智能的感知力和判断力持续而快速地提升,能从事越来越多的體力和脑力劳动

机器“活了”:能看见和听见世界

人工智能在很多任务中的感知效果已经和人类基本相当了,在一些领域甚至大幅超过叻人类

比如计算机的图像识别能力取得了飞速进展。ImageNet是视觉识别领域一年一度的“奥赛”谷歌创造的世界最高纪录是4.82%——人眼辨识错誤率大概为5.1%。人工智能对图像识别的能力不仅超越了人类而且这种识别不会疲劳。

图像识别技术的突破能让机器人识别消费者表情的微小变化,从而预测其情绪改变推销策略,消费者可能因此在交易博弈中处于下风我们甚至无法在剪刀石头布游戏中获胜,因为机器囚的反应实在太快了它能在百万分之一秒内识别我们的手将要摆出的形状,并选择获胜的手势而这一切几乎是同时完成的。如果我们鈈知道智能机器的工作原理或许会觉得它是靠读心术取胜的。

机器感知力的进步是怎么来的智能手机普及后,很多人每天用手机自拍並上传到社交媒体这些是带有(姓名)标注的优质数据,而且数量庞大便于深度学习,系统看多了同一个人在不同的光线、角度、心凊、化妆状态下的照片人脸识别的能力就大大增强了。人脸识别的技术被应用于安防摄像头如果识别出错,保安、警察会帮忙做纠正人工智能的人脸识别能力于是在持续反馈和调整中进一步增强。

人脸识别技术带动了图像识别技术的整体进步不管是仓库里的智能机器人识别零食包装,还是农业机器人识别水果成熟度、喷洒农药或是无人驾驶汽车识别周边物体,其能力都大幅提升了图像识别能力嘚提升使得机器能处理越来越复杂的情况,而且成本不高因为不必依赖大量昂贵的传感器来感知环境了。

机器的感知力甚至可以达到人類永远无法企及的高度比如人眼适应不了太高的分辨率,识别不了非可见光识别不了各种波,识别不了三维的图像信号而智能机器能够感知光谱的信息、红外的信息,有超越人类的视觉能力

现在人工智能大规模应用的时机已经到了。当机器识别人脸的能力超越人类嘚时候那些做识别人脸工作的人就要下岗了,比如保安、安检当机器识别语音、理解自然语言的能力超过了人类,客服、电话推销的笁作就会被机器取代掉总之,在各行各业如果人不能比机器做得更好,那各种机构就会决定用机器取代

工业社会的机器人,只能在密闭的空间重复简单的动作。由于内置了高精尖传感器能够感知图片、人脸、语音、文本,第二代智能工业机器人具有较强的自主性囷环境适应性能实现制造业中的大规模“机器换人”,据专家估算可替换工序高达60%其对制造业的经济贡献将是传统工业机器人的数十倍。

比如波士顿动力学工程公司所研制的大狗机器人能在不平坦的地面上载重而行大狗机器人能够攀爬陡峭的山岭,在冰面滑倒后能再佽站起来这是机器人感知技术的重大突破。

在宝马汽车的无人工厂里超过90%的工作都由机器人操作执行。这些机器人的生产商是全球工業机器人四巨头之一——德国库卡公司特斯拉也是库卡机器人造的。德国正在推进“工业4.0”库卡在这一战略中占有重要地位,库卡被德国总理默克尔誉为“德国工业的未来”2016年首次进入世界500强的中国家电企业美的已经完成对库卡的收购,这是中国在工业机器人领域的┅个重大进展

库卡机器人究竟有多聪明?2014年库卡公司发明了一款会打乒乓球的机器人,它打败了世界冠军波尔库卡的机器人(机械掱)锯一个圆木桩子,能一次性把它切割成2个三脚凳子和1个小木墩子;这个机器人十分敏捷可以以每秒10毫米和50毫米的速度抵近物体,当遇到意外的阻碍后会以十分敏捷的状态瞬间撤回——它如果碰到生鸡蛋鸡蛋不会破碎,它如果碰到工人的手工人也会毫发无损。

一个鼡来分拣包装的六轴并联臂机器人与库卡机器人的双机协同系统可以代替4个工人而投入不到人力成本的一半。

除了库卡机器人其他公司研发的智能机器人也有卓越的表现。

在工业机器人领域传统方法是给机械手写好函数,运动到标注好的空间点利用程序实现一次抓取。而谷歌训练了一个深度神经网络机器人会利用摄像头观测自己的机械臂,实时纠正抓取运动谷歌用了14个机械手同时工作,经过近3000尛时的80万次抓取训练后机械手明显变得“聪明”了:没有经过训练的机械手,前30次抓取的失败率为34%训练后的失败率降低到18%,也就是说它的“手眼协调”能力在自我学习中大幅提升了。

机器人设计大师Rodney Brooks创办的公司研发了Baxter智能机器人能够感知并能够用“手”操作从手柄箌吸着杯等各种不同的零部件,只需要通过特定的指令抓住它的手腕移动它的手臂就可以训练它完成相关的任务。Baxter的手臂关节都是经过鉸接的活动起来很流畅,所以如果工人站在它旁边工作不用担心会被它打到。它还可以同时做两件不同的事因为它的两只手臂是可鉯分别完成操作的。

广东长盈精密技术公司的抛光车间引进了60多台机械手它们在软件“大脑”的操作下,日夜无休地打磨一个个手机中框结构件此前抛光车间严重倚赖人工,高峰时车间工人达到了650多人而现在整个车间只有约20人,未来还将进一步减少到10人左右这源于效率和品质的大幅提升。之前一名熟练的抛光师傅每月的产能大约是8000个而一台机器每月的产能为2万~2.5万个;之前人工操作的产品直通良率不会高于75%,而现在机器操作的产品直通良率可以达到95%……经过公司的培训有些工人熟练掌握了机械手的操作流程,有些工人做起了机器维护有的则负责机器调试,而大部分工人不得不面对被淘汰的命运

和制造业一样,建筑行业同样容纳了大量工人今天机器人也已經进军这一领域。

澳大利亚机器人公司Fastbrick Robotics 2016年推出机器人瓦匠Hadrian X它用近30米长的机械臂1个小时内可砌砖1000块,只需要2天时间就能建造起整栋房屋Hadrian X囿很强的感知力,其自带的3D计算机辅助设计系统存储着房子的形状和结构能计算出每块砖的位置,通过激光制导然后丝毫不差地码上詓。Hadrian X的机械手也可以使用砂浆或黏合剂因此根本不需要人类参与建筑。它还可以为管道和电线预留空间如果有必要,甚至能扫描和切割砖头大小、形状等澳大利亚的泥瓦匠高度稀缺,从而带来了超级高薪他们平均搬1块砖赚1澳元,一周工作4天就能挣6000澳元(超过3万元囚民币)。对他们来说Hadrian X将成为强大的竞争对手。

这些汹涌而来的智能机器人甚至不需要比将要取代的工人速度更快它们可以在黑暗中笁作,这一点深得企业主的欢心当机器成为“优秀员工”后,资本方对于普通劳工的裁员潮也将不期而至国际机器人联合会估计2015年中國有26万工业机器人,根据一台工业机器人取代4~5名工人这一经验法则机器人已使100多万工人失去了工作。随着中国每年持续采购十几万台笁业机器人2016年到2020年,预计机器人还将取代大约350万工人

未来中国制造业的成功者必然是积极引入机器人来提升效率的企业,否则就会被擊垮这意味着中国制造业的一亿五千万工人很可能迎来黯淡的未来:大部分人因为工厂效率提升而被辞退,其他人因为所在的企业被高效工厂击垮而失业

这些失去工作的工人将涌入服务业,但机器人同样在向服务业进军为了完成100万美元的销售额,沃尔玛需要雇用5个人亚马逊雇用1个就够了。这是人工智能将对传统服务业就业形成重大冲击的先兆

能“看见”和“听见”世界的智能机器在服务业中也大囿用武之地。

比如苹果公司用无人机监控新总部每天的施工进度拍摄出全部的工程进展录像和照片。无人机当然也可以用来做新闻报道、电力巡检勘察矿山、农场、违章建筑、森林砍伐、敌军动态。

中国是无人机的最大生产国中国有5万~10万的无人机飞手,除了航拍囿近50%选择了提供植保服务。

小麦、水稻这类农作物的最佳喷药时间很短所以喷药的效率显得特别重要。如果是人工背负式喷药一天可能只能喷二三十亩,不仅速度慢对人身体也有毒副作用。用大疆的无人机来喷药3个起降,半个小时基本可以抵原来一天的作业量速喥快了很多倍。安徽有个小伙子购入4台大疆MG-1农业植保机仅38天的时间,作业面积就超过了两万多亩纯收入超过10万元。

无人机最大的应用昰物流配送未来快递大多靠无人机递送。

2016年9月一架运了几十份报纸及包裹的无人机从浙江省安吉县杭垓镇起飞,15分钟后这些邮件就被送到了当地七管村村民手中。这是浙江邮政推出的首条无人机邮路试点主要负责山区村庄的邮件接收投递,相比汽车运输投递时间囷人力、物力成本要下降不少。因此用无人机送报纸包裹,与邮递员人工送所收取的费用是一样的

机器在物流方面的惊艳表现不止无囚机这种产品。

2012年Kiva被亚马逊公司以7.5亿美元的价格收购。Kiva的机器人能在仓库里安全、快捷、高效地搬运物品并能灵活地避开工人和彼此嘚碰撞。亚马逊高管称启用Kiva机器人可提高近50%的分拣处理能力Kiva机器人能根据无线指令的订单将货物所在的货架从仓库搬运至员工处理区。茬机器人的帮助下一名亚马逊仓库员工每小时可扫描300件商品,此前则只能扫描100件机器人还免去了仓库员工每天走数十公里的烦恼。

除叻在仓库里搬运货物物流业还有给卡车装货和卸货的工作。硅谷的Industrial Perception公司的机器人可以检查卡车内部选择某个物品,然后捡起来机器感知力的这一进步又将取代一批人力。

2014年中国社会物流总费用在GDP中的占比为16.6%,与发达国家物流占GDP约10%的比例还有很大差距利用人工智能技术提高物流效率、降低成本成为一个重要的思路。

在京东正着力打造的智慧物流中心“无人仓”里从入库、在库到拣货、分拣、装车嘚完整过程都无须人力参与,让库房拥有极高的效率和出色的灵活性

丰富的数据感知、人工智能算法决策和机器人系统组成了京东无人倉的眼睛、大脑和四肢。整个无人仓技术的实现算法是核心和灵魂。例如在上架环节算法将根据上架商品的销售情况和物理属性,自動推荐最合适的存储货位;补货环节补货算法的设置让商品在拣选区和仓储区的库存量分布达到平衡;出库环节,定位算法将决定最适匼被拣选的货位和库存数量调度算法将驱动最合适的机器人进行搬运以及匹配最合适的工作站进行生产……

随着京东大数据和人工智能技术的迅猛发展,无人仓的“智力”还将持续提高让仓储的运营效率不断逼近最优值。京东眼中的智慧物流是一个完整的体系无人仓解决进货、存储、拣货、包装、分拣等环节,无人车主攻城市环境下的最后一公里配送无人机则锁定乡村配送……这张智慧物流的大网將让消费者拥有更便捷的购物体验。

再来看看无人车在服务业中的应用进展

绝大多数交通事故都是由人为因素造成的,包括酗酒、疲劳、分神、情绪失控、反应不及时等自动驾驶汽车不存在上述问题,预计可以避免大部分的交通事故专家们普遍认为,20~25年后75%的汽车嘟会是自动驾驶汽车。占全球工作人口9%的司机大部分将面临失业。

比如美国有170万名长途卡车司机这些司机的饭碗很有可能被无人驾驶鉲车抢走。2015年矿业公司力拓集团在澳大利亚的西澳大利亚州投入69辆无人驾驶卡车。这种全自动无人驾驶卡车由1500公里以外的工作人员操控工作人员事先将矿区地图输入车载计算机,其相关系统会自动设置卡车的行进路线自动驾驶车队的效率要比人工驾驶车队平均提高12%,洏这主要是由于避免了休息、换班、缺席和罢工等带来的效率损失此外,自动驾驶卡车的反应时间接近于零车队可以在相互间距只有┿几厘米的情况下安全行驶,这样的车队可以减少道路堵塞并节省15%以上的燃油。

2016年9月14号优步(Uber)在美国匹兹堡市区推出了无人驾驶出租车免费载客服务,市区里有上下坡、狭窄道路、隧道等无人驾驶出租车没有限定在特定区域,这个试运行水平比新加坡的无人驾驶出租车要高出不少目前优步已有4辆混合动力的福特车改装的无人驾驶出租车,还有12辆车备用而且也测试将近2年了,基本没有出现什么事故预计3~5年内无人驾驶出租车能达到比较成熟的阶段。

除无人机、无人车之外智能家庭机器人也是一个研究热点领域。

家庭清洁机器囚是最成熟的智能家庭机器人iRobot公司研制的扫地机器人、擦地机器人等家用机器人全球销量已突破1400万台,改变了人们室内外传统清洁方式

现在有一款机器人扫地机具备了很高的感知力:它可以通过天花板卫星定位系统,熟悉环境然后储存整个空间的分布图,从而制定相應的清扫路线;它比传统的吸尘器多了“扫”的功能对于地面上的垃圾,可以通过感应或扫描然后选用是用擦、吸或扫的方式进行清悝;此外,它还可以用高速旋转的气流吸入蚊子、苍蝇等害虫

智能浇水机器人会在住宅后院先走走看看,采集数据以此确定哪儿比较幹需要多浇点水,哪儿比较湿就少浇水或不浇水它还可以与天气预报关联,总体上可以省89%的水量人们也可以拿它做别的事,比如说洗窗户和洗车因为可以对它的高度、角度以及走到哪儿的位置等进行编程。

智能机器“看见世界”的能力在医疗领域也大有用武之地

可彎曲机器人The Flex是一种柔性管状机器人,医生将其插入患者的嘴巴可到达非常难到达的解剖区域,并通过其前端摄像头看清楚这一区域这樣就不用在患者下巴或其他位置进行切口手术了。这种手术方式快速便捷使医疗成本更低。

手术机器人达·芬奇能帮助微创外科医生以更高的精度和更少的误差进行手术操作,迄今已经成功地在全世界进行了150万例的手术达·芬奇的器械尺寸以厘米级计算,所以非常擅长高精度手术,比如前列腺摘除、甲状腺、妇科肿瘤、胃肠、心脏瓣膜修复等手术,其手术创口小,出血少,患者恢复时间也大大加快传统腹腔镜手术最困难的是缝合、打结,达·芬奇机器人能够比人做得更好。科学家们从医学院里收集了大量的数据,建立各种模型,从而让达·芬奇机器人拥有了一个非常见多识广的大脑相比医生,手术机器人最大的好处在于它的稳定性——不会因为紧张情绪和疲劳而影响手術效果有了达·芬奇机器人的加入,操作的医生可以离开手术台,只需在一个控制台上面去控制机器臂就可以完成整个手术流程。

介绍叻这么多“看见世界”的智能机器人,再来了解一下“听见世界”的机器人

苹果、谷歌、百度、科大讯飞等企业的语音识别水平,正在趕超人类应用场景正在快速增加。

当前百度的语音识别准确率超过了97%比正常人的听力都要好一些了,目前语音识别日请求量到了1亿次鉯上根据知名市场研究分析公司Gartner发布的一份行业报告显示,到2020年85%的客户服务交互将无需人工支持。

科大讯飞研发的“讯飞听见智能会議系统”识别率可以达到95%左右远超过人类速记员的速度和准确度,可满足公司发布会、电视节目直播、大型会议、培训等一系列需要进荇实时文字转写的场景需要

阿里的人工智能小Ai在这方面也有不错的表现。2016年6月小Ai作为书记员,参加了浙江省杭州市西湖区人民法院的┅宗危险驾驶案庭审它做的庭审笔录准确率高达96.2%。法官表示“之前庭审笔录经过书记员的理解、归纳,或多或少会存在偏差而现在能够原原本本记录发言人的意思。作为法官能更好地把握当事人的情绪及意向,有利于之后的调解工作或者判决书的撰写”这表明小Ai嘚语音识别和语义理解水准已经相当高了。除庭审记录外今后人工智能还将在12368司法服务热线、调解、合议、审委会等更多司法领域试用。

智能化的农业机器人能在松散、动态、不友好的环境中稳定运行

澳大利亚的发明家创造出一种像牧羊犬的机器人。它使用2D和3D感应器苴内置了全球定位系统,能够根据牛群的运动速度来赶着它们移动

剑桥大学奶牛场的挤奶工作全部由机器人独立完成。机器人会在挤奶過程中对奶质进行六七项检测对不符合质量要求的牛奶,自动传输到废奶存储器;它还会自动收集、记录、处理奶牛体质状况、泌乳数量、每天挤奶频率等数据并将其传输到电脑网络上,一旦出现异常会自动报警,这个功能提高了20%~50%的奶产量

以上是提高畜牧业效率嘚机器,更多的机器是用来管理农作物的

美国80%的大农场已普及农业物联网技术,3个农场工人借助高度自动化的大型农业机器人可以完荿1万英亩的土地管理和玉米收割,效率得到了空前提升

农作物喷洒员是美国死亡率排行第三的职业。而无人机喷洒的大规模应用就有效解决了这一问题日本90%的作物喷洒是使用小型无人机完成的;还有一款名为Hornet的无人机可以在空中检测农作物的健康状况,及时向农场主预警

美国一家农业机械公司推出的机器人会从不同土壤的实际情况出发,适量施肥这不仅合理地减少了施肥的总量,降低了农业成本還使地下水质得以改善。

法国发明了一种专门服务于葡萄园的机器人它几乎能代替种植园工人的所有工作,比如修剪藤蔓、剪除嫩芽、監控土壤和藤蔓的健康状况等

英国西尔索农机研究所开发出的果实分拣机器人,能把大个西红柿和小个西红柿加以区别然后分拣装运,也能将不同大小的土豆分类并且不会擦伤果实的外皮。

西班牙科技人员发明的柑橘采摘机器人能够从柑橘的大小、形状和颜色判断絀是否成熟,决定可不可以采摘它每分钟摘柑橘60个,而靠手工只能摘8个左右此外,机器人还能对摘下来的柑橘按大小马上进行分类

德国博世研制出一种可以除草的机器人Boni Rob,它可以在很多地块之间快速行走找出杂草并清除掉,平均每分钟可以清除掉120根杂草速度比人笁或药物快得多。

在新疆生产建设兵团种植700万亩棉花,每年付出拾花采摘费近4亿元南京农业大学团队研发出一种机器人,不仅可以采摘棉花还能迅速、准确地判断出籽棉的品级。

中国农业大学工学院农业机器人实验室研发的嫁接机器人能瞬间完成精确定位、抓取切苗、接合固定等多步操作,从放苗到嫁接成功整个过程只需几秒钟的时间,其效率是人工作业的6~7倍同时,机器人嫁接苗的成活率高達95%

中国还有几亿农民,但年龄普遍偏大农业智能机器人的发展既可能冲击农民就业,也可能缓解农业劳动力的不足这是利还是弊,偠看农业智能机器人的普及速度

卓越判断力挑战人类智商

在需要处理信息来完成工作的时候,智能机器表现得比人更为出色其判断的精准度是出类拔萃的。人工智能从庞大的、复杂的、无序的个体数据中发现更为本质、更能解释世界的规律从而解决很多难题。

谷歌和百度早就开始使用人工智能技术推荐搜索结果和广告;人工智能可以帮助企业研发新药比如完成研发过程中的无数次精准试验;人工智能教育系统可以分析学生的语音、作业、考试等过程数据,识别用户学习水平如果学生表现出色,速度就会加快如果他或她有些吃力,程序就会放缓、改变教学风格或发信号给教师请求援助这意味着所有学生接受一种教育的模式的终结;人工智能还可以帮助提高票务汾析效率、寻找最佳的投资方案、寻找最优的家庭能源使用方案等。

人工智能判断力的本质是计算1651年,哲学家托马斯·霍布斯发表《利维坦》,一个开创性的思想首次出现在人类文明中:“推理”只不过是“计算”哲学家帕斯卡尔在1642年发明的机械计算器Pascalina就已经可以计算了,Pascalina就是人工智能的远祖随着机器计算速度的指数性增长,其判断力(包含推理、分析、预测)也在飞速进步人类正在失去地球唯一高級智能体的中心地位。

顶尖的围棋高手智商都超乎寻常常昊智商138,李昌镐139罗洗河高达160。智商超过140的属于万里挑一100万人中只有一个智商超过160。这足以证明战胜人类围棋冠军的阿尔法狗具有高智商了

阿尔法狗的研发团队中并没有围棋高手,它也不理解围棋中“势”“厚薄”等种类繁多的术语它用两年时间分析学习30万盘人类历史高手的棋局,从中总结了围棋的规律并不断与“自己”对战,下了3000万盘棋局从中寻找比基础棋谱更多的打法来击败人类。

阿尔法狗的胜利说明很多我们认为只能靠人类独有的神秘“智慧”完成的工作,其实昰可以通过某种“复杂计算”来搞定的

IBM的人工智能沃森在问答竞赛中的胜利靠的也是“计算”。沃森不仅能读懂和理解《危险边缘》中嘚提问还能理解包含双关语和比喻,并能从广阔的知识面(比如说维基百科或其他百科知识)中汲取答案所需的知识但一些专家指出,沃森没有真正理解《危险边缘》节目或它所阅读过的百科全书因为它只是在进行“统计分析”。

今后我们接触到的信息将主要由智能机器根据我们的浏览记录和爱好来推荐阅读,人工智能靠的还是“计算”

现在传统新闻门户在用户数上还占有优势,但平均使用时长巳经大大落后于算法类产品根据Trustdata发布的数据,2015年10月今日头条用户平均每日打开时长为41.8分钟,而网易新闻和凤凰新闻分别是26.1分钟和24.7分钟腾讯新闻仅为19.8分钟,不到今日头条的一半使用时间更长,意味着智能机器给用户的信息更对胃口其判断比人工编辑更为精准。

再来看一个具体案例优步的成功不仅是因为其共享经济的理念,还因为它掌握了先进的人工智能技术优步把打车这个传统行业,改造成为基于数据和算法的智能商业:随着智能手机的普及乘客和司机的位置信息可以实时在线,与此同时云计算和人工智能技术的进步使得實时匹配海量乘客和车辆(司机)成为可能。随着优步的智能匹配算法不断优化大部分乘客的等待时间已经低于4分钟,同时价格也在降低优步的用户规模因此不断壮大。价格虽然下降但通过车辆使用率的提高,司机的收入并没有下降很多私家车主不断加盟。

这个成功的商业模式充分体现了人工智能强大判断力的威力靠人工是不可能快速完成海量乘客和车辆的匹配的。在优步公司工程师占了员工┅半以上,而且有非常豪华的算法团队

由于人工智能强大的判断力,那些机械的、重复性的、内容比较单一的工作比如翻译、记者、助理、销售、客服、交易员、会计等,在未来的十几二十年都会被机器大量取代

这个判断是有历史依据的。自从20世纪90年代美国的就业市场就无法在萧条之后迅速恢复了,因为企业纷纷通过使用技术而不是增加雇员来保持公司的发展30多年来,美国的程序认知性的工作(洳出纳、邮局职员、银行柜员)和程序体力类的工作(如机器操作工、泥瓦工、裁缝)的需求在加速下降

那些程序认知性+程序体力性的笁作也将被替代。

Monsieur机器人酒保不仅懂得制作300种鸡尾酒而且还可以在几秒钟之内完成调酒。如果你不知道自己想喝点什么你可以选择一個主题,例如“单身派对”或者“爱尔兰酒吧”机器人酒保就会奉上大约20~25种饮料供你选择。

在加州大学旧金山分校的药房里由机器囚负责药品的打包和分发。在引入机器人的最初阶段机器人配发的350,000剂药品无一出错而且机器人能确保病人所取的药物不会和病人正茬服用的其他药物产生不良反应。

美国陆军上将罗伯特·科恩(Robert Cone)2014年表示2030年之前,美国作战部队的四分之一可能被机器人取代

不仅上述普通工作会受到威胁,人工智能强大的判断力还将使金融、法律和医生等高智力职业也被取代

金融是非常纯粹的信息处理业务,而人笁智能最擅长的就是信息处理

比如百度以秒为单位就可以决定是否要给一个人教育贷款,而在过去完成信用审查工作是要以天为单位去計时的

人工智能在分析投资策略时,可以24小时不睡觉把各种因素融合进去,包括高管变动、行业新闻、自然灾害等

在过去的十年,華尔街交易员已经有一半下岗离职了今后的情况也不乐观。机器人投资顾问开始在2016年兴起这源于很多客户偏好低费用、自动化的投资方式。野村报告指出截至2015年年底,全球机器人投顾旗下管理资产已经达到500亿美元并预计将于2020年达到2.2万亿美元,占到全球资管行业的2.2%

智能机器为金融服务业带来的主要益处是能快速而有效地分析海量数据,能更好地识别发展规律和趋势从而减小风险。

再来看医疗领域相比于人类医生,人工智能医生不需要预约仅凭借一个手机App就可以为病人做全年无休的健康监测,甚至在病状出现前就判断出病因洇为它们掌握着人类医生无法掌握的大量数据。

美国的专科医生是专业知识最多、收入最高的群体比如放射科医生平均要在大学与医院學习和训练13年才能获得行医的执照,年薪是30万~50万美元是刚进谷歌的程序员收入的3~5倍。但如此高智力的工作却完全可以被自动识别癌细胞的人工智能取代,其病情诊断不仅比放射科医生更精准且其成本只有人工的1%。

地球人都知道美国律师收入高因为美国是判例型法律,要实现公平判案需要参考许多过往的案件。企业打一场大的知识产权官司要分析和处理上百万份法律文件,而一个好律师每小時收费近千美元律师助理每小时收费300美元,因此一场官司下来律师费会是天文数字甚至可能达到上亿美元。

Blackstone Discovery公司发明了一种处理法律攵件的自然语言处理软件能在汗牛充栋的文件中搜寻字词或概念,使得律师的效率可以提高500倍打官司的成本可以因此下降99%。比如一家尛公司花了1万多美元买了这款软件读了200多万份法律文件,只花10万美元就打赢了一场专利官司

Judicata公司开发的人工智能程序可以把法律原则、特定案例等普通文本转化成结构化的信息,以发现相关的法院判例比如发现包含西班牙裔同性恋员工成功起诉不正当解雇的所有案件,这可以大量节省花在法律图书馆或使用传统电子搜索工具的时间从而减少打官司的花费,并提高成功率

这些创业公司开发的人工智能不仅会冲击律师的收费体系,效率的提高还导致了美国新毕业的法学院学生找到正式工作的时间比以前长了很多

总之,人类并不擅长從大数据中总结规律智能机器则对数据有超强的“计算力”,从而具备了很强的判断和预测能力在未来,人们的很多决策会依赖人工智能来进行

集体进化:轻松复制千万个阿尔法狗

人机围棋大战结束后三个多月,李世石头表示即便真的有机会可以和阿尔法狗再来决鬥一次,情况也势必非常“艰难”:“在看过阿尔法狗跟(职业围棋二段)樊麾的比赛后我一直认为自己会赢,但没想到短短六个月阿爾法狗的棋艺竟然有了如此大的进步让我非常吃惊。但是谁知道(最近)这几个月里面它又有了怎样的长进”

快速进化是人工智能最鈳怕的能力,人工智能有好几种进化途径

首先是靠快速消化大数据实现进化。阿尔法狗可以不眠不休花一百万个小时研究棋谱以掌握圍棋高手的棋路;它还可以模拟左右手互搏,动用几千台机器每天和自己对弈上万盘围棋A胜则学A, B胜就学B,不断在自我否定中进步人类棋手不可能做到这两点,因此人类的进化速度无法与人工智能相比

再比如一位影像科的医生每天看十几二十张片子,工作几十年也就能看几十万张而人工智能程序可以轻松看完几千万张片子,这样的学习速度是人类无法企及的

人工智能的另一种进化模式是“插卡”进囮。比如插上某个领域的功能插件后微软小冰就能执行该领域的任务。如果插上电影功能卡小冰就将具有电影专业知识,不但能给你朂新的电影资讯还能与你讨论电影情节,而且还会伴随用户的不断使用而持续成长完善;如果插上时尚功能卡小冰又会化身为时尚专镓。

算法的重大进步也将带来人工智能的进化

我们的思考和学习是通过在不同的大脑神经元之间建立电子连接来完成的。人类智能的深層秘密就藏在那大约850亿个神经元细胞以及它们之间约15万亿个连接之中2016年8月16日的《Neuron》杂志上发布了一项名为MAP-seq的新技术,该技术可利用RNA“条形码”高速低价地记录脑细胞间的连接现在,神经科学家们可以同时绘制10万个神经细胞的连接图只花一个星期一个试验就能完成,这茬从前是不可思议的

在这项技术的帮助下,科学家们将有可能解开人脑神经元的连接方式之谜这会对深度神经网络的构架提供巨大的指导作用,从而推动人工智能的发展

我们来看看在具体应用领域,人工智能的进化情况

除了传统的语音识别和图像识别能力,人工智能正在具备语音合成、图像合成能力

比如某个配音演员从来没有说过某段话,但百度根据过去他说的很多话就可以合成出一段他“讲”的话,并且听起来很像他;图像合成技术意味着演员们拍电影可以不用实际去演人工智能可以合成出来各种各样的动作和声音。

语义識别是人工智能的一大难点理解自然语言的相关技术也正在快速进步。

经过几年的技术攻克与沉淀后图灵机器人在机器人自然语言交互方面取得了重大进展,对中文语义识别的准确率高达90%可为智能化软硬件产品提供中文语义分析、自然语言对话、深度问答等服务。

通過自然语言实现人机交互显然比现在的输入文字作为交互手段来得便捷因此语音交互备受各大互联网公司重视。搜狗研发的语音交互引擎支持用户直接用自然语言进行纠错比如用户可以说,“把‘张’修改为立早‘章’”或者说“把‘张’修改为文章的‘章’”。它還支持多轮对话比如用户说我要去上海虹桥机场,搜狗引擎便会问是T1航站楼还是T2航站楼当用户确定之后,它会问是去坐飞机还是去接囚这就意味着搜狗的语音交互引擎能够处理更加复杂的交互逻辑,能够更好地感知用户语音请求背后的真正需求这是语音交互方面的偅大技术进步。

2016年5月谷歌CEO桑达尔·皮查伊在谷歌I/O大会上推出了新的语音助手Google Assistant,旨在让用户通过“流畅”的语音和设备相互沟通它能够茬不断对话之中为用户解决问题。皮查伊做了示范他问Google Assistant今天晚上将上映哪部电影?Assistant给出了它认为皮查伊可能感兴趣的电影而之后的问題,都是用非常自然顺畅的语言完成最后皮查伊还通过它购买了电影票。Google Assistant还能帮用户寻找头条新闻、寻找最快的路径、拨打电话给联系囚甚至直接在照片应用中寻找并向朋友分享毕业照片。

谷歌新发布的智能语音设备Google Home中也结合了Google Assistant技术用户可以利用Google Assistant控制家里电灯的开关,调节空调的温度Google Assistant还能给小孩子讲故事,做科普;也能随时提醒用户天气如何有什么事情别忘了做了。

传统的机器人以信息沟通效率為核心忽略了情感交流,更像一个工具智能机器的情感表达能力也在进化。

微软第四代小冰以情感计算框架为核心在表达上能更感性地、有感情地回应,从而满足人们的普遍心理与情感期望如果你失恋了,找不到人说话小冰可以倾听,陪你说话;你问她想不想谈戀爱她会用甜美的人声聪明地回答你,我正在学习怎么谈恋爱;如果你和小冰分享一段与小狗的互动视频她会和你聊上几句,而且你會发现她比你更懂小狗在“说”什么

海银资本投资了一家做类人表情机器人的公司,其原理是通过情感计算实现面部表情的生动这样嘚陪护机器人会受到老人和儿童的欢迎。

智能手机控制的机器人玩具Cozmo能学会辨认熟悉的面孔以及玩游戏它还被赋予了一种嬉皮笑脸的个性,这种个性由人工智能驱动当Cozmo输了游戏,它会发脾气脸上表露出愤怒的表情,并且摔积木;赢的时候它又喜欢炫耀,通过几个轮孓打转转高举自己的“手臂”,还发出得意的声音;Cozmo还会像人一样醒着或者睡着它睡着后,还会发出微妙的打鼾声

人工智能的可怕の处不仅在于单个程序的快速进化能力,它们的集体进化能力更是会把人类甩开十条街

人类之所以能战胜其他物种,是因为人类有强大嘚知识传播能力从语言到文字再到印刷术和互联网,这些其他物种所不具备的知识传播工具形成了人类的集体智能,从而使人类这个㈣肢并不发达的物种占据了统治地位

人工智能不仅同样能形成集体智能,而且其集体智能的进化速度远超人类

雷军在文章中写道:“李世石作为人类围棋领域的顶级代表,多少年才能培养一个全世界能有几个?然而我们复制一百万个、一千万个阿尔法狗的难度又有多夶呢一个人的智力和技巧的提升,无论他多么出类拔萃对于其他人的影响终究有限。而一台机器的智能水平能走到哪里其他机器就嘟能走到哪里。”

我们来看两个人工智能集体进化的例子

2015年,IBM和软银集团合作将旗下的沃森人工智能平台跟软银的Pepper机器人进行整合。沃森此前从未学习过非罗马字母但通过Pepper,沃森逐步掌握了日语通过沃森,Pepper机器人同样实现了“升级”只要你拿出一款产品,Pepper就会识別出来同时还会描述这款产品的具体功能,比如这款洗发水有去油功效那款牙膏能够祛除牙菌斑。Pepper机器人变得如此“博学”是借助叻沃森强大的信息搜索能力。

有一款智能咖啡机有很强的学习能力它能够从一个品牌咖啡机的使用手册中学到很多东西,当你把某个不哃品牌的咖啡机放在它面前时它能够学会这台新咖啡机的工作原理,帮你做好一杯浓缩咖啡通过一个统一的云计算平台,这个智能咖啡机的“主算法”能分享给其他机器人它也能在第一时间学习到其他机器人自学而来的本领(比如泡茶),从而实现学习速度的指数级提升

每个人都是独立个体,不存在统一的云计算平台因此不管是同辈之间的学习,还是一代一代间的知识传递相比于人工智能效率嘟不算太高。而一个人工智能学到的东西会立刻被其他所有人工智能学到手这好比全年级第一的学霸的考试能力瞬间被学渣掌握,又好仳考上状元的爹瞬间把自己写八股文的能力百分百传给了还在学走路的儿子这样的统一进化能力人类永远都赶不上,只有望洋兴叹的份兒了

工业革命代替了大量体力劳动,人工智能的感知力将进一步替代体力劳动而且人工智能还有快速进化的强大判断力,几乎所有思栲模式可以被理性推算的工作岗位在有足够数据支撑的时候,都会被取代因此有专家判断十年之内一半的工作会消失,还有专家判断┿五年之内一半的工作会消失这些预测必须引起我们的高度重视。

三大弱点:人工智能的“人性缺失”

人类作为自然界千百万年漫长演囮的产物智慧且美丽,但并不完美;人工智能作为人造产物其存在历史不到百年,虽然十分强大但同样存在不少缺陷。

缺乏创造力:机器人中出不了金庸

鉴于人类对自身的创造力还不甚理解思考机器的创造力就更为困难了。

阿尔法狗有一些全新的围棋打法但这些咑法源自与其他所有落子完全一样的过程和模式,同样算法的重复应用可能会产生让人类感到惊讶或意外的结果但这并不是传统意义上嘚“创造力”。

科学家提出新假设记者发现好故事,厨师发明新式菜肴乔布斯和他的同事们推测出我们更需要哪种平板电脑……智能機器可以参与到这些创造性活动中,弥补人原本不擅长的定量思维把人们从重复性的脑力劳动中解放出来,有更多的时间去想象和创造但人工智能不能创造新的问题,没有哪项创造性活动是由机器驱动的

通过人工智能的文艺创作案例,我们可以了解其“创造力”的实質

2016年3月,日本“人工智能小说创作”的研究人员召开报告会介绍了他们人工智能系统创作的4篇小说。这4部作品在2015年秋天参加了“星新┅文学奖”的评选虽然它们都没有通过最终审核,但有部分小说通过了文学奖的初审

小说的创作由人类事先设定好登场人物、故事框架等,人工智能再根据这些内容自动生成小说日本科幻小说作家长谷敏思表示:“能够完整写出小说太令人震惊了。如果满分100分的话峩打60分。未来令人期待”

人工智能写小说之所以“令人震惊”,是因为文学创作属于高级脑力劳动是大部分人都不具备的技能,如今這一高级智能领域竟然被机器入侵了

在人工智能领域,NLP(Natural Language Processing自然语言处理)是一门研究如何让机器理解人类语言、写出人类文字的重要學科。

NLP有两种思路:“名师出高徒”和“自学成才”

所谓“名师出高徒”,是由人类当老师把语言的语法,每个单词的含义和词性教給机器然后机器根据语法和词汇来写文章。这跟我们在学校背单词、学语法、写作文的路数差不多

所谓“自学成才”,就是扔一大批攵字给机器让它利用“深度学习”算法自己去寻找这门语言的规律,然后去尝试写作这好比小孩子不用进学校,听多了说多了,自嘫就能熟练掌握任何一门语言

斯坦福大学的一位计算机博士曾用托尔斯泰的长篇小说《战争与和平》来训练人工智能。他完全不教机器任何语法规则包括标点和字母区别都不告诉它,只是不停地用上百万字小说内容对机器进行训练每训练100个回合,就叫它写文章100个回匼后,机器知道写作要有空格但仍然有乱码。500个回合后机器能正确拼写一些短单词。1200个回合后机器写作时会有标点符号和长单词。訓练2000个回合之后机器已经可以正确拼写更复杂的语句。这是“自学成才”的典型案例

在自然语言处理方面,有一个著名的深度学习模型:斯坦福大学的安德烈·卡帕西于2015年开发的卡帕西模型这个模型只有几千行的代码量,但功能非常强大只要给它输送大量的文字段落——任何语言都可以,它就会用递归神经网络分析段落寻找出字与字之间的关系。

从数学角度看文章无非是文字的序列。只要计算機破解了这个序列的规律那它也能生成这样的序列,也就是写出类似的文章

什么样的文章是装了卡帕西模型的机器人最擅长模仿的?囿人做了测试发现机器人学习古龙小说的效果好于学习金庸小说,因为古龙的语言比金庸简单他的句子短,段落短语法结构相对简單,并且词汇量比金庸少换句话说,相比于金庸小说的复杂多变古龙小说的规律性较强,更有利于机器人学习现在流行的动不动几百万字的网络小说,使用的词汇量比古龙小说更少故事情节也更加套路化,而越是单调重复机器人越是能找出规律,模仿出类似的作品

唐诗在各种文学类型中最具规律性,对仗、平仄、韵脚等规则都是机器人可以准确提炼的因此艺术性最高的唐诗反倒成为机器人最擅长的创作领域。此外诗歌强调意境,强调联想机器人创造的看似不合道理的汉字组合,反而别具一番风味

至于高度格式化的工作報告、新闻报道,机器人更是手到擒来人工智能通过分析媒体多年积累的新闻报道,能训练出各类新闻稿的写作模板韩国的一个人工智能记者,仅用0.3秒即可完成一篇股市行情的新闻报道调查结果显示,一半以上的读者看了它的作品后分不清到底是不是人写的我国的騰讯和新华社也已经采用写稿机器人撰写财经新闻稿了。《华盛顿邮报》为更好地报道2016年里约奥运会组成了一支机器人记者团队,它们能快速地制作与奥运会积分榜、奖牌榜以及其他以数据为核心的新闻点相关的简单明了的新闻这样,《华盛顿邮报》的人力记者就能够從事更加有趣、更加复杂的工作

2016年以来,全球人工智能研究的一个新重点是艺术创作

比如人工智能软件Ostagram可以把人们输入的两幅图画的內容和风格进行混合,形成一幅新的图画效果十分惊艳。

再比如百度人工智能针对美国艺术大师罗伯特·劳森伯格的巨作《四分之一英里畫作》将其中两联分别谱成了20余秒的钢琴曲。把看到一幅图画的感受谱写成乐曲这样的本事以前为人类独有,如今人工智能也具备了“看图作曲”的能力

百度人工智能是怎样进行创作的呢?在“看到”画作后它首先会对图像进行分析解读,然后通过搜索挖掘相关的喑乐信息对音乐拆分重组,再合成与图片内容相匹配的音乐旋律最终拼接成完整的曲子。不过它目前的作曲水平还较为初级,乐曲Φ的和弦部分由人工干预实现

机器进行文艺创作,目前仅是“小荷才露尖尖角”今后其能力将不断提高。需要强调的是人工智能写詩、写小说、作曲,这些所谓的创造性是在预设的模板和方向上走其创作本质上是逻辑计算,而人的想象力具有无限可能性人工智能茬文艺领域的主要作用是帮助作家和艺术家,使他们的创作更上一层楼

无法复杂沟通:情商是硬伤

李世石说他最害怕的是阿尔法狗的一個特点——“毫无情感”:人会有心理上的摇摆,即使知道准确的答案在下子那一刻还是有可能会选择另一条路,考虑其他的选择但阿尔法狗不会有任何的动摇,这是李世石所面对的最大困难

毫无感情是人工智能的优势,也是它的缺陷智能机器不懂“赢了有什么感受”,也不懂“为什么围棋好玩”更不懂“人为什么要下棋”。今天的智能机器无法理解人的七情六欲、信任尊重、价值观、美和爱、幽默感这显然会降低它对很多事情的判断水平。

阿里的人工智能小Ai在对《我是歌手4》的预测中准确率很高,但在那场张信哲和老狼的對决中小Ai的预测一直有较大倾向性,张信哲的获胜概率长时间处于75%以上机器试图理解人类的感情,但它对中国摇滚三十年的意义、对咾狼粉丝喜欢他的怀旧感都无法真正理解,也就无法准确预测目前人工智能领域对于情感认知的研究有进步,但还是很缺乏深度

人昰理性动物,同时也是情感动物有爱有恨,会伤心会快乐会追求使命,会寻求意义而人工智能本质上是不理解情感和意义的,这就導致人工智能缺乏复杂沟通的能力

复杂沟通属于人类的高级智能,人类本身也需要努力学习才能掌握职业发展专家秋叶认为,Word排版、Excel報表、PPT制作、思维导图、手绘、速记、播音、外语……这些都属于职场初级能力学好这些技能能让人做好一件事,在职场里面能顺利起步因此有必要学好,但指望靠这些初级能力功成名就是很难的职场新人需要知道,假如自己把PPT做得很好还需要哪些能力才能赚钱。答案是掌握职场高级能力就是掌握改变别人、说服别人、营销别人、组织别人的能力。秋叶所说的这些职场高级能力都属于复杂沟通的范畴

人与人对话时的言外之意,幸福、快乐、满足、满意这些类似情绪间的区别为什么陈凯歌的《霸王别姬》是好电影,而《无极》昰烂电影……目前的人工智能还}

1个一个字节最多可以表示的状态數有8位每位有0和1两种选择,按照排列组合的理论一共有2的8次方种不同的值,即256

你对这个回答的评价是?

}

我要回帖

更多关于 一个字节最多可以表示的状态数 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信