面试加油站

Dubbo实践视频教程

Mar 23, 2016 | | Say something

源码下载: test-dubbo.zip Dubbo这类RPC框架在互联网企业得到了广泛的应用,如果你现在从业的是传统的ERP行业,想进军互联网行业,了解dubbo, 增加和面试官共同的话题,从而提高面试的几率。 本系列视频教程的内容如下: demo开发 已审核 zookeeper简介及使用 dubbo源码编译 已审核 监控中心简介及使用 dubbo适用场景,架构,最佳实践介绍 点击如下的连接开始学些吧 Dubbo 实践系列视频教程 该教程发布于csdn学院, 不免费,但是实惠,仅5元,一瓶水的价钱。

面试题之如何实现线程同步

Feb 14, 2015 | | Say something

1)使用synchronized关键字 java中的每个对象都有一个monitor对象,当使用synchronized关键字来同步一段代码时,java提供monitorenter和monitorexit两个字节码指令来支持同步操作, monitorenter的定义为:    每一个对象都关联一个monitor对象,线程执行monitorenter时获取该对象所关联的monitor的拥有权。如果另一个线程已经占有了该对象所关联的monitor,当前线程阻塞直到该对象被解锁,然后尝试获取拥有权。如果当前线程已经拥有该对象所关联的monitor,当前线程增加monitor的表示线程进入次数的计数器。如果该对象所关联的monitor没有被任何线程拥有,当前线程变成该monitor的拥有者,设置monitor的计数器(entry count)为1. monitorexit的定义 当前线程必须为该对象的monitor的拥有者,将表示该线程进入monitor次数的计数器减1。如果计数器的值变为0,当前线程释放monitor。如果对象关联的monitor变为自由状态,其他等待的线程才能获取monitor。 作用于成员方法和static方法的synchronized分别锁住this对象和类的class对象。 2)使用java.util.concurrent.locks包中的方法来实现线程同步 这个包中的对象使用硬件的CAS(Compare-And-Swap)原子语义来实现同步。大致的行为是,如果该变量的值为期望的值时将其改为指定的值,否则(表示被并行的其他线程修改了)什么也不做。而这些操作是在direct memory中进行的而不是heap中,查看源代码会发现使用了sun.misc.Unsafe类来操作direct memory,这个类是没有公开的,但是网上有很多介绍使用这个类来实现高性能库的方法,可以搜一下啦。 这个包中主要有三个接口Condition,Lock,ReadWriteLock。 Lock锁的语义和synchronized一致,但是增加了非阻塞式加锁tryLock(),获取可以被中断的锁,以及timeout式地获取锁。 使用Lock的代码样例为:

ReadWriteLock管理一对Lock,分别进行读和写操作的加锁。便于实现读写同步。 Condition可以通过lock.newCondition()方法来获取,它拥有的方法有await(原子地释放拥有的锁然后挂起当前线程),signal,signalAll, 实现的语义如同Object.wait, Object.notify以及Object.notifyAll方法,但是通过Condition可以在一个对象上实现多套wait集(wait-sets)。在Condition的javadoc中演示了用其实现生产者-消费者模式的示例。 参考: http://stackoverflow.com/questions/15684530/what-primitive-is-used-to-implement-the-synchronized-keyword

java面试题之统计一个字符串中各个字符的个数

Feb 11, 2015 | | Say something

在《java中一个字符到底多少个字节》中我叙述了java的char采用unicode-16编码表示,有些字符能用1个char表示(两个字节),而另一些不得不用2个char表示(4个字节), Character.isSurrogatePair(char high, char low)方法可以用来判定字符串中相邻的两个char表示一个字符还是表示两个字符,所以最后的代码为(注:我的MySQL用的字符集不支持扩展字符集,0x20001表示一个扩展字符):

上面的代码片段我们使用的是unicode-16进行统计的,当然我们可以使用”utf-8″编码来进行统计,代码为:

面试题之辞旧迎新篇(1)

Feb 6, 2015 | | Say something

前言 年终奖收入囊中,很多同事可能和我一样也开始寻觅新的机会,在此,博主javacoder.cn,将面试遇到的问题整理处理,与君分享。 1、如何查看tar包内的文件是否包含某个词组 tar -xzOf test.tar.gz  | grep abcd -O –to-stdout 将提取的内容显示在屏幕上,而不是写入文件中 2, interface和abstract class的不同 interface是设计时用于定义接口, abstract class是实现时抽取相同实现, 具体来说 不同: 抽象类能实现接口, 一个类能实现多个接口,但是只能继承一个基类,也就只能继承一个抽象类。 接口只能有常量定义和方法声明,而抽象类既可以有常量定义,方法声明,还可以有成员变量和静态变量的定义,也能有成员变量和成员函数的定义。 相同点: 都不能实例化对象, 3、4亿条数据的表如何有效的查找 (纯属个人观点,如有不对请多多指点) 现在主流的服务器的内存大概8G左右,假设每行记录大概是100字节,将系统内存的80%分给数据库使用,那么6.4G最大能缓存6400条记录,加上索引会占据一部分内存,那么在没有额外磁盘IO操作的情况下,最多能缓存5000万条记录,所以说4亿条记录就需要大量的IO操作,传统的逐行索引在这种情况下显得力不从心。 常见的解决方案是: 1)按业务上的区域,时间进行,分库,分表,直接过滤掉那些明显不匹配的数据 2)放弃关系型数据库,需求别的解决方案,比如inforbright等按列存储的产品,将过滤那些明显不满足条件的数据快的任务委托给这些专业的产品来完成。 4, 线程问题 class MyThread extends Thread{ public static void main(String[] argvs) { MyThread t = new MyThread(); t.run(); } } 如上的代码片段是否开启了一个线程,为什么? 没有启动一个新的线程,而是让t.run方法在当前线程中执行,只有t.run执行结束后main方法才能继续向下执行! 改为t.start()就能启动另一个线程。 5,一个页面加载很慢,该如何诊断原因。 […more]

java面试加油站系列-2-String

Nov 22, 2014 |

String类是java Coder使用得最多的一个工具类吧,常见的考点有: 1)常量字符串是定义在常量区,值相同的所有常量字符串其实是引用的同一个常量,包括能在编译时能计算出来的常量字符串。 示例1:

答案:true 可以看到s1 s2引用的是同一个对象, 虽然s2是通过 “javacoder” 和 “.cn”计算出来的, 由于这两个字符串是常量的,所以s2的值能在编译时确定。 示例2:

答案:false 2)字符串作为参数传递:

答案: fnjavacoder.cn main:null java中所有的对象作为参数时都是以引用的形式传递,当调用fn 时,p也指向了s1指向的对象,一个空的对象,在fn中p指向了一个新的对象“javacoder.cn”,而s1的指向没有改变,讲到这里,我相信大家对输出的结果就一目了然了, 概念性的问题: 3)为什么String 类的定义是final 的? 可以参考http://stackoverflow.com/questions/2068804/why-is-string-final-in-java 建议去stackoverflow.com逛逛,这个网站收录了很多编程的问题。你值得访问 4)String s1 = ne w String(“javacoder.cn”);构造了几个字符串? 两个,一个匿名的常量字符串“javacoder.cn”, 另一个是通过new 操作符产生的 5)String 和StringBuffer的区别 String 是不可改变的,调用String对象的任何方法都将产生新的对象, StringBuffer 的内容是可以改变的,一般用来动态的构建字符串,节省产生新对象的时间。 示例3:

使用javap -v TestString.class 反编译的结果为 0: ldc #8// load “welcome” […more]

java面试加油站系列-1-Object

Nov 21, 2014 | | Say something

在我10年毕业的时候,我的一个同学去参加tencent的校园招聘,面试官问了他一个问题, 1)请问Object类有哪些方法,每个方法的作用分别是做什么的? 他回来后用了一个幽默的比喻来表达他心中的遗憾:这个问题就如同问你蚂蚁有多少只脚,蚂蚁常见吧,但是没有仔细观察还真答不上来~,可以看出扎实的基础的重要性,万丈高楼从地起,勿在浮沙筑高楼! 我再抛出几个关于Object类的高频问题: 2)equals() 方法 和 ”==“操作符的区别 3)请问为什么要一起重写equals()方法和hashCode() 4) wait()方法和sleep() 方法的区别 5)wait() 和notify() , notifyAll() 如何协调多线程的同步工作 6)什么时候使用getClass()方法, 使用instanceOf关键字来判定某个对象是否是某个类的实例 2)答案: ”==“是用来判定两个引用是否引用的同一个对象,equals()的语义要求是用来判定两个对象的值是否相等。 3) 答案: 因为在Object中, equals()方法的实现是比较两个对象的hashCode, 而hashCode的默认实现是直接使用该对象的物理地址作为hashCode。当我们自定义了一个类,一般我们希望它能和java 已有的容器类(List Map Set)一起工作。调用List.contains(Object obj) 或者List.index()方法查找该对象是否存在时都是调用Object.equals()来比较的,所以说我们重载了equals()方法才能实现值相等。对于使用hash算法的数据结构,比如HashMap, 想调用对象的hashCode()方法找到对象大致的位置,然后通过equals() 方法找到确切的位置。比如 假如我们将我们自定义的Class Pair 放入了List中了: 示例1:

输出:false 示例2: 用eclipse的equals() 和hashCode自动产生功能。右键->source->generate equals() and hashCode

输出:true 看到了equals 方法的重要性了吧 4)答案: wait()主要用于线程同步,调用wait后该线程阻塞,等待其他线程在该对象上调用notify or notifyAll 来唤醒它。从而继续执行 5)答案 […more]