面试经验

1、HashMap、HashTable的区别

  首先Map存储的是键值对,在数组当中是通过下标对其内容进行索引的。在Map中,是通过对象索引对象,也就是说Map的Key和Value都是对象。

相同点:HashMap 和HashTable都是以Key的hashcode存储数据,可以通过Key直接的获得Value值。

不同点:1、HashMap允许Key为Null(但是最多只允许一条记录的Key是null),HashTable都不允许为Null。

              2、HashMap 去掉了HashTable的contains方法,加入了containsvalue 和containKey方法,hashMap实现的是Map接口,hashTable继承自Dictionary.

           3、HashTable是线程安全的,HashMap不支持线程同步(不是线程安全的)。所以效率而言hashMap高于HashTable。

            4、HashTable使用的是enumeration,HashMap使用的Iterator.

            5、HashTable中hash数组的默认大小是11,增加方式是old*2+1,HashMap中hash数组的默认大小是16,增加方式是以2的指数式增加的。

2、switch中支持的数据类型有byte,char,short,int,enum,string,并且注意每个case后边跟上break;

3、多线程继承thread类和实现runnable的接口,最终都是调用thread类的start()方法,通过这个方法调用的start0()方法,然后调用run方法,start0()为一个native方法,可以在主机注册申请计算机资源。
4、数据库加锁:乐观锁和悲观锁
乐观锁就是认为当前操作数据的时候,别的操作不会更改这部分数据,(
这部分的策略有
       1、复制数据到应用中,提交之前验证是不是数据被修改过            
       2、版本号,对当前加有乐观锁的表格添加一行存版本号,提交之前验证版本号)如果发生冲突,需要自行的解决冲突。
select * from tablename for update
查询条件是不是有主键和索引,对锁的级别是有影响的, 查询条件中没有主键默认为table lock ,查询条件中有主键但是查询内容为空时,不加锁, 查询条件中有主键查询内容不为空,默认行锁(row lock)。
查询带有索引的列和上面的情况差不多。

5、web容器的四个作用范围:application;session;request;page;
6、MySQL中查看执行计划关键词为:explain+sql语句;
7、自定义注解:
修饰的关键字是@interface
  元注解有:  1.@Target,  2.@Retention,  3.@Documented,  4.@Inherited

@Target:

   @Target说明了Annotation所修饰的对象范围:Annotation可被用于 packages、types(类、接口、枚举、Annotation类型)、类型成员(方法、构造方法、成员变量、枚举值)、方法参数和本地变量(如循环变量、catch参数)。在Annotation类型的声明中使用了target可更加明晰其修饰的目标。

  作用:用于描述注解的使用范围(即:被描述的注解可以用在什么地方)

  取值(ElementType)有:

    1.CONSTRUCTOR:用于描述构造器
    2.FIELD:用于描述域
    3.LOCAL_VARIABLE:用于描述局部变量
    4.METHOD:用于描述方法
    5.PACKAGE:用于描述包
    6.PARAMETER:用于描述参数
    7.TYPE:用于描述类、接口(包括注解类型) 或enum声明

@Target(ElementType.TYPE) //<span style="color: rgb(51, 51, 51); font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13.3333px; line-height: 24px;">注解Table 可以用于注解类、接口(包括注解类型) 或enum声明,而注解NoDBColumn仅可用于注解类的成员变量。</span>
public @interface Table {
    /**
     * 数据表名称注解,默认值为类名称
     * @return
     */
    public String tableName() default "className";
}
@Target(ElementType.FIELD)
public @interface NoDBColumn {
}

@Retention:

  @Retention定义了该Annotation被保留的时间长短:某些Annotation仅出现在源代码中,而被编译器丢弃;而另一些却被编译在class文件中;编译在class文件中的Annotation可能会被虚拟机忽略,而另一些在class被装载时将被读取(请注意并不影响class的执行,因为Annotation与class在使用上是被分离的)。使用这个meta-Annotation可以对 Annotation的“生命周期”限制。

  作用:表示需要在什么级别保存该注释信息,用于描述注解的生命周期(即:被描述的注解在什么范围内有效)

  取值(RetentionPoicy)有:

    1.SOURCE:在源文件中有效(即源文件保留)
    2.CLASS:在class文件中有效(即class保留)
    3.RUNTIME:在运行时有效(即运行时保留)

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)//<span style="color: rgb(51, 51, 51); font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13.3333px; line-height: 24px;">Column注解的的RetentionPolicy的属性值是RUTIME,这样注解处理器可以通过反射,获取到该注解的属性值,从而去做一些运行时的逻辑处理</span>
public @interface Column {
    public String name() default "fieldName";
    public String setFuncName() default "setField";
    public String getFuncName() default "getField"; 
    public boolean defaultDBValue() default false;
}

@Documented:

  @Documented用于描述其它类型的annotation应该被作为被标注的程序成员的公共API,因此可以被例如javadoc此类的工具文档化。Documented是一个标记注解,没有成员。

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Column {
    public String name() default "fieldName";
    public String setFuncName() default "setField";
    public String getFuncName() default "getField"; 
    public boolean defaultDBValue() default false;
}

@Inherited:

  @Inherited 元注解是一个标记注解,@Inherited阐述了某个被标注的类型是被继承的。如果一个使用了@Inherited修饰的annotation类型被用于一个class,则这个annotation将被用于该class的子类。

  注意:@Inherited annotation类型是被标注过的class的子类所继承。类并不从它所实现的接口继承annotation,方法并不从它所重载的方法继承annotation。

  当@Inherited annotation类型标注的annotation的Retention是RetentionPolicy.RUNTIME,则反射API增强了这种继承性。如果我们使用java.lang.reflect去查询一个@Inherited annotation类型的annotation时,反射代码检查将展开工作:检查class和其父类,直到发现指定的annotation类型被发现,或者到达类继承结构的顶层。

@Inherited
public @interface Greeting {
    public enum FontColor{ BULE,RED,GREEN};
    String name();
    FontColor fontColor() default FontColor.GREEN;
}

自定义注解:

  使用@interface自定义注解时,自动继承了java.lang.annotation.Annotation接口,由编译程序自动完成其他细节。在定义注解时,不能继承其他的注解或接口。@interface用来声明一个注解,其中的每一个方法实际上是声明了一个配置参数。方法的名称就是参数的名称,返回值类型就是参数的类型(返回值类型只能是基本类型、Class、String、enum)。可以通过default来声明参数的默认值。

  定义注解格式:
  public @interface 注解名 {定义体}

  注解参数的可支持数据类型:

    1.所有基本数据类型(int,float,boolean,byte,double,char,long,short)
    2.String类型
    3.Class类型
    4.enum类型
    5.Annotation类型
    6.以上所有类型的数组

  Annotation类型里面的参数该怎么设定: 
  第一,只能用public或默认(default)这两个访问权修饰.例如,String value();这里把方法设为defaul默认类型;   
  第二,参数成员只能用基本类型byte,short,char,int,long,float,double,boolean八种基本数据类型和 String,Enum,Class,annotations等数据类型,以及这一些类型的数组.例如,String value();这里的参数成员就为String;  
  第三,如果只有一个参数成员,最好把参数名称设为"value",后加小括号.例:下面的例子FruitName注解就只有一个参数成员。

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 水果名称注解
 * @author peida
 *
 */
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface FruitName {
    String value() default "";
}

一、日志中,包含某条件的行数
find access_log.20160423.txt | xargs cat | grep .*POST\\s\\/upload\\/zyb-prd.*|wc -l
例子说明:统计含"POST /upload/zyb-prd"字符串的总行数
  
二、日志中,不包含某条件的行数
find access_log.20160423.txt | xargs cat | grep -v .*HEAD\\s\\/favicon.ico.*|wc -l

例子说明:统计不含"HEAD /favicon.ico"字符串的总行数

HTTPS和HTTP的区别主要如下:

1、https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。

2、http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。

3、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。

4、http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。

ThreadLocal详解

ThreadLocal是为了使每个线程保存一份属于自己的数据,即每个线程对应一个threadLocal的实例和一个map, ThreadLocalMap是一个以ThreadLocal为key,Object为值的map(当前线程的引用对象),由ThreadLocal维护
先看一个使用ThreadLocal的实例。

01 package org.springframework.aop.framework;
02  
03  import org.springframework.core.NamedThreadLocal;
04  
05  public abstract class AopContext {
06  
07  private static final ThreadLocal <Object> currentProxy= new NamedThreadLocal <Object> ( " Current AOP proxy " );
08  
09  public static Object currentProxy() throws IllegalStateException {
10  Object proxy= currentProxy.get();
11  if (proxy== null ) {
12  throw new IllegalStateException(
13  " Cannot find current proxy: Set 'exposeProxy' property on Advised to 'true' to make it available. " );
14  }
15  return proxy;
16  }
17  
18  static Object setCurrentProxy(Object proxy) {
19  Object old= currentProxy.get();
20  if (proxy != null ) {
21  currentProxy.set(proxy);
22  }
23  else {
24  currentProxy.remove();
25  }
26  return old;
27  }
28  
29 }


上例展示的是spring框架中获取当前线程的代理对象的方法,AopContext.currentProxy(),在本线程的程序调用栈中只要调用AopContext的静态方法就可以获取本线程相关的代理对象。如果不用ThreadLocal,那么这个代理对象在创建后,就要一层层传递下去,才能在后面获取到并使用。
通过这个例子,我们可以知道[b]ThreadLocal主要是提供了一种保持对象的方法以及避免了对象在程序调用中传递的简便访问方法。ThreadLocal与共享数据和同步没有明显关系。[/b]

下面看看相关的源码以了解具体的结构。

1 public class Thread implements Runnable {
2  // ThreadLocalMap是一个以ThreadLocal为key,Object为值的map,由ThreadLocal维护
3  ThreadLocal.ThreadLocalMap threadLocals= null ;
4 }


从Thread的源码中可以得知,是每一个Thread持有一个自己的map,并不是一个ThreadLocal持有一个map。

01 public class ThreadLocal <T> {
02  
03  public T get() {
04  // 获取当前线程
05  Thread t= Thread.currentThread();
06  // 获取当前线程的threadLocals变量
07  ThreadLocalMap map= getMap(t);
08  // 从当前线程的threadLocals变量中取得本threadLocal为key的值
09  if (map != null ) {
10  ThreadLocalMap.Entry e= map.getEntry( this );
11  if (e != null )
12  return (T)e.value;
13  }
14  return setInitialValue();
15  }
16   
17  private T setInitialValue() {
18  T value= initialValue();
19  Thread t= Thread.currentThread();
20  ThreadLocalMap map= getMap(t);
21  if (map != null )
22  map.set( this , value);
23  else
24  createMap(t, value);
25  return value;
26  }
27   
28   
29  public void set(T value) {
30  // 获取当前线程
31  Thread t= Thread.currentThread();
32  // 获取当前线程的threadLocals变量
33  ThreadLocalMap map= getMap(t);
34  // 以本threadLocal为key的保存值到当前线程的threadLocals变量中去
35  if (map != null )
36  map.set( this , value);
37  else
38  createMap(t, value);
39  }
40   
41  ThreadLocalMap getMap(Thread t) {
42  return t.threadLocals;
43  }
44   
45  void createMap(Thread t, T firstValue) {
46  t.threadLocals= new ThreadLocalMap( this , firstValue);
47  }
48 }


使用ThreadLocal过程: 对于每一个需要线程保存自身实例的变量,需要定义一个静态的ThreadLocal实例。然后将一个共用的ThreadLocal静态实例作为key,将不同对象的引用保存到不同线程的ThreadLocalMap中,然后在线程执行的各处通过这个静态ThreadLocal实例的get()方法取得自己线程保存的那个对象。
此外,每个线程保存的自身数据并不是通过备份或复制的,而是new创建出来的。

通过ThreadLocal各个线程只能获取自身对应的数据,不能访问其他线程的数据,但是如果两个线程在set时引用了同一个数据,仍然存在同步问题。

java中高并发的处理思路:
1、对常用功能建立缓存模块
2、网页尽量静态化
3、使用单独的图片服务器,降低服务器压力,使其不会因为图片加载造成崩溃
4、使用镜像解决不同网络接入商和不同地域用户访问差异
5、数据库集群图表散列
6、加强网络层硬件配置,硬的不行来软的。
7、负载均衡(硬四层和软四层)


Structs2 和spring的区别

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值