java面试题大汇总,java面试笔试题大汇总

  java面试题大汇总,java面试笔试题大汇总

  

  如何解决写爬虫IP受阻的问题?立即使用。

  面向对象的特征有哪些方面?

  所谓封装,就是把客观事物封装成抽象类,类只能让可信的类或对象操作自己的数据和方法,隐藏不可信的。封装是面向对象的特征之一,是对象和类概念的主要特征。(推荐学习:java常见问题)

  继承意味着子类获得父类的属性和方法。如果狗是一种动物,也可以说它继承了动物的特性,或者说狗是动物的一个子类。

  多态是指一个方法只能有一个名字,但可以有多种形式,即程序中可以定义多个同名的方法,用‘一个接口,多个方法’来描述。它可以被方法的参数和类型引用。

  五个原则:单一责任原则SRP开闭原则OCP替换原则LSP依赖原则DIP接口分离原则ISP

  成员变量和局部变量的区别

  * A:在类中的位置不同

  *成员变量:在类中的方法之外

  *局部变量:在方法定义中或在方法声明上。

  * B:在内存中的位置不同

  *成员变量:在堆内存中(成员变量属于对象,对象进入堆内存)

  *局部变量:栈内内存(局部变量属于方法,方法是栈内内存)

  * C:生命周期不同

  *成员变量:随着对象的创建而存在,随着对象的消失而消失。

  *局部变量:随着方法的调用而存在,随着方法的调用而消失。

  * D:初始化值不同

  *成员变量:具有默认的初始化值。

  *局部变量:没有默认的初始化值,必须定义并赋值后才能使用。

  静态变量和成员变量的区别

  *静态变量也称为类变量,成员变量也称为对象变量。

  * A:所属不同

  *静态变量属于类,所以也叫类变量。

  *成员变量属于对象,所以也叫实例变量(对象变量)。

  * B:内存中位置不同

  *静态变量存储在方法区的静态区。

  *成员变量存储在堆内存中。

  * C:内存出现时间不同

  *静态变量随着类的加载而加载,随着类的消失而消失。

  *成员变量随着对象的创建而存在,随着对象的消失而消失。

  * D:调用不同

  *静态变量可以通过类名或对象调用。

  *成员变量只能由对象名调用。

  this和super的区别和应用

  * A:this和super都代表什么

  * this:表示当前对象的引用。谁打电话给我,我就代表谁。

  * super:代表当前对象的父类的引用

  * B:this和super的使用区别

  * a:调用成员变量

  *这个。成员变量调用这个类的成员变量,或者父类的成员变量。

  *超级。成员变量调用父类的成员变量。

  * b:调用构造函数。

  *这个(.)调用这个类的构造函数。

  *超级(.)调用父类的构造函数。

  * c:调用成员方法

  *这个。成员方法调用这个类的成员方法,或者父类的方法。

  *超级。成员方法调用父类的成员方法。

  排序都有哪几种方法?请列举

  排序方式有:插入排序(直接插入排序、希尔排序)、交换排序(冒泡排序、快速排序)、选择排序(直接选择排序、堆排序)、归并排序、分布排序(盒排序、基数排序)。

  快速排序的伪代码。

  String, StringBuffer StringBuilder的区别。

  字符串的长度是不可变的;

  StringBuffer的长度可变。如果经常对字符串中的内容进行操作,尤其是需要修改内容的时候,那么就使用StringBuffer。如果最终需要一个字符串,那么使用StringBuffer的toString()方法;线程安全;

  StringBuilder从JDK 5开始,在StringBuffer中增加了一个单线程使用的等价类。通常,应该首选StringBuilder类,因为它支持所有相同的操作,但是它更快,因为它不执行同步。

  Overload 和 Override 的区别。Overloaded 的方法是否可以改变返回值的类型?

  回答:方法的覆盖和重载是Java多态性的不同表现。

  重写是父类和子类之间多态性的一种表现,重载是一个类中多态性的一种表现。如果在子类中定义的方法与其父类具有相同的名称和参数,我们说该方法是重写的。

  当一个子类的对象使用这个方法时,它将调用子类中的定义。对它来说,父类中的定义是“屏蔽”的。如果在一个类中定义了多个同名的方法,它们可能会有不同的参数号或不同的参数类型,这就是所谓的方法重载。重载的方法可以改变返回值的类型。

  final, finally的区别?

  A: final:修饰语(关键字);如果一个类被声明为final,就意味着它不能派生新的子类,不能作为父类继承,所以一个类不能同时声明为abstract和final;将变量或方法声明为final可以保证它们在使用中不会被更改;声明为final的变量在声明时必须赋予一个初始值,但在以后的引用中只能读取,不能修改;声明为final的方法只能使用,不能重载。

  Finally: finally块用于在异常处理期间执行任何清除操作;如果抛出异常,将执行匹配的catch子句,然后控制将进入finally块(如果有)。

  常见的几个运行异常。

  Java.lang.nullpointerexception(空指针异常)

  Java . lang . classnotfoundexception(指定的类不存在)

  Java.lang.arithmeticexception(数学运算异常)

  Java . lang . arrayindexoutofboundsexception(数组下标越界异常)

  IOException(输入输出异常)

  数组操作的两个常见问题:越界和空指针

  * A:案例演示

  * a:arrayindexoutofboundsexception:数组索引越界。

  *原因:您访问了一个不存在的索引。

  * b:NullPointerException:空指针是一个异常。

  *原因:数组不再指向堆内存。您还可以使用数组名来访问元素。

  * int[] arr={1,2,3 };

  * arr=null

  * system . out . println(arr[0]);JAVA语言如何进行异常处理,关键字:throws,throw,try,catch,finally分别代表什么意义?在try块中可以抛出异常吗?

  答:Java通过面向对象的方法处理异常,对各种异常进行分类,并提供良好的接口。

  在Java中,每个异常都是一个对象,它是Throwable类或其他子类的实例。当方法中出现异常时,会引发异常对象,该对象包含异常信息。调用该对象的方法可以捕捉异常并处理它。

  Java中的异常处理是通过五个关键词实现的:try、catch、throw、throws和finally。通常,try用于执行程序。如果出现异常,系统将抛出异常。这个时候你可以通过它的类型来捕捉它,或者最后它会被默认的处理器处理。

  使用try指定一个程序来阻止所有“异常”。在try程序之后,应该立即包含一个catch子句来指定要捕获的“异常”的类型。

  Throw语句用于显式抛出“异常”。

  Throws用于表示成员函数可能抛出的各种“异常”。

  最后,执行一段代码,以确保无论一段代码发生什么‘异常’。

  您可以在成员函数调用之外编写一个try语句,并在成员函数内部编写另一个try语句来保护其他代码。每当遇到try语句时,“exception”的帧就被放在堆栈上,直到所有try语句完成。

  如果下一级try语句不处理某种“异常”,堆栈将被扩展,直到有一个try语句处理这种“异常”。

  服务器收到用户提交的表单数据,到底是调用Servlet的doGet()还是doPost()方法?

  答:HTML的form元素有一个method属性,用来指定如何提交表单。它的值可以是get或post。

  我们的定制Servlet通常会覆盖doGet()或doPost()方法中的一个或两个。如果是GET请求,会调用doGet()方法,如果是POST请求,会调用doPost()方法。那为什么呢?

  我们的自定义Servlet通常继承自HttpServlet,后者继承自GenericServlet并重写service()方法,该方法在Servlet接口中定义。

  HttpServlet重写的service()方法会先获取用户请求的方法,然后根据请求的方法调用doGet()、doPost()、doPut()、doDelete()等方法。如果在自定义Servlet中重写这些方法,那么重写后的(自定义)方法显然会被调用,这显然是模板方法模式的一个应用(如果不了解,请参考0755-7995)

  当然,service()方法也可以在自定义Servlet中直接被覆盖,所以不管请求是哪种方式,都可以用自己的代码处理,更适合不区分请求方法的场景。

  抽象类和接口的区别?

  它是接口抽象类的变体,接口中的所有方法都是抽象的。抽象类是声明方法存在而不实现它的类。

  接口可以继承更多,抽象类不行。

  定义接口方法,不能实现,而抽象类可以实现一些方法。

  接口的基本数据类型是静态的,但抽象图像不是。

  内存泄露和内存溢出?

  内存泄漏:是指应用程序在申请内存后无法释放申请的内存空间。内存泄漏一次的危害可以忽略不计,但是如果放任不管,就会导致内存溢出。

  例如,在读取一个文件后,应该及时关闭流并释放数据库连接。

  内存溢出:这意味着当一个应用程序申请内存时,没有最后的内存空间供其使用。

  例如,在项目中,我们导入大量数据,并批量提交。

  什么是线程同步?

  1.线程同步的目的是当多个线程请求一个有问题的资源时,保护资源不被破坏。

  2.线程同步是通过锁来实现的。每个对象只有一个锁,并且这个锁与一个特定的对象相关联。一旦线程获得对象锁,其他访问该对象的线程就不能再访问该对象的其他异步方法。

  3.对于静态同步方法,锁是针对这个类的,锁对象是这个类的类对象。静态和非静态方法的锁互不干扰。一个线程获取锁,当它在一个同步方法中访问另一个对象的同步方法时,它获取这两个对象的锁。

  4.对于同步来说,关键是始终意识到要同步哪个对象。

  5.在编写线程安全类时,需要始终对多个线程竞争访问资源的逻辑和安全性做出正确的判断,分析“原子”操作,确保原子操作过程中其他线程无法访问竞争的资源。

  6.当多个线程等待对象锁时,没有获得锁的线程将被阻塞。

  7.死锁是由线程等待对方锁定造成的,实际中发生的概率很小。如果我让你写一个死锁程序,可能不行,呵呵。但是,一旦程序陷入僵局,程序就会死亡。

  对多线程的理解?

  不同的人在做的同样的事情是多线程。

  在食堂用餐,一个人玩是单线程,开n个窗口n个人同时玩是多线程。

  线程的基本概念,线程的基本状态以及状态之间的关系:

  线程是指在程序执行过程中,能够执行程序代码的执行单元。每个程序至少有一个线程,就是程序本身。Java中的线程有四种状态:运行、就绪、挂起和结束。

  有那些集合?

  列表功能:元素按顺序排列,元素可以重复

  Map特性:存储元素的键值对,没有放置顺序。

  集合特性:没有元素的摆放顺序,元素不能重复(注意:虽然没有元素的摆放顺序,但是元素在集合中的位置是由元素的HashCode决定的,它的位置实际上是固定的)

  List接口有三个实现类:LinkedList、ArrayList和Vector。

  LinkedList:底层基于链表实现,链表内存分散。每个元素存储自己的内存地址以及下一个元素的地址。添加和删除链表很快,但是搜索很慢。

  ArrayList和Vector的区别:ArrayList是非线程安全高效的;Vector是基于线程安全的,效率很低。

  Set接口有两个实现类:HashSet(底层由HashMap实现)和LinkedHashSet。

  SortedSet接口有一个实现类:TreeSet(底层用平衡二叉树实现)

  查询接口有一个实现类:LinkList。

  地图兴趣

  HashMap是非线程安全的,高效的,支持null;HashTable是线程安全的,效率低,不支持null。

  SortedMap有一个实现类:TreeMap。

  其实最重要的是list是用来处理序列的,而set是用来处理集合的。Map存储键值对。

  文件读写的基本类:

  reader类和FileWriter类分别从Reader类和Writer类继承。FileReader类用于读取文件,File Writer类用于将数据写入文件。在使用这两个类之前,需要调用它们的构造函数来创建相应的对象,然后调用相应的read()或write()方法。以上是java常见面试问题的详细内容。更多请关注我们的其他相关文章!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: