js代码效率和java代码执行效率哪个更高_Java面试题及答案 - Go语言中文社区

js代码效率和java代码执行效率哪个更高_Java面试题及答案


900740dca8c941324de06a44ad510ab2.png

本文章会持续更新,建议收藏!!!
### Java面试复习手册(基础篇)

#### JavaSE

    1. java中==和equals和hashCode的区别?
      答:在基本类型中 == 比较的是值,而在引用类型中 == 比较的是地址值。equals在引用类型中,重写它的方法比较的是对象属性的内容,如果不进行重写是和 == 一样的。hashCode返回一个数值,就是hash码。
    2. int与integer的区别?
      答:int为基本类型,integer为int的包装类;int初始值为0,integer初始值为null;int存在栈中,integer存在堆中。
    3. 抽象类的意义是什么?
      答:抽象类不能被实列化,必须需要他的子类来实现之后才可以。这样就可以把一些共性的方法和属性进行抽象,方便代码的维护。
    4. 接口和抽象类的区别?
      答:抽象类用abstract来修饰,子类继承。接口用interface来修饰,子类来实现;抽象类除了有抽象方法之外还可以有默认方法、构造方法和静态方法,接口的方法只能是抽象方法,jdk8之后可以有静态方法。
    5. 谈谈对java多态的理解?
      答:多态就是只子类对象指向父类的引用;消除类型之间的耦合;多态的三要素:继承、重写和子类对象指向父类引用。
    6. String、StringBuffer、StringBuilder区别?
      答:string底层是一个final类型的数组,因为他是不可变的,造成很多不必要开销。stringBuffer和stringBuild有append和add方法可以进行添加,节约了开销。而后者不是线程安全的,不过效率更高。
    7. 泛型中extends和super的区别是什么?
      答:extends定义了泛型的上线而super定义了泛型的下限。
    8. 进程和线程的区别?
      答:一个程序就有一个进程,而有多个线程;进程是资源分配的最小单位,线程是程序执行的最小单位。
    9. final,finally,finalize的区别?
      答:final是被定义在变量、方法、类上面。表示不可被改变;finally是和try{}catch{}一块并用的,进行资源的释放;finalize是object中的方法,表示垃圾回收相关。
    10. Java怎么实现序列化?
      答:实现Serializable接口。
    11. Java怎么将string 转换成 integer?
      答:使用integer的parseInt方法。
    12. 静态属性和静态方法是否可以被继承?是否可以被重写?以及原因?
      答:可以被继承但不可以被重写(被隐藏了)。静态方法和静态属性属于类,调用时应该类名时去调用,不需要继承机制去调用。
    13. 讲一下常见编码方式?
      utf-8/gbk/ascII/iso-8859.
    14. 如何格式化日期?
      答:通过SimpleDateFormat("yyyy-MM-dd")来进行格式化。
    15. 说一下Java的异常体系?
      答:Throwable 是Java所有exception和error的超类。error通常不被程序捕获,是在java处理的范围之外;exception分为runtimeException和ioException。前者是在程序运行出出错,会被捕获,后者是在程序进行读写操作时报错;exception通常是用try/catch进行捕获。或者使用throws/throw进行抛出和声明。
    16. throw和throws的区别?
      答:throw代表一个动作,是抛出一个异常;throws是一种状态,代表有可能发生异常。
    17. Java反射的原理,反射创建类实例的三种方式是什么?
      答:原理是操作.class文件;三种方式:类名.class;对象.getClass;Class.forname();
    18. java当中的四种引用是什么?
      答:强引用、软引用、弱引用、虚引用。
    19. 深拷贝和浅拷贝的区别是什么?
      答:深拷贝是两个两个对象,对象的地址值不一样。浅拷贝引用指向同一个地址。
    20. 什么是编译器常量?使用它有什么风险?
      答:声明成public static final的就是编译器常量,这些在编译时就会替换掉。风险:当程序中有第三方共用这个变量值时,被其他人更改后但是你的客户端还是在使用旧的值。为了避免,要确保重新编译你的文件。
    21. 你对String对象的intern()熟悉么?
      答:此方法首先会从字符串常量池找有没有该字符串,如果没有则创建,有则直接返回。
    22. a=a+b与a+=b有什么区别吗?
      答:后者有隐性的强制类型转换,如果a为byte类型,b为int类型。前者不会编译通过,后者会直接强制类型转换。
    23. 静态代理和动态代理的区别,什么场景使用?
      答:静态代理:由程序员生成或特定工具生成源代码,再对其编译,在程序运行之前代理类的.class文件就已经存在;动态代理:运用反射机制动态创建形成。如果在代码编译之前确定了哪个是代理类就使用静态代理,其它则使用动态代理。
    24. Java中实现多态的机制是什么?
      答:重载和重写。
    25. 如何将一个Java对象序列化到文件里?
      答:实现Serializable接口,然后通过ObjectOutputStream的writeObject方法存到文件。
    26. 说说你对Java反射的理解?
      答:在运行状态下,能知道这个类的所有方法和属性;对于任何一个对象都能去调用他的方法和属性。
    27. 说说你对Java注解的理解?
      答:注解也叫元数据,它是jdk5之后引入的,可以作用于类、方法、局部变量、方法参数等。主要作用:编写文档,通过代码里的标识元数据生成文档(swagger);代码分析:通过元数据的标识和反射机制进行分析;编译检查:重载和重写等。
    28. String为什么要设计成不可变的?
      答:string在平常会大量使用,会牵扯到大量的增删改查,jvm为了确保他的的安全性所以设置为final;网路的url和文件的路径都是string类型,如果设计成不改变会有安全隐患;字符串的值是保存在常量池中,如果设计成改变的会造成逻辑上的混乱。
    29. Object类的equal和hashCode方法重写,为什么?
      答:equals方法是反应对象和变量的具体值。比较的可能是引用也可能是值。hashcode是计算出对象的实例的hash码。在判断两个对象是否相等时会判断他的hashcode是否相等,相等了再判断值是否相等。而实际应用中我们更多比较的是对象的值,所以需要重写。

#### Java多线程

    1. 开启线程的三种方式?
      答:继承Thread类,实现runable接口,实现callable接口。
    2. 说说进程,线程,协程之间的区别是什么?
      答:进程:操作系统会以进程为单位,分配系统资源,进程是资源分配的最小单位。一个进程可以包含多个线程;线程:是操作系统调度cpu的最小单位;协程:是一种用户态下的线程,完全由用户控制。协程的执行效率比线程更高。
    3. 线程之间是如何通信的?
      答:Java的等待唤醒机制,通过加锁和wait()、nofity()方法来实现。
    4. 什么是Daemon线程?它有什么意义?
      答:为守护线程,通俗讲就是服务于其它线程。当非守护线程停止守护线程才会停止。举例:qq的主程序是非守护线程,聊天窗口是守护线程,假设直接关停主程序,那么他的窗口也会关闭。
    5. 在java中守护线程和本地线程区别?
      答:前者是程序再运行时后台提供一种通用的服务线程。而后者是用户自己创建的线程。
    6. 为什么要有线程,而不是仅仅用进程?
      进程只能再一个时间干一个事,如果执行过程中遇到阻塞,进程就会挂起。线程是进程的一个实体,是cpu调用的最小单位。一个进程可以包含多个线程,并且多个线程之间可以并发执行。
    7. 什么是可重入锁(ReentrantLock)?
      答:一个可重入的互斥锁具有与使用synchronized访问的隐式监视器锁相同的基本行为和语义。
    8. 什么是线程组,为什么在Java中不推荐使用?
      答:线程组是一个线程的集合,里面也可以是线程组,除了初始线程组外,每个线程组都有一个主线程。Java的ThreadGroup中的stop,resume,suspend的方法会有安全问题,也会产生死锁。并且其本身也不是线程安全的。
    9. 乐观锁和悲观锁的理解及如何实现,有哪些实现方式?
      答:乐观锁:在操作时非常乐观,认为没有人会修改数据,所以不会加锁,只是在写入数据的时候判断是否有人修改,如果有则放弃操作,其实现操作主要有cas和版本号控制两种机制;悲观锁:在自己写入的时候认为有人会修改资源所以在操作完成之前一定会加锁,直到操作完成之后再释放锁,其实现方式为通过加锁来实现,如lock和synchronized。
    10. Java中用到的线程调度算法是什么?
      答:抢占式。一个线程执行完之后,cpu会根据优先程度和饥饿程度来判断下一个执行线程。
    11. 同步方法和同步块,哪个是更好的选择?
      答:根据自己的业务逻辑来判断,同步方法相当于this,如果整个方法需要同步则用同步方法,不需要则用同步块。
    12. run()和start()方法区别是什么?
      答:run方法只是thread类中的普通方法,会顺序执行,此时程序只有主线程一个线程;start方法则是真正的开启了一个线程,无需等待,run方法体的代码执行完毕后再继续执行下面代码,通过thread待用start方法,此时线程处于就绪状态,并没有运行。
    13. 如何控制某个方法允许并发访问线程的个数?
      答:通过Semaphore来控制最多有几个线程来访问此类。
    14. 在Java中wait和sleep方法有何不同?
      答:wait是object类的方法,会释放锁,只能在同步代码块和同步方法中使用,需要配合notify和notifyall方法配合使用;sleep是thread类方法,不会释放锁,需要捕获异常,可以在任何地方使用。
    15. Thread类中的yield方法有什么作用?
      答:使当前线程由执行状态变为就绪状态,让出cpu时间,在下一个线程执行的时候,有可能执行,也有可能不执行。
    16. 什么是不可变对象,它对写并发应用有什么帮助?
      答:不可变对象就是在创建之后就不会被改变(里面的属性也是),因为不可改变所以肯定是线程安全,如string类。
    17. 谈谈wait/notify关键字的理解?
      答:wait方法会将当前线程进入到休眠状态,只有在接到通知和中断为止,线程必须获得该对象级别的锁才可以使用wait方法。notify方法是用来可能是在等待该对象的对象锁的其他线程,如果有多个wait,可以通过指定某一个线程去通知,或者使用notifyAll方法唤醒所有。同样的这两个方法必须在同步代码块或同步方法中执行。
    18. 为什么wait, notify 和 notifyAll这些方法不在thread类里面?
      答:Java提供的锁都是对象集而不是线程级。wait,notify和notifyAll都是锁级别的操作,而锁属于对象。
    19. 什么导致线程阻塞?
      答:sleep、wait、yield、join等方法都会导致线程的阻塞。
    20. 讲一下java中的同步的方法?
      答:使用synchronized关键字进行同步方法或同步代码块的修饰;使用wait和notify方法进行代码的同步;使用volatile关键字修饰变量可以实现;使用ReentrantLock的lock和unlock来实现同步;使用本地线程也可以实现。
    21. 谈谈对Synchronized关键字,类锁,方法锁,重入锁的理解?
      答:synchronizaed是Java中的关键字,一般称为同步锁,是一个重量级锁。可以定义方法上或者定义代码块来实现代码的同步。当修饰在静态方法时锁对象是该类的.class对象称为类锁或者使用同步代码块时,使用object.this也属于类锁;当定义在方法上称为方法锁,其实方法锁的锁对象也是当前类。重入锁又分为可重入锁和不可重入锁。不可重入锁就是在访问资源时会加锁,其他线程不可以访问,容易出现死锁;可重入锁不仅会判断有没有被锁上还会判断是被谁锁上,当是自己锁上的时候依旧可以访问临界资源。并把加锁的次数增加一次,它判断了需要使用锁的线程是否为加锁的线程,如果是则可以重入。
    22. static synchronized 方法的多线程访问和作用是什么?
      答:synchronized修饰是某实列的范围,防止多个线程同事访问这个实例此方法;synchronized static是某个类的范围防止多个线程同时访问这个类的方法,他可以对类的所有实例对象起作用。
    23. 同一个类里面两个synchronized方法,两个线程同时访问的问题?
      答:当两个方法只有一个加的时候,调用时都可以进入;当两个方法都加着的时候,只有等a执行完毕后才可以调用;当a方法里面有wait时候,都可以随时进入。
    24. 你如何确保main()方法所在的线程是Java程序最后结束的线程?
      答:可以使用thread类中的joint方法来确保所有创建线程结束之后main线程再结束。
    25. 谈谈volatile关键字的作用?
      答:volatile是轻量级锁,访问该变量时不会进行加锁;volatile无法同时保证内存的可见性和原子性,只能确保他的可见性。此外它还可以禁止指令重排。
    26. 谈谈ThreadLocal关键字的作用?
      答:它是一种特殊的线程绑定方式,将变量和线程绑定在一起,通过他可以将对象的可见范围确定在一个线程之中。
    27. 谈谈NIO的理解?
      答:nio是一种新式io标准,普通io是基于字节流和字符流操作的,而nio是基于通道和缓冲区操作的,数据总是从通过读取到缓冲区的。核心主要是channel、buffer和selector三个对象。
    28. 什么是Callable和Future?
      答:使用thread和runable这两种方式实现多线程有一个缺陷,就是无法获得执行结果。callable代表一段可以调用并返回结果的代码,future表示异步任务,是还没有完成给出来未来的结果,callable用来产生结果,future用来获得结果。
    29. synchronized与Lock的区别?
      答:两者都是Java实现资源同步的作用,前者是通过锁对象及object类的wait和notify来实现,而lock是通过condition来实现线程之间的调度。lock锁的使用更加灵活,不过需要释放锁资源。
    30. ThreadLocal、synchronized 和volatile 关键字的区别?
      答:threalocal和本地线程没有关系,只是线程的一个局部变量,他为每个使用该变量的线程提供一个副本;synchronied是Java的锁机制自动实现,一般使用同步代码块和同步方法;volatile用来在多线程同步变量,当被它修饰的变量就不能缓存到线程的内存中,并不能保证原子操作。
    31. ReentrantLock 、synchronized和volatile比较?
      答:volatile只能定义变量,范围小,它只能保证操作的有序性而不能保证操作的原子性,并且他不会造成线程的阻塞;synchronized是依赖于jvm实现,reentrantLock是依据jdk实现。synchronized使用更加简单不用手动释放锁,而reentranLock需要自己加锁释放锁。
    32. 在Java中CycliBarriar和CountdownLatch有什么区别?
      答:countdownLatch是可以将一个线程或多个线程完成某个事之后再执行;cycliBarriar可以实现让一组线程等待至某个状态之后全部执行。
    33. CopyOnWriteArrayList可以用于什么应用场景?
      答:用于并发容器读多写少的情况,比如通讯录的黑白名单。
    34. ReentrantLock的内部实现?
      答:内部使用cas操作。内存值v,旧值a,新值b,如果内存位置的值和预想值相同,那么处理器就会将旧值更换成新值。它还是可重入锁,可中断锁,通过设置也可以设为公平锁和非公平锁。
    35. lock原理?
      答:lock的存储结构是一个双向链表,用来存储等待的线程,还有一个int类型的状态值;获取锁是通过cas机制进行获得锁;释放锁时是修改状态值和调整等待链表。
    36. Java中Semaphore是什么?
      答:Semaphore可以控制线程的并发数量,他的构造方法会传入一个int型的许可证,这个数是动态的,每执行一次release方法就会增加一次。
    37. Java中invokeAndWait 和 invokeLater有什么区别?
      答:由于swing是线程不安全的的单线程设计。swingutilities中提供这两个方法,两者都可以把事件派发线程到队列,前者是等待到已启动可运行的run方法之后再返回,后者是入队之后就返回。
    38. 多线程中的忙循环是什么?
      答:忙循环就是用循环让线程等待,不像wait,sleep等方法放弃cpu控制,这么做是为了保留cpu的缓存,在多核系统中,一个等待线程醒来时有可能会在另外一个内核中。这样会重建缓存。
    39. 怎么检测一个线程是否拥有锁?
      答:thread中有holdsLock方法,如果返回true则代表有锁。
    40. 死锁的四个必要条件?
      答:死锁是多个进程因竞争资源而造成的相互等待。产生的条件:互斥条件、请求等待条件、循环等待条件、不可剥夺条件。避免死锁就要防止同步方法去访问另外一个同步方法。
    41. 对象锁和类锁是否会互相影响?
      答:不会,因为对象锁是一个类的实例锁,另外一个是一个类的.class的锁。
    42. 什么是线程池,如何使用?
      答:一个装有多个线程的池子,它可以限制系统中执行线程的数量。可以减少线程的创建和销毁提高的使用率。一共有四种创建方式。
      1. newSingleThreadExecutor:创建一个单线程的线程池。
      2. newFixedThreadPool:创建固定大小线程池 。
      3. newCachedThreadPool:创建一个可缓存的线程池 。
      4. newScheduledThreadPool:创建一个大小无线的线程池 。
    1. Java线程池中submit() 和 execute()方法有什么区别?
      答:两者都可以开启线程池的任务。区别为接受的参数不一样,submit方法会返回future对象,知道线程执行之后的结果。
    2. Java中interrupted 和 isInterruptedd方法的区别?
      答:interrupted是静态方法,内部实现是调用isInterruptedd方法,并且重置了当前线程的中断状态。后者是实例方法,不会重置当前线程的中断状态。
    3. 用Java实现阻塞队列?
      答:定义:阻塞插入当队列满后,会禁止插入元素,直至不满;阻塞弹出当队列为空的时候会拒绝弹出,直至队列有数据。Java中阻塞队列有ArrayBlockingQueue、DelayQueue、LinkedBlockingQueue等;
    4. BlockingQueue介绍?
      答:它是Java阻塞队列的父接口,使用时用其实现类。也是用来存储数据的容器,常用的是add方法和poll;如果它里面的数据为空的时候,该线程会阻塞进行等待,直到有数据存入到队列中。当该队列满了之后如果再存入数据,线程会进入到阻塞状态,直到空间有数据之后。
    5. 多线程有什么要注意的问题?
      答:一定要解决线程的安全问题,防止数据不统一。还有使用共享变量时的问题。
    6. 如何保证多线程读写文件的安全?
      答:可以使用文件输出流或输入流获得fileChannel,通过tryLock进行锁操作。
    7. 多线程断点续传原理?
      答:检测本地文件的断点值和已经下载的文件长度,服务端调整文件指针到断点处。
    8. 实现生产者消费者模式?
      答:使用wait和notify或者使用Lock里的await和singal。
    9. Java中的ReadWriteLock是什么?
      答:jdk维护的一对相关锁,一个用于只读操作,另一个用于只写操作。只要没有writer,读写锁可以由多个reader线程同时保持。写入锁是独占的,也就是说多个线程可以读共享变量,只有一个线程写共享变量。
    10. 用Java写一个会导致死锁的程序,你将怎么解决?
      答:设计程序时要避免一个锁定对象还没有被释放时又要锁定另一个对象。
    11. SimpleDateFormat是线程安全的吗?
      答:不是,解决方法:没使用一次的它的parse或者format方法就要创建一次对象。
    12. Java中的同步集合与并发集合有什么区别?
      答:并发集合有ConcurrentHashMap,CopyWriteArrayList/Set,或者使用Collections里的synchronizedMap方法进行操作;HashTable是同步集合,ConcurrentHashMap引入分段概念,只有一部分是线程安全的,而HashTable执行迭代时是锁定完整的映射。
    13. Java中ConcurrentHashMap的并发度是什么?
      答:程序运行时更新ConcurrentHashMap且不产生竞争的最大线程数,默认值为16,构造方法中也可以指定。
    14. 什么是Java Timer类?如何创建一个有特定时间间隔的任务?
      答:Timer是Java里的一个工具类,可以用来安排线程在未来的某个特定时间执行。TimerTask实现了runable接口,需要继承这个类来创建自己的定时任务,并安排timer来安排他的执行。

#### 集合

    1. Collection 和Collections 的区别?
      答:Collection是所有单列集合的父接口,后者为集合的工具类。
    2. 修改对象A的equals方法的签名,那么使用HashMap存放这个对象实例的时候,会调用哪个equals方法?
      答:会调用对象的equals方法,hashMap是基于hasing的原理,当我们put值时,会先调用hashcode方法,返回的hashcode用来找到bucket位置的entry对象。
    3. List,Set,Map的区别?
      答:list和set都是单列集合,实现了collection接口,list是有序的集合,可以存放重复值,而set集合不能是无序集合并不能存放相同数据。map是双列集合,由一系列键值对组成的集合,并提供了key和value的映射。
    4. List和Map的实现方式以及存储方式?
      答:list实现:arrayList、lingedList,前者使用数组进行存储查找快后者使用链表增删快。map实现hashMap、treeMap等,前者存储方式哈希码算法快速查找键值对,后者对键按序存放。
    5. HashMap的实现原理?
      答:首先hashmap是基于hash表的map接口非同步实现,允许有null值,并且不保证映射的顺序。hashmap的底层就是数组和链表(jsk8之后是数组、链表和红黑树。当链表长度超过8 时会使用红黑树)。数组的元素就是entry对象,每个map的entry就是key-value键值对,它持有一个指向向下一个元素的引用,这样就构成了链表。hashmap存储值时,如果key为null,就将value放在数组的第一个位置,当key不为null时,会重新计算key的hashcode。并且之后会循环entry对象,如果有该key,会重新进行赋值,如果没有会将key和value的值添加到指定位置。取出元素时也是先判断key是否为null,如果不为null计算出hash值找到数组中对应位置的元素通过key的equals方法进行比较返回。
    6. HashMap如何put数据(从HashMap源码角度讲解)?
      答:通过上面的回答可以知道,是通过key的hash值得到这个元素在数组中的位置,当该位置有有其他元素,那会该位置的元素会以链表的形式存放,新加入的放在链头,如果没有该元素,就是直接加入到数组。
    7. HashMap的扩容操作是怎么实现的?
      答:通过resize方法进行扩容,hashmap如果没有指定初始值,默认值为16.如果装入数据的元素超过了默认值,就扩容成原来的两倍。
    8. HashMap在JDK1.7和JDK1.8中有哪些不同?
      答:jdk8之前hashmap的底层是数组和链表,之后变成了数组、链表和红黑树,当链表的长度超过8的时候就会使用红黑树。红黑树查询和删除的速度都要更快。
    9. ConcurrentHashMap的实现原理?
      答:此类是为了在多线程的环境下操作map实现的。相比hashtable是将get和put方法都增加synchronized会让效率更低,而concurrenthashmap使用了分段锁,并且从jdk8开始使用cas(比较与替换,如果内存地址的值是和预期原值是一样的,那么就将预期值更改为原值)乐观锁机制。
    10. HashTable实现原理?答:hashmap和hashtable的实现方式都是一样,唯一的区别是hashtable中方法都是使用了synchronized,使方法是同步的。
    11. ArrayMap和HashMap的对比?
      答:arraymap的查询速度更快,但是扩容效率上arrayMap效率更高。在数据量比较多的时使用hashmap。
    12. HashMap和HashTable的区别?
      答:hashmap的效率更高,因为实现并没有用同步方法所以线程不是安全的,并且允许有null值存在,hashtable则反之。
    13. HashMap与HashSet的区别?
      答:前者实现的是map接口,存数据是key-value的双列集合,因为通过唯一的key去查找所以效率更高;后者是set接口,存储的是单个对象,相对比hashmap查找数据,自己只能遍历查找。
    14. 集合Set实现Hash怎么防止碰撞?
      答:通过重写hahscode和equals方法。如果hash值没有存在则存储,如果hash值相同而equals不同也会存储。
    15. 数组和链表的区别?
      答:数组是一种线性表结构,他用一组连续的内存空间来存储一个类型的数据。最大的特点就是支持随机访问,但增删效率相对较低;链表并不需要一段联系的空间,它通过指针将一组零散的内存连接到一块,他的增删效率更高。
    16. Array和ArrayList有何区别?什么时候更适合用Array?
      答:array可以包含基本类型和对象类型,而arraylist只能包含对象类型,不过arraylist的长度可以进行动态的改变,并且其类的方法实现更多,开发效率高。如果处理固定大小的基本类型时,array的效率更高。
    17. EnumSet是什么?
      答:是一个与枚举类型一起使用的set实现。
    18. Comparable和Comparator接口有何区别?
      答:前者是Java.long包下,后者是util包下的。一个类实现了compareable接口就代表该类可以排序,是类内部实现的,而comparator是一个比较器,是在集合外部实现排序,当一个类没有实现comparable的时候可以自定义该类的比较器实现排序。
    19. Java集合的快速失败机制 “fail-fast”?
      答:是Java集合中一个错误检测机制,主要是为了检测bug的,当迭代集合的过程中集合机构发生了变化,就有可能发生fail-fast,会抛出ConcurrentModificationException。
    20. fail-fast 与 fail-safe 之间的区别?
      答:前者是快速失败机制,是操作原集合的时候,如果集合中发生了结构变换,就有可能发生异常;而后者是安全失败机制,在操作集合的时候,会先拷贝一个集合,然后对复制集合进行操作,不会发生异常。
    21. BlockingQueue是什么?
      答:是阻塞队列,当队列中没有数据而从队列取数据时 就会阻塞,当队列中队列已满,而要添加数据就会阻塞数据。通常的实现有arrayblockqueue、linkedblockqueue等。
    22. Iterator类有什么作用?
      答:提供一个方法可以访问一个容器里的元素,而又不会暴露这个容器的细节。
    23. poll()方法和remove()方法区别?
      答:两者都会从队列中取出一个元素,如果队列中没有元素,poll方法会返回为空,而remove会抛出异常。
    24. JAVA8的ConcurrentHashMap为什么放弃了分段锁,有什么问题吗,如果你来设计,你如何设计?
      答:jdk8中使用了node锁,减低了锁的粒度提高了效率。并使用cas机制来保证原子操作。其内部还使用了大量的synchronized锁,我认为使用reentranlock锁会更能提高性能。

#### JavaWeb

##### Servlet和Tomcat

    1. Servlet生命周期?
      答:首先加载servlet的class文件,实例化servlet。之后调用servlet的init方法,进行初始化(只执行一次);之后调用service的doget或dopost方法。最后程序关闭的时候执行destory方法。
    2. forward和redirect的区别?
      答:forward是服务器的行为,地址栏的路径不会发生改变,这是request的数据可以在jsp或者servlet中共享,效率相对高,只有一次请,一般用户用户登陆后,根据角色跳转到指定页面求;redirect是客户端行为,地址栏发生改变,此时更改了路径,request的数据不能共享,效率相对低,会发生两次请求,第一次是请求A后,A告知该请求B,再次请求B,一般用于用户注销登陆时跳转到主页面或其他页面。
    3. tomcat容器是如何创建servlet类实例?用到了什么原理?
      答:当tomcat容器启动时,会读取webapp目录下所有的web应用的web.xml文件。然后对xml进行解析,并读取servlet的注册信息。再将每个应用中注册的servlet进行加载,通过反射的机制进行实例化;servlet注册时加1,则初始化容器就加载,如果不写或负数,则第一次请求时再加载。
    4. 什么是cookie?Session和cookie有什么区别?
      答:cookie是客户端保存用户信息的一种机制,每次http请求时,客户端就会携带特定的cookie带到服务端。区别:session在服务端,cookie在客户端;session相对cookie较安全;因为session可以放在文件、数据库或内存中(比如用户未登录的购物车),存储的数据比cookie更多,单个cookie只能存4k。
    5. Servlet安全性问题?
      答:servlet默认是多线程模式执行,如果多个客户端同时访问同一个客户端,web服务器会为每一个请求创建一个线程,并在这个线程上调用servlet的service方法,如果service方法中访问了同一个变量就会引发线程安全问题。通常解决办法是在共享数据中使用synchronized进行通过或避免使用实例变量。

##### JSP

    1. jsp静态包含和动态包含的区别?
      答:引入方式不同(静态包含:<%@ include file="文件" %>,动态包含:);包含时间不一样,静态包含是先将几个文件合并再编译,动态包含是请求页面后再进行编译;动态包含可以传递参数而静态包含不可以。
    2. jsp有哪些内置对象?作用分别是什么?
      1. request :代表请求对象,用于客户端通过http协议传输服务端的数据。
      2. response:代表响应对象,主要用户向客户端发送数据 。
      3. session:主要用于保存每个月的信息和请求关联的会话。
      4. application:主要用于保存用户信息,代码片段运行的环境 。
      5. pageContext:管理网页属性,用于jsp页面的上下文。
      6. config:代码配置片段,用于servlet的配置信息。
      7. page:处理jsp页面,是object的实例,指的是jsp实现类的实例。
      8. exception:处理jsp的异常信息,发生异常时使用 。
    1. jsp和servlet的区别、共同点、各自应用的范围?
      答:jsp是servlet的扩展,本质上就是servlet。servlet存在于Java文件中,并完全从html中分离出来。而jsp是Java和html形成一个.jsp的文件,更侧重于视图,而servlet侧重于逻辑。jsp应用mvc设计模式的视图层,servlet用于mvc模式的控制层。
    2. JSP是如何被执行的?执行效率比SERVLET低吗?
      答:当客户端请求jsp页面时webContainer将jsp转换成servlet的源代码(只是第一次),然后编译成servlet加载到内存中,执行结果通过reponse响应给客户端,除了第一次jsp相对慢之外,其他的都一样。
    3. 说出Servlet和CGI的区别?
      答:servlet存在于服务器的进程中,并且它以多线程的形式访问service方法,一般不会销毁该实例,效率高;而CGI则是没请求都产生新的进程,用完就销毁,效率低。
    4. 简述JSP的设计模式?
      答:有两种,一种是jsp+JavaBean的设计模式,jsp页面响应请求并返回给用户,所有的逻辑都在javaBean中完成,实现了代码和页面的分离,适用于小型项目;另外一种是mvc设计模式,servlet用于控制层,负责响应客户端传来的逻辑处理,并决定调用哪个jsp页面
版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/weixin_39726379/article/details/110795697
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2021-06-12 11:13:21
  • 阅读 ( 1900 )
  • 分类:面试题

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢