某互联网公司的电话面试题

记录为了下次不再犯同样的错误

 

 

1. java类加载器原理和使用范畴

 

 

Java 中的类加载器大致可以分成两类,一类是系统提供的,另外一类则是由 Java 应用开发人员编写的。系统提供的类加载器主要有下面三个:

  • 引导类加载器(bootstrap class loader):它用来加载 Java 的核心库,是用原生代码来实现的,并不继承自java.lang.ClassLoader
  • 扩展类加载器(extensions class loader):它用来加载 Java 的扩展库。Java 虚拟机的实现会提供一个扩展库目录。该类加载器在此目录里面查找并加载 Java 类。
  • 系统类加载器(system class loader):它根据 Java 应用的类路径(CLASSPATH)来加载 Java 类。一般来说,Java 应用的类都是由它来完成加载的。可以通过 ClassLoader.getSystemClassLoader() 来获取它。

除了系统提供的类加载器以外,开发人员可以通过继承 java.lang.ClassLoader 类的方式实现自己的类加载器,以满足一些特殊的需求。



 在 Java 中,类的实例化流程分为两个部分:类的加载和类的实例化。类的加载又分为显式加载和隐式加载。大家使用 new 关键字创建类实例时,其实就隐式地包含了类的加载过程。对于类的显式加载来说,比较常用的是 Class.forName。其实,它们都是通过调用 ClassLoader 类的 loadClass 方法来完成类的实际加载工作的。直接调用 ClassLoader 的 loadClass 方法是另外一种不常用的显式加载类的技术。


用于类的热替换和在线升级系统的实现。

 

 

2.static块 成员变量 构造函数的加载顺序

 

public class ChildClass extends FatherClass{
	ParameterClass pc1 = new ParameterClass("child member parameter ");
	static ParameterClass pc = new ParameterClass("child static parameter ");
	{
		System.out.println("block " +"has been initialized");
	}
	static{
		System.out.println("static block " +"has been initialized");
	}
	ChildClass(){
		System.out.println("child " +"has been initialized");
	}
	public static void  main(String[] args){
		new ChildClass();
	}
}


class FatherClass{
	ParameterClass pc1 = new ParameterClass("father member parameter");
	static ParameterClass pc = new ParameterClass("father static parameter");
	FatherClass(){
		System.out.println("father " +"has been initialized");
	}
}

class ParameterClass{
	ParameterClass(String arg0){
		System.out.println(arg0 +"has been initialized");
	}
}
 

 

3. Oracle的两种加载方式OCI和THIN的区别

  • 从使用上来说,oci必须在客户机上安装oracle客户端或才能连接,而thin就不需要,因此从使用上来讲thin还是更加方便,这也是thin比较常见的原因。 

  • 原理上来看,thin是纯java实现tcp/ip的c/s通讯;而oci方式,客户端通过native java method调用c library访问服务端,而这个c library就是oci(oracle called interface),因此这个oci总是需要随着oracle客户端安装(从oracle10.1.0开始,单独提供OCI Instant Client,不用再完整的安装client) 
  • 它们分别是不同的驱动类别,oci是二类驱动, thin是四类驱动,但它们在功能上并无差异。 
  • 虽然很多人说oci的速度快于thin,但找了半天没有找到相关的测试报告。 
4.多个服务器之间如何共享SessionID
     1.  使用tomcat或者其他服务器的集群配置,主要是session的全复制技术
  • 优点:实现简单,并且具有比较高的可靠性。
  • 缺点:当网络访问量大或者session中保存有大量的信息时,比较占网络资源。如果使用异步拷贝还可能出现session不一致问题。
     2.  使用session服务器保存所有的session,重写服务器的session的相关方法,所有的session都保存在一台服务             器上。当获取session时往远端服务器获取session信息。
  • 优点:克服了内网网络开销问题
  • 缺点:当session服务器挂掉之后无法保存seesion
     3.  使用反向代理服务器使得一个session只访问对应的服务器。
  • 优点:无需实现session共享。
  • 缺点:当用户指定的服务器挂掉知道用户的session丢失。
5.list set map 区别,HashSet如何判断重复对象?

区别就不说了。HashSet内部使用HashMap存储数据,在add的时候用的是HashMap的put方法。参考HashMap的put方法
    public V put(K key, V value) {
        if (key == null)
            return putForNullKey(value);
        int hash = hash(key.hashCode());//获取key的hash值
        int i = indexFor(hash, table.length);
        for (Entry<K,V> e = table[i]; e != null; e = e.next) {
            Object k;
            if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {//先比较hash值再用equals方法
                V oldValue = e.value;
                e.value = value;
                e.recordAccess(this);
                return oldValue;
            }
        }

        modCount++;
        addEntry(hash, key, value, i);
        return null;
    }
 
6.TreeMap和HashMap区别

TreeMap:基于红黑树(Red-Black tree)的 NavigableMap 实现。该映射根据其键的自然顺序进行排序,或者根据创建映射时提供的 Comparator 进行排序,具体取决于使用的构造方法。 红黑树查找的性能比双向链表要好。

 

HashMap:基于哈希表的 Map 接口的实现。此实现提供所有可选的映射操作,并允许使用 null 值和 null 键。(除了非同步和允许使用 null 之外,HashMap 类与 Hashtable 大致相同。)此类不保证映射的顺序,特别是它不保证该顺序恒久不变。 

 

7.Http中keep-alive的作用是什么。在服务器的哪里可以配置。

Keep-alive是指在同一个连接中发出和接收多次HTTP请求。优点是:

  • 使用较少的CPU和内存
  • 开启HTTP 管道
  • 减少网络拥堵
  • 在接下来的请求中,减少传输时间。
  • 错误可以被报告但是不关闭TCP连接。

 

8.Mysql master和slaver之间是如何实现同步的?分库分表是如何实现?

 

用于写操作的mater服务器将操作日志拷贝给众slaver服务器。

 

9.Thread实现的底层原理

 

每个对象的对象锁

 

10. BIO,NIO,AIO

11.String StringBuilder StringBuffer

12 java gc

13 java中的堆和栈

 

总结在Java里面Heap和Stack分别存储数据的不同。
Heap(堆)Stack(栈)
JVM中的功能内存数据区内存指令区
存储数据对象实例(1)基本数据类型, 指令代码,常量,对象的引用地址(2)

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值