Java基础-程序员宅基地

技术标签: runtime  数据结构与算法  数据库  

JAVA基础
1、面向对象的特征有哪些方面:
1.封装:封装是面向对象编程语言对客观世界的模拟,客观世界里的属性都是被隐藏在对象内部的,外界无法直接操作和修改。
2.继承:继承是子类自动共享父类数据和方法的机制,这是类之间的一种关系,提高了软件的可重用性和可扩展性。
3.多态:如果编译时类型和运行时类型不一致,就可能出现多态,相同的类型变量调用同一个方法呈现出多种不同的行为特征。
4.抽象:抽象是忽略一个主题中与当前目标无关的因素,以便更充分地注意与当前目标有关的内容。抽象并不能解决目标中所有的问题,只能选择其中的一部分,忽略其他的部分。抽象包含两个方面:过程抽象和数据抽象。

2、String是最基本的数据类型吗?
不是。基本数据类型包括byte、short、int、long、char、float、double、boolean。

3、String s = new String("xyz");创建了几个String Object?
两个。JVM会先使用常量池来管理"xyz"对象,然后new String时创建的对象,会保存在堆内存中。

4、数组有没有length()方法?String有没有length()方法?
数组没有length()方法,有length的属性。String有length()这个方法。

5、String、StringBuffer和StringBuilder。
String是不可变的,每次对String类型进行改变的时候都会生成了一个新的String对象,然后将引用变量指向新的String对象。
StringBuffer是可变的,每次都是对StringBuffer本身进行操作,不会生成新的对象。
StringBuilder与StringBuffer兼容,两者的方法基本一致,StringBuffer线程安全,StringBuilder非线程安全。

6、int和Integer有什么区别?
int是基本数据类型,默认值是0。Integer是int的封装类,是引用类型,默认值是null。

15、final、 finally、 finalize的区别?
final用于声明属性,方法和类,分别表示属性不可变,方法不可重写,类不可继承。
finally是异常处理语句结构的一部分,表示总是执行。
finalize是Object中的方法,用于垃圾回收时清理资源。

16、Java中实现多态的机制是什么?
方法的重写Override和重载Overload是Java多态性的不同表现。重写是父类与子类之间多态性的表现,重载是一个类中多态性的表现。

17、Overload和Override的区别?
Overload:在同一个类中,方法名相同,形参列表不同,与返回类型无关的方法。
Override:在继承的基础上,方法名相同,形参列表相同,子类方法的返回类型小于或等于父类。

18、构造器Constructor是否可被Override?
构造器Constructor不能被继承,因此不能重写Override,但可以被重载Overload。

28、abstract class和interface有什么区别?
1.抽象类可以包含普通方法和抽象方法;接口只能包含抽象方法。
2.抽象类里可以定义普通属性和静态常量;接口里只能定义静态常量。
3.一个类最多只能有一个直接父类,包括抽象类;但一个类可以直接实现多个接口,从而弥补Java单继承的不足。

29、abstract的method是否可同时是static,是否可同时是native,是否可同时是synchronized?
都不可以。

30、接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承实体类(concrete class)?
接口可以继承接口。抽象类可以实现(implements)接口,抽象类是否可继承实体类,前提是实体类必须有明确的构造函数。

31、forward和redirect的区别?
forward是容器中控制权的转向,在客户端浏览器地址栏中不会显示出转向的地址。
redirect是完全的跳转,浏览器将会得到跳转的地址,并重新发送请求链接。
在前者可以满足需要的情况下,尽量使用forward()方法,这样有助于隐藏实际的链接。在有些情况下,比如需要跳转到其他浏览器的资源,则必须用sendRedeirct()方法。

32、Static Nested Class和Inner Class的区别?
Static Nested Class是被声明为静态的内部类,它可以不依赖于外部类实例被实例化。而通常的内部类需要在外部类实例化后才能实例化。

33、什么时候用assert。
assertion(断言)在软件开发中是一种常用的调试方式,它对一个boolean表达式进行检查,一个正确程序必须保证这个boolean表达式的值为true。如果该值为false,说明程序已经处于不正确的状态下,系统将给出警告或退出。一般来说,assertion用于保证程序最基本、关键的正确性。assertion检查通常在开发和测试时开启。为了提高性能,在软件发布后,assertion检查通常是关闭的。

34、short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?
short s1 = 1; s1 = s1 + 1; -- s1+1运算结果是int型,需要强制转换类型。
short s1 = 1; s1 += 1; -- 可以正确编译。

35、Math.round(11.5)等於多少? Math.round(-11.5)等於多少?
Math.round(11.5)==12
Math.round(-11.5)==-11

37、说出数据连接池的工作机制是什么?
J2EE服务器启动时会建立一定数量的池连接,并一直维持不少于此数目的池连接。客户端程序需要连接时,池驱动程序会返回一个未使用的池连接并将其表记为忙。如果当前没有空闲连接,池驱动程序就新建一定数量的连接,新建连接的数量有配置参数决定。当使用的池连接调用完成后,池驱动程序将此连接表记为空闲,其他调用就可以使用这个连接。

39、swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上?
switch可以用byte、short、int、char和枚举。JDK1.7新增String。

40、用最有效率的方法算出2乘以8等于几?
2 << 3

41、两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对?
不对,有相同的hash code。

42、当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?
是值传递。Java编程语言只有值传递参数。当一个对象实例作为一个参数被传递到方法中时,参数的值就是对该对象的引用。对象的内容可以在被调用的方法中改变,但对象的引用是永远不会改变的。

43、编写单例模式。
Singleton模式主要作用是保证在Java应用程序中,一个类只有一个实例存在。
public class Singleton {
private Singleton(){}
private static Singleton instance = null;
public static synchronized Singleton getInstance() {
if (instance==null){
instance=new Singleton();
}
return instance;
}
}

48、char型变量中能不能储存一个中文汉字?为什么?
char型变量可以储存一个中文汉字,因为Java中以unicode编码,一个char占16个字节。

49、简述逻辑操作(&,|,^)与条件操作(&&,||)的区别。
a.逻辑操作不仅可以操作布尔型,而且可以操作数值型,条件操作只能操作布尔型的。
b.逻辑操作不会产生短路。

50、Java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类?
字节流,字符流。字节流继承于InputStream、OutputStream,字符流继承于Reader、Writer。

51、Java中会存在内存泄漏吗,请简单描述。
会。如:int i,j; return (i-j); 当i为足够大的正数,j为足够大的负数,就会造成内存泄漏。

52、什么是java序列化,如何实现java序列化?
对象序列化的目标是将对象保存到磁盘,或允许在网络中直接传输对象。对象序列化机制允许把内存中的Java对象转换成平台无关的二进制流,从而允许把这种二进制流持久地保存在磁盘上,通过网络将这种二进制流传输到另一个网络节点。

53、是否可以从一个static方法内部发出对非static方法的调用?
不可以。

54、写clone()方法时,通常都有一行代码,是什么?
super.clone();super.clone并不是简单的调用父类的clone方法,因为Object的clone方法使用了RTTI(运行时类型识别)机制,可以动态的找到目前正在调用clone方法的那个引用,并找到它指向的对象,然后根据这个对象的大小去申请内存空间,然后进行bitwise(逐位)的复制, 将该对象的内存空间完全复制到新的空间中去,从而达到克隆的目的。

55、在Java中,如何跳出当前的多重嵌套循环?
break或return。

56、说出一些常用的类,包,接口,请各举5个。
常用的类:String、StringBuffer、Integer、Thread、System、Arrays、FileReader、FileWirter。
常用的包:lang、util、io、sql、net。
常用的接口:Set、List、Map、Iterator、Document、NodeList。

57、内部类可以引用它包含类的成员吗?有没有什么限制?
一个内部类对象可以访问创建它的外部类对象的内容。

58、匿名内部类是否可以继承其它类,是否可以实现接口?
可以继承其它类或实现其它接口,在swing编程中常用此方式。

59、一个“.java”源文件中是否可以包括多个类(不是内部类)?有什么限制?
可以包含多个类。但是public修饰的类只能有一个,并且要与文件名相同。

69、我们在web应用开发过程中经常遇到输出某种编码的字符,如iso8859-1等,如何输出一个某种编码的字符串?
public String translate (String str) {
String tempStr = "";
try {
tempStr = new String(str.getBytes("ISO-8859-1"), "GBK");
tempStr = tempStr.trim();
}
catch (Exception e) {
System.err.println(e.getMessage());
}
return tempStr;
}

70、XML文档定义有几种形式?它们之间有何本质区别?解析XML文档有哪几种方式?
XML文档有两种形式:Schema、DTD。Schema是标准的XML文件,可以被XML解析器解析,而DTD则使用自己的特殊语法。
DOM:DOM在解析文件之前把整个文档装入内存,处理大型文件时其性能较差,适合对XML的随机访问。
SAX:SAX是事件驱动型的XML解析方式。它顺序读取XML文件,不需要一次全部装载整个文件,适合对XML的顺序访问。
STAX:Streaming API for XML (StAX)

71、排序都有哪几种方法?请列举。用JAVA实现一个快速排序。
排序的方法有:插入排序(直接插入排序、希尔排序),交换排序(冒泡排序、快速排序),选择排序(直接选择排序、堆排序),归并排序,分配排序(箱排序、基数排序)

73、J2EE是技术还是平台还是框架?
J2EE本身是一个标准,一个为企业分布式应用的开发提供的标准平台。J2EE也是一个框架,包括JDBC、JNDI、RMI、JMS、EJB、JTA等技术。

74、WebService。
WebService:可以实现不同平台间的通信。任何两个应用程序,只要他们能读写XML,WebService就能使它们通信。
SOAP:简单对象访问协议。将程序对象编码成为XML对象的规则,执行远程过程调用(RPC)的约定。
WSDL:WebService的描述语言。用于描述WebService中函数、参数和返回值。因为是基于XML的,所以WSDL既是机器可阅读的,又是人可阅读的。
UDDI:电子商务建立标准。为WebService实现标准规范。

75、JDBC的连接步骤。
1.加载JDBC驱动程序。Class.forName("com.mysql.jdbc.Driver");
2.建立连接。Connection conn = DriveManage.getConnection(url,userName,password);
3.建立Statement。Statement stmt = conn.createStatement();
4.执行SQL,获取结果集。ResultSet rs = stmt.executeQuery("select * from ...");
5.处理结果集。while(rs.next()){String name = rs.getString("name");}
6.关闭连接。if(rs != null){rs.close();}

76、解析XML。
1.DOM:读取整个XML文档,在内存中创建DOM树,不适合操作较大的文件。
2.SAX:SAX是事件驱动,不需要读取整个文件。

77、乐观锁和悲观锁。
乐观锁(Optimistic Lock)。每次去拿数据的时候都认为别人不会修改,所以不会上锁。但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。乐观锁适用于多读的应用类型,这样可以提高吞吐量,像数据库如果提供类似于write_condition机制的其实都是提供的乐观锁。
悲观锁(Pessimistic Lock)。每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。

80、NIO和IO的主要区别。
IO:面向流、阻塞IO、无
NIO:面向缓冲、非阻塞IO、选择器

81、分布式、集群、SOA、微服务之间的区别。
分布式:一个业务分拆多个子业务,部署在不同的服务器上
集群:同一个业务,部署在多个服务器上
SOA:面向服务的架构。它是一种设计理念,包含多个服务
微服务:微服务和SOA类似

82、什么是微服务?微服务的优缺点。
微服务是一种架构风格,把一个大型复杂的应用拆分成多个服务。各个服务之间松耦合,可独立部署。
优点
1.解耦,将整个业务拆分为多个服务,降低复杂度。
2.可独立部署。
3.易于扩展。如果某一个服务的性能到达瓶颈,只需要增加该服务的节点即可。
4.每个服务可以有专门的团队来开发。
缺点
1.当服务数量增加,管理复杂性也增加。

83、REST和RPC
REST:REST是一种架构风格,指的是一组架构约束条件和原则。REST规范把所有内容都视为资源,对资源的操作对应HTTP协议提供的GET、POST、PUT和DELETE方法。
RPC:远程过程调用,就是像调用本地方法一样调用远程方法,通信协议大多采用二进制方式。
REST与RPC比较
REST:通信协议(HTTP)、性能(低)、灵活度(高)
RPC:通信协议(一般使用TCP)、性能(高)、灵活度(低)
建议
REST调用及测试都很方便,RPC就显得有点繁琐,但是RPC的效率是毋庸置疑的。所以建议在多系统之间的内部调用采用RPC。对外提供的服务,REST更合适。

84、SpringCloud和Dubbo。
SpringCloud满足了构建微服务所需的所有解决方案。包含了注册中心Eureka、客户端负载均衡器Ribbon ,客户端调用工具Rest和Feign,分布式配置中心Config,服务保护Hystrix,网关Zuul Gateway ,服务链路Zipkin,消息总线Bus等。
Dubbo实现了服务治理。缺少分布式配置中心、网关、链路、总线等,如果需要用到这些组件,需要整合其他框架。
两者所解决的问题域并不一样:
Dubbo更多的是一个RPC框架,而SpringCloud是微服务架构下的一站式解决方案。


一、异常
1、异常处理机制的简单原理。
Java的异常机制主要依赖try、catch、finally、throw和throws五个关键字。
在执行try里的业务逻辑代码出现异常时,系统会自动生成一个异常对象,该异常对象被提交给JVM,这个过程被称为抛出(throw)异常。当JVM收到异常对象时,会寻找能处理该异常对象的catch,这个过程被称为捕获(catch)异常。如果JVM找不到捕获异常的catch,则运行时环境终止,Java程序也将退出。

2、自定义异常。
自定义异常需要继承Exception或者RuntimeException。

3、Checked异常和Runtime异常:
Checked异常要么显示声明抛出,要么显示捕获并处理它,总之不允许对Checked异常不闻不问。
Runtime异常是运行时可能发生的异常。

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

5、error和exception有什么区别?
error一般是指与虚拟机相关的问题。如系统崩溃、虚拟机错误,这种错误不可能捕获也无法修复,将导致程序中断。
exception表示一种设计或实现问题。异常是可以修复的。

6、Java常见异常
1.NullPointerException
空指针异常,调用了未经初始化的对象或者是不存在的对象。
2.ClassNotFoundException
指定的类不存在。
3.NumberFormatException
字符串转换为数字异常。
4.IndexOutOfBoundsException
数组下标越界异常
5.IllegalArgumentException
方法的参数错误
6.IllegalAccessException
没有访问权限
7.ArithmeticException
数学运算异常,当算术运算中出现了除以零这样的运算就会出这样的异常。
8.ClassCastException
数据类型转换异常
9.FileNotFoundException
文件未找到异常
10.ArrayStoreException
数组存储异常,当试图将类型不兼容类型的对象存入一个Object[]数组时将引发异常。
11.NoSuchMethodException
方法不存在异常
13.EOFException
文件已结束异常
14.NoClassDefFoundException
未找到类定义错误,当Java虚拟机或者类装载器试图实例化某个类,而找不到该类的定义时抛出该错误。


二、集合
Collection
├ List
│ ├LinkedList
│ ├ArrayList
│ └Vector
│ └Stack
|
└Set
└TreeSet
└HashSet

Map
├ Hashtable
├ HashMap
└ WeakHashMap

1、List、Set、Map的区别?
1.List:元素有序,可重复。
2.Set:元素无放入顺序,不可重复,重复元素会覆盖掉。
3.Map:键值对,key不可重复,value可重复。
虽然说有些集合是无序的,但是子类个别的也是按照另一种方式进行了排序,只不过不符合我们日常的排序方式。是按照某种规则进行的。

2、Collection和Collections的区别?
Collection是集合类的上级接口,继承他的接口主要有Set和List。
Collections是针对集合类的一个帮助类,它提供一系列静态方法实现对各种集合的搜索、排序、线程安全等操作。

3、ArrayList、Vector、LinkedList的存储性能和特性。
ArrayList和Vector都是基于数组实现的List类,所以都封装了一个动态的、允许再分配的Object[]数组,在随机访问集合元素时有较好的性能。ArrayList是线程不安全的,所以在性能上ArrayList比Vector高。
LinkedList内部以链表的形式来保存集合中的元素,随机访问集合元素时性能较差,但在插入、删除元素时性能非常出色,因为只需要改变指针所指的地址即可。

4、HashMap和Hashtable的区别?
HashMap允许null作为key或value,Hashtable不允许null作为key或value。
HashMap线程非安全,Hashtable线程安全,所以HashMap比Hashtable的性能高一点。

5、Set里的元素是不能重复的,那么用什么方法来区分重复与否呢?
Set里的元素是不能重复的,用iterator()方法来区分重复与否。equals()是判读两个Set是否相等。

6、HashMap实现原理
当往HashMap里面put元素的时候,首先会计算key的哈希值,根据哈希值得到当前元素的索引。存储时,如果当前key的哈希值已经存在,新的value会覆盖老的value。否则把当前key-value放入链表中。
JDK1.8之前:数组+链表
JDK1.8:数组+链表+红黑树

7、HashMap性能
HashMap有两个参数影响其性能:初始容量和负载因子。均可以通过构造方法指定大小。
1.容量capacity是HashMap中bucket哈希桶(Entry的链表)的数量,初始容量只是HashMap在创建时的容量,最大设置初始容量是2^30,默认初始容量是16(必须为2的幂),解释一下,当数组长度为2的n次幂的时候,不同的key通过indexFor()方法算得的数组位置相同的几率较小,那么数据在数组上分布就比较均匀,也就是说碰撞的几率小,相对的,get()的时候就不用遍历某个位置上的链表,这样查询效率也就较高了。
2.负载因子loadFactor是HashMap在其容量自动增加之前可以达到多满的一种尺度,默认值是0.75。


三、多线程
1、进程和线程的区别?
进程是操作系统资源分配的基本单位,而线程是任务调度和执行的基本单位。
一个程序至少有一个进程,一个进程至少有一个线程。

2、创建线程有几种方式?
1.继承Thread类,重写run方法。
2.实现Runnable接口,重写run方法。
3.实现Callable接口,重写call方法,有返回值。
4.Executor线程池。

3、线程池比较单线程的优势。
1.重用存在的线程,减少对象创建、消亡的开销,性能佳。
2.可有效控制最大并发线程数,提高系统资源的使用率,同时避免过多资源竞争,避免堵塞。
3.提供定时执行、定期执行、单线程、并发数控制等功能。

4、Executor提供了几种线程池?
1.newCachedThreadPool:创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程(线程最大并发数不可控制)。
2.newFixedThreadPool:创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
3.newScheduledThreadPool:创建一个定长线程池,支持定时及周期性任务执行。
4.newSingleThreadExecutor:创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。

5、线程的生命周期。
NEWS:新建,新建一个线程对象,但还没有调用start方法。
RUNNABLE:运行,线程可运行或正在运行。
BLOCKED:阻塞,等待获取对象锁。是线程阻塞在进入synchronized关键字修饰的方法或代码块时的状态。
WAITING:等待,执行了无超时参数的wait函数。
TIMED_WAITING:定时等待,执行了带有超时参数的wait、sleep或join函数。
TERMINATED:终止,线程结束。线程一旦结束就不能复生,在一个终止的线程上调用start方法会抛出异常。

6、什么是守护线程?
守护线程又被称为精灵线程、后台线程。是指在程序运行时在后台提供一种通用的线程,比如垃圾回收线程。如果用户线程已经全部退出运行,只剩下守护线程存在,虚拟机也就退出了。在线程启动之前,通过setDaemon(true)方法来将线程设置为守护线程。

7、什么是多线程上下文切换。
多线程的上下文切换是指CPU控制权由一个已经正在运行的线程切换到另外一个就绪并等待获取CPU执行权的线程的过程。

8、线程阻塞。
阻塞指的是暂停一个线程的执行以等待某个条件发生。Java提供了大量方法来支持阻塞:sleep、suspend、resume、yield、wait、notify。

9、wait、notify、suspend、resume之间的区别?
wait、notify需要配套使用,当调用这两个方法阻塞时要释放占用的锁。
suspend、resume需要配套使用,suspend方法使得线程进入阻塞状态,并且不会自动恢复,必须其对应的resume方法被调用,才能使得线程重新进入可执行状态。

10、怎么唤醒一个阻塞的线程?
如果线程是因为调用了wait、sleep或者join方法而导致的阻塞,可以中断线程,并且通过抛出InterruptedException来唤醒它。

11、什么是死锁以及避免死锁。
死锁是指由于两个或者多个线程互相持有对方所需要的资源,导致这些线程处于等待状态,不能继续执行。
避免死锁:加锁顺序、加锁时限、死锁检测。

12、启动一个线程是用run还是start?
启动一个线程是调用start方法。调用start开始一个线程后,线程就进入就绪状态。当获得JVM的调度,才开始执行run方法。run方法是必须重写的,run方法中包含的是线程的主体。

13、stop和suspend方法为何不推荐使用?
stop会解除线程的所有锁定,当其它线程修改共享数据时,无法保证数据的完整性。suspend方法容易发生死锁,调用suspend方法时,目标线程被暂停,但却仍然持有在这之前获得的锁定。

14、简述synchronized和Lock的异同?
Lock能完成synchronized所实现的所有功能。Lock有比synchronized更好的性能,synchronized会自动释放锁,而Lock要求程序员手工释放。

15、当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法?
其它线程可以同时访问这个对象的非同步方法,但是不能访问该对象的同步方法。

16、sleep和wait有什么区别?
1.sleep不会释放同步锁,wait会释放同步锁,使得其它线程可以使用同步块或者同步方法。
2.sleep可以在任何地方使用,wait只能在同步块或同步方法中使用。
3.sleep需要捕获异常,wait不需要捕获异常。

17、同步和异步有何不同,分别在什么情况下使用他们?
如果正在写的数据以后可能被另一个线程读到,那么这些数据就是共享数据,必须进行同步存取。
如果程序不需要等待某个方法的返回时,就应该使用异步编程,在很多情况下采用异步途径往往更有效率。

18、请说出你所知道的线程同步的方法。
wait:使一个线程处于等待状态,并且释放对象锁。
sleep:使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要捕捉InterruptedException异常。
notify:唤醒一个处于等待状态的线程。
allnotity:唤醒所有处入等待状态的线程。

19、为什么wait、nofity、nofityAll这些方法不放在Thread类当中?
JAVA提供的锁是对象级的而不是线程级的,每个对象都有锁,通过线程获得。如果线程需要等待某些锁那么调用对象中的wait方法就有意义了。

20、ThreadLocal的作用是什么?
1.ThreadLocal用来解决多线程程序的并发问题。
2.ThreadLocal并不是一个Thread,而是Thread的局部变量,当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程提供独立的变量副本,所以每个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。
ThreadLocal的原理:
在ThreadLocal类中有一个Map,用于存储每一个线程的变量副本,Map中元素的键为线程对象,而值对应线程的变量副本。

21、ConcurrentHashMap的工作原理。
ConcurrentHashMap是线程安全的。
Java1.6
采用分离锁的方式,它并没有对整个hash表进行锁定,而是局部锁定,也就是说当一个线程占有这个局部锁时,不影响其他线程对hash表其他地方的访问。
Java1.8
ConcurrentHashMap不再使用分离锁,而是采用一种乐观锁CAS算法来实现同步问题,但其底层还是“数组+链表->红黑树”的实现。

22、同步方法和同步块的区别?
同步块的效率更高。同步的范围越多,越影响程序执行效率,因此用同步代码块可以尽量缩小影响范围。

23、你有哪些多线程开发良好的实践?
给线程命名。
最小化同步范围。
优先使用volatile。
尽可能使用更高层次的并发工具而非wait和notify来实现线程通信,如BlockingQueue,Semeaphore。
优先使用并发容器而非同步容器。
考虑使用线程池。


四、IO


五、JVM
1、GC是什么? 为什么要有GC?
GC是垃圾回收机制。Java程序的内存分配和回收都是由JVM在后台进行的,在CPU空闲或内存不足时自动进行垃圾回收,程序员无法精确控制垃圾回收的时间和顺序。

2、垃圾回收的原理和优点。并考虑2种回收机制。
JVM提供了一个后台线程去扫描堆内存中对象的状态,当有对象没被引用时,就会在CPU空闲或内存不足时自动进行垃圾回收。回收机制有分代复制垃圾回收和标记垃圾回收,增量垃圾回收。

3、垃圾回收器的基本原理是什么?垃圾回收器可以马上回收内存吗?有什么办法主动通知虚拟机进行垃圾回收?
JVM提供了一个后台线程去扫描堆内存中对象的状态,当有对象没被引用时,就会在CPU空闲或内存不足时自动进行回收,程序员无法精确控制垃圾回收的时间和顺序。System.gc()只是建议垃圾回收器进行回收处理,调用它并不能保证内存会被立即回收。

4、描述一下JVM加载class文件的原理机制?
JVM中类的装载是由ClassLoader和它的子类来实现的。ClassLoader是一个重要的Java运行时系统组件,它负责在运行时查找和装入类文件。


六、JSP、Servlet
1、JSP中动态include与静态include的区别?
动态include总是会检查所含文件中的变化,适合用于包含动态页面,并且可以带参数。<jsp:include page="included.jsp" flush="true" />
静态include不会检查所含文件的变化,适用于包含静态页面。<%@ include file="included.jsp" %>

2、JSP的内置对象及方法。
request:请求对象。包含了浏览器请求的信息,并且提供了几个用于获取cookie,header,和session数据的方法。
response:响应对象。用于服务器对客户端的响应(如cookies,头信息等)。
session:会话对象。可以存储用户的状态信息。
out:输出对象。用于将数据输出到页面。
pageContext:上下文对象。它是用于方便存取各种范围的名字空间、servlet相关的对象的API,并且包装了通用的servlet相关功能的方法。
application:应用程序对象。这有助于查找有关servlet引擎和servlet环境的信息。
page:代表该页面本身。其类型就是生成的Servlet类。
config:配置对象。该对象代表该JSP的配置信息。
exception:异常对象。该对象代表其它页面中异常和错误。

3、JSP的常用指令。
<%@ page contentType="text/html" charset="utf-8" language="java" %>
<%@ include file="queryUser.jsp" %>
<%@ taglib prefix=”c” uri=”http://……”%>

4、jsp有哪些动作?作用分别是什么?
jsp:include:在页面被请求时引入另一个文件。
jsp:useBean:寻找或实例化一个JavaBean。
jsp:setProperty:设置JavaBean的属性。
jsp:getProperty:输出JavaBean的属性。
jsp:forward:把请求转到另一个页面。
jsp:plugin:根据浏览器类型为Java插件生成object或embed标记。

5、页面间对象传递的方法。
request,session,application,cookie等。

6、什么情况下调用doGet()和doPost()?
JSP页面中的form标签里的method属性为get时调用doGet(),为post时调用doPost()。

7、Servlet的生命周期。
web容器加载Servlet,生命周期开始。通过调用Servlet的init()方法进行Servlet初始化。通过调用service()方法处理请求。最后web容器调用destroy()方法销毁Servlet。

8、如何现实Servlet的单线程模式。
<%@ page isThreadSafe=”false”%>

9、JSP和Servlet有哪些相同点和不同点,他们之间的联系是什么?
JSP是Servlet的扩展。JSP是Java和HTML组合的一个扩展名为.jsp的文件,而Servlet完全从表现层中的HTML分离出来了。在容器中运行时,JSP会被编译成相应的Java文件。只是JSP侧重于视图,Servlet主要用于控制逻辑。

 

转载于:https://www.cnblogs.com/lc19149/p/9341094.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_34221112/article/details/93952613

智能推荐

已解决(selenium操作火狐浏览器报错)TypeError: __init__() got an unexpected keyword argument ‘firefox_options‘-程序员宅基地

文章浏览阅读1.6w次,点赞8次,收藏18次。已解决(selenium操作火狐浏览器报错)TypeError: __init__() got an unexpected keyword argument ‘firefox_options‘_typeerror: __init__() got an unexpected keyword argument 'chrome_options

python方差_Python编程:方差、标准差、均方差、均方根值、均方误差、均方根误差...-程序员宅基地

文章浏览阅读315次。python实现代码# -*- coding: utf-8 -*-import mathdef get_average(records):"""平均值"""return sum(records) / len(records)def get_variance(records):"""方差 反映一个数据集的离散程度"""average = get_average(records)return sum(..._pycharm方差计算代码

jmeter接口测试实例(五)对cookies的自动管理,实现登录后修改用户信息_jmeter中post请求如何更改每次的用户名-程序员宅基地

文章浏览阅读902次。一、前提:cookie是保存在本地,用来记录用户信息,最典型的作用是判断用户是否已经登录。如果一个接口,需要用户登录后,才能进行操作,如下,修改用户信息那么这时候,就需要用到cookie去识别这个登录的用户,因为要修改的是这个登录的用户的信息。二、使用1、jmeter.properties 中 将CookieManager.save.cookies 设置为true。完成后重启jmet..._jmeter中post请求如何更改每次的用户名

python新建项目没有venv_pycharm配置venv虚拟环境-程序员宅基地

文章浏览阅读7.5k次,点赞2次,收藏2次。虚拟环境的好处:搭建独立的python运行环境,不与其他产生冲突虚拟环境有助于包的管理和防止版本冲突3.删除卸载方便虚拟环境的搭建:1.进入python的Scripts下,执行:pip3 install virtualenv2.选择建立虚拟环境的文件夹,我这边是直接在D盘software下面创建了一个virtualenv,如图:image.png3.创建虚拟环境:virtualenv --no-s..._pycharm没有venv怎么办

M1芯片的Mac在开发iOS项目时遇到的问题汇总(模拟器无法运行,Cocoapods错误等)_oc cocospods 安装依赖库之后不能使用模拟器了-程序员宅基地

文章浏览阅读2.3k次。--pod install时报错,且错误提示中有“ffi”字眼,提示错误:/Library/Ruby/Gems/2.6.0/gems/ffi-1.15.3/lib/ffi/library.rb:275: [BUG] Bus Error at 0x00000001042fc000 ruby 2.6.3p62 (2019-04-16 revision 67580) [universal.arm64e-darwin20]解决方案:juejin.cn/post/698064…--pod repo upd_oc cocospods 安装依赖库之后不能使用模拟器了

编辑器VSCode使用心得-程序员宅基地

文章浏览阅读540次。工欲善其事必先利其器,趁手的工具会使我们开发事半功倍。市面上的编辑器我用过许多,编辑器使用经历Notepad++,(开源)这个应该是最轻量级的吧,查看代码还好,编辑代码就算了官网地址:https://notepad-plus-plus.org/Brackets,(开源)这个也不错,github-star:30k了,上次发布版本是6月..._vscode nextick

随便推点

西部数码mysql怎么用织梦_[原创]织梦程序(DeDeCms)常见问题集锦-程序员宅基地

文章浏览阅读95次。前言:织梦程序是最知名的cms程序,使用广泛,但很多朋友对织梦还不太熟悉,通过工单分析得知,经常容易出现本文中的问题,本次统一整理出来,希望对新手朋友有帮助,本文写的非常详细,请仔细阅读,一、描述:“dedecms错误警告:连接数据库失败,可能数据库密码不对或数据库服务器出错”如图:分析:用织梦程序制作的站点做迁移服务器后容易出现这个问题,原因是程序中设置的数据库连接信息有误连接不到数据库,解决方..._西部数码支不支持织梦的程序

免安装mysql启动3534错误处理_mysql 免安装版本启动时 3534出错_mysql-程序员宅基地

文章浏览阅读295次。上午在win7下安装MYSQL,只到“net start mysql”这一步报错:3534的错误:于是在百度中搜索关键字“mysql服务无法启动3534”。参考以下两个链接中的方法,解决了3534启动失败的问题:mysql服务无法启动3534错误。http://jingyan.baidu.com/article/219f4bf7e978fcde442d38a9.htmlhttp://blog.cs..._免安装mysql启动失败

评测了10款画流程图软件,这4款最好用!(完全免费)_好用的流程图软件免费-程序员宅基地

文章浏览阅读5.1w次,点赞58次,收藏295次。最近在做项目和复习的时候,用了不少流程图软件给我帮了大忙,所以今天就来分享分享你在网上搜索一下流程图软件,能找到很多很多:但这些软件多数并不是专门绘制流程图的软件,它可能是一些思维导图软件、或者说一些产品交互原型图软件,使用时或多或少有些麻烦。而且,普遍这些软件缺点也很多,比如:只有在线版:ProcessOn(https://www.processon.com)导出功能收费:迅捷流程图软件体积庞大:VISIO就没有一款简单易用、绿色免费的流程图软件吗?阿虚花了不少时间,挨着_好用的流程图软件免费

在CentOS6.9安装Azkaban3.50.0_centos6.9 azkaban-程序员宅基地

文章浏览阅读1.4k次。cd /data/install_pkgwget https://github.com/azkaban/azkaban/archive/3.50.0.tar.gztar -zxvf 3.50.0.tar.gzvi /data/install_pkg/azkaban-3.50.0/azkaban-common/src/main/java/azkaban/utils/EmailMessage..._centos6.9 azkaban

Java项目基于ssm+vue.js的学生宿舍维修服务平台附带文章和源代码设计说明文档ppt-程序员宅基地

文章浏览阅读586次,点赞23次,收藏30次。博主介绍:CSDN特邀作者、985计算机专业毕业、某互联网大厂高级全栈开发程序员、码云/掘金/华为云/阿里云/InfoQ/StackOverflow/github等平台优质作者、专注于Java、小程序、前端、python等技术领域和毕业项目实战,以及程序定制化开发、全栈讲解、就业辅导、面试辅导、简历修改。精彩专栏 推荐订阅2023-2024年最值得选的微信小程序毕业设计选题大全:100个热门选题推荐2023-2024年最值得选的Java毕业设计选题大全:500个热门选题推荐。

ultralytics的YOLOv8改为自用版本_from ultralytics.utils.plotting import annotator, -程序员宅基地

文章浏览阅读944次。由于需要用pyqt给yolov8做一个界面,而ultralytics一层嵌一层,不是很好用,所以对它的这个源码进行精简,具体代码我放到了这里,ultralytics使用的版本是8.0.54。具体代码如下,需要根据自己的情况来修改data的配置文件以及权值文件,在代码的49和50行。_from ultralytics.utils.plotting import annotator, colors, save_one_box modul

推荐文章

热门文章

相关标签