JAVA面试基础

文章目录

Java面试宝典

Java中的访问修饰符

Java面向对象的基本思想之一是封装细节并且公开接口。Java语言采用访问控制修饰符来控制类及类的方法和变量的访问权限,从而向使用者暴露接口,但隐藏实现细节。访问控制分为四种级别:
(1)public: 用public修饰的类、类属变量及方法,包内及包外的任何类(包括子类和普通类)均可以访问;
(2)protected: 用protected修饰的类、类属变量及方法,包内的任何类及包外那些继承了该类的子类才能访问,protected重点突出继承;
(3)default: 如果一个类、类属变量及方法没有用任何修饰符(即没有用public、protected及private中任何一种修饰),则其访问权限为default(默认访问权限)。默
认访问权限的类、类属变量及方法,包内的任何类(包括继承了此类的子类)都可以访问它,而对于包外的任何类都不能访问它(包括包外继承了此类的子类)。default重点突出包;
(4)private: 用private修饰的类、类属变量及方法,只有本类可以访问,而包内包外的任何类均不能访问它。 

如何理解clone对象?

1 为什么要用clone?
在实际编程过程中,我们常常要遇到这种情况:有一个对象A,在某一时刻A中已经包含了一些有效值,此时可能会需要一个和A完全相同新对象B,并且此后对B 任何改动都不会影响到A中的值,也就是说,A与B是两个独立的对象,但B的初始值是由A对象确定的。在Java语言中,用简单的赋值语句是不能满足这种需求的。要满足这种需求虽然有很多途径,但实现clone()方法是其中最简单,也是最高效的手段。

2 new一个对象的过程和clone一个对象的过程区别
new操作符的本意是分配内存。程序执行到new操作符时,首先去看new操作符后面的类型,因为知道了类型,才能知道要分配多大的内存空间。分配完内存之后,再调用构造函数,填充对象的各个域,这一步叫做对象的初始化,构造方法返回后,一个对象创建完毕,可以把他的引用(地址)发布到外部,在外部就可以使用这个引用操纵这个对象。
clone在第一步是和new相似的,都是分配内存,调用clone方法时,分配的内存和原对象(即调用clone方法的对象)相同,然后再使用原对象中对应的各个域,填充新对象的域,填充完成之后,clone方法返回,一个新的相同的对象被创建,同样可以把这个新对象的引用发布到外部。

3 clone对象的使用
3.1复制对象和复制引用的区别
复制对象复制的是对象本身,复制出来的对象在内存中和原来的对象不是同一个,也是不同的引用地址。
复制引用就是给原来的对象在创建一个引用,原来的引用和复制出来的引用都是指向同一块内容。
3.2 深拷贝和浅拷贝
浅拷贝只是复制了对象的引用地址,两个对象指向同一个内存地址,所以修改其中任意的值,另一个值都会随之变化,这就是浅拷贝(例:assign())
深拷贝是将对象及值复制过来,两个对象修改其中任意的值另一个值不会改变,这就是深拷贝

java有没有goto语句

goto 是Java中的保留字,在目前版本的Java中没有使用。所谓保留字符就是指暂时不使用,但是在以后的版本中可能会成为关键字,比如const。

在java中如何跳出当前多重循环


方法一:可以在需要的循环语句前定义一个标号, 然后在里层循环体的代码中使用带有标号的break语句,即可跳出外层循环方法二:可以在需要的循环条件内加入一个boolean类型的判断,需要的时候将此变量值反转,再break当前循环即可跳出。

是否可以继承String

不能,因为String类是final修饰的,final修饰的类不能被继承,final修饰的方法不能被重写,final修饰的类中的方法默认都是final的,final修饰的量不能被修改

什么是线程安全?如何保证线程安全?

线程安全:就是多线程访问同一代码,不会产生不确定结果。(比如死锁) 
如何保证呢:1使用线程安全的类 
2使用synchronized同步代码块,或者用Lock锁 
3多线程并发情况下,线程共享的变量改为方法局部级变量

什么是同步,什么是异步?

Java中常说的同步有两类:一类是说方法,一类是说请求。
方法调用:
同步方法调用一旦开始,调用者必须等到方法调用返回后,才能继续后续的行为
异步方法调用更像一个消息传递,一旦开始,方法调用就会立即返回,调用者就可以继续后续的操作。而,异步方法通常会在另外一个线程中,“真实”地执行着。整个过程,不会阻碍调用者的工作。
请求:
同步交互:指发送一个请求,需要等待返回,然后才能够发送下一个请求,有个等待过程;
异步交互:指发送一个请求,不需要等待返回,随时可以再发送下一个请求,即不需要等待。

sleep和wait有什么区别?

使用上
从使用角度看,sleep是Thread线程类的方法,而wait是Object顶级类的方法。
sleep可以在任何地方使用,而wait只能在同步方法或者同步块中使用。
CPU及资源锁释放
sleep,wait调用后都会暂停当前线程并让出cpu的执行时间,但不同的是sleep不会释放当前持有的对象的锁资源,到时间后会继续执行,而wait会放弃所有锁并需要notify/notifyAll后重新获取到对象锁资源后才能继续执行。
异常捕获
sleep需要捕获或者抛出异常,而wait/notify/notifyAll不需要。

说说&和&&的区别

&和&&都可以用作逻辑与的运算符,表示逻辑与(and),当运算符两边的表达式的结果都为true时,整个运算结果才为true,否则,只要有一方为false,则结果为false。
&&还具有短路的功能,即如果第一个表达式为false,则不再计算第二个表达式.而&没有.
&还可以用作位运算符,当&操作符两边的表达式不是boolean类型时,&表示按位与操作.

char型变量中能不能存贮一个中文汉字?为什么?

char型变量是用来存储Unicode编码的字符的,unicode编码字符集中包含了汉字,所以,char型变量中当然可以存储汉字啦。不过,如果某个特殊的汉字没有被包含在unicode编码字符集中,那么,这个char型变量中就不能存储这个特殊汉字。补充说明:unicode编码占用两个字节,所以,char类型的变量也是占用两个字节。

什么是值传递,什么是引用传递?

Java中没有值传递和引用传递的概念,都是值传递。
基本类型传递时就是值的拷贝,因为基本数据类型的值就是存储在栈内存中。
引用数据类型传递时,传递的是引用地址的拷贝,因为引用数据类型在栈中只存储引用地址。

为什么java中的方法不能根据返回值类型来区分重载。

因为调用时,编译器无法根据返回值类型判断你要调用哪个函数。
方法重载指的是方法的名称相同,参数列表不同。当参数不同时编译器可以根据参数类型调用对应的方法。而无法根据返回值类型判断调用那个方法。

抽象方法是否可以定义为static的,是否可以定义为native,是否可以定义为synchronized.

都不能,抽象方法是需要子类实现的,而静态方法时不能被子类重写的,而且静态方法可以使用类名直接调用,抽象方法没有方法体,无法调用,所以是矛盾的。 Native修饰的方法是本地方法,需要使用其他语言实现,而抽象方法是没有方法实现的,也是矛盾的。Synchronized和方法的实现细节有关,而抽象方法没有实现,也是矛盾的。

静态变量和实例变量的区别?

语法区别:静态变量需要static关键字修饰,实例变量不需要。
程序运行时的区别:静态变量从属于类,实例变量从属于对象。
实例变量必须创建了实例对象,其中的实例变量才会被分配空间,才能使用这个实例变量;
静态变量即类别量,只要程序加载了类的字节码,静态变量就会被分配空间,即可使用。

break和continue区别

Break用于跳出当前执行的程序体。比如循环,switc。
Continue用户结束本次循环,会继续执行下次循环。

创建线程的方式及实现

继承Thread类创建线程
public class MyThread extends Thread{//继承Thread类
  public void run(){
  //重写run方法
  }
}
实现Runnable接口创建线程
public class MyThread2 implements Runnable {//实现Runnable接口
  public void run(){
  //重写run方法
  }
}
使用Callable和Future创建线程

如果main方法被申明为private怎么样?

会正常编译,但是在运行的时候会提示“main方法不是public的”

java的“一次编写,处处运行”是如何实现的?

Java程序会被编译成字节码文件,而字节码文件试运行在JVM上的,和具体的平台无关,所以编写一次可以处处运行。

什么是java虚拟机

Java虚拟机简称JVM是可以移植到不同的平台上的软件,JVM主要用于运行java字节码文件,也正是因为JVM的存在java语言才能做到跨平台。

你怎么理解变量?

变量是一块命名的内存区域,以便程序进行访问,变量用来存储数据,随着程序的执行,存储的数据也可能跟着改变。

介绍一下GC

GC是java的垃圾回收机制,这也是java和C++的最大区别。
Java的垃圾回收机制,会在不定的时间将垃圾对象进行回收。所谓垃圾对象就是没有被任何引用继续引用的对象。
垃圾回收机程序员无法主动调用,由JVM根据情况在不确定的时刻自动调用。

面向对象的特征:继承、封装和多态

封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。
继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。
多态性(polymorphisn)是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。

final, finally, finalize 的区别

虽然这个单词在Java中都存在,但是并没太多关联:
final:java中的关键字,修饰符。
A).如果一个类被声明为final,就意味着它不能再派生出新的子类,不能作为父类被继承。因此,一个类不能同时被声明为abstract抽象类的和final的类。
B).如果将变量或者方法声明为final,可以保证它们在使用中不被改变.
  1)被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改。 
  2)被声明final的方法只能使用,不能重载。
finally:java的一种异常处理机制。
finally是对Java异常处理模型的最佳补充。finally结构使代码总会执行,而不管无异常发生。使用finally可以维护对象的内部状态,并可以清理非内存资源。特别是在关闭数据库连接这方面,如果程序员把数据库连接的close()方法放到finally中,就会大大降低程序出错的几率。
finalize:Java中的一个方法名。
Java技术使用finalize()方法在垃圾收集器将对象从内存中清除出去前,做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没被引用时对这个对象调用的。它是在Object类中定义的,因此所的类都继承了它。子类覆盖finalize()方法以整理系统资源或者执行其他清理工作。finalize()方法是在垃圾收集器删除对象之前对这个对象调用的。

Exception、Error、运行时异常与一般异常有何异同

1、Exception 和 Error 都是继承了 Throwable 类,在 Java 中只有 Throwable 类型的实例才可以被抛出(throw)或者捕获(catch),它是异常处理机制的基本组成类型。 
2、Exception 是程序正常运行中,可以预料的意外情况,可能并且应该被捕获,进行相应处理。 
3、Error 是指在正常情况下,不大可能出现的情况,绝大部分的 Error 都会导致程序(比如 JVM 自身)处于非正常的、不可恢复状态。既然是非正常情况,所以不便于也不需要捕获,常见的比如 OutOfMemoryError 之类,都是 Error 的子类。 
4、Exception 又分为可检查(checked)异常和不检查(unchecked/运行时异常)异常,可检查异常在源代码里必须显式地进行捕获处理,这是编译期检查的一部分。不检查异常就是所谓的运行时异常,类似 NullPointerException、ArrayIndexOutOfBoundsException 之类,通常是可以编码避免的逻辑错误,具体根据需要来判断是否需要捕获,并不会在编译期强制要求。

请写出5种常见到的runtime exception

RuntimeException、NullPointerException、ClassCastException、SecurityException、ClassNotFoundException、ArrayIndexOfBoundsExpetion

int 和 Integer 有什么区别,Integer的值缓存范围

1、Integer是int的包装类,int则是java的一种基本数据类型 
2、Integer变量必须实例化后才能使用,而int变量不需要 
3、Integer实际是对象的引用,当new一个Integer时,实际上是生成一个指针指向此对象;而int则是直接存储数据值 
4、Integer的默认值是null,int的默认值是0

Integer的值缓存范围是-128~127

包装类,装箱和拆箱

基本类型是直接用来存储值的,放在栈中方便快速使用,包装类型是类,其实例是对象,放在堆中
基本类型不是对象,因此没有方法,包装类型是类,因此有方法
基本类型直接赋值即可,包装类型需要使用new关键字创建
包装类型初始值为null,基本类型初始值不为null,是根据类型而定的

String、StringBuilder、StringBuffer区别

1、可变与不可变
String类中使用字符数组保存字符串,如下就是,因为有“final”修饰符,所以可以知道string对象是不可变的。
StringBuilder与StringBuffer都继承自AbstractStringBuilder类,在AbstractStringBuilder中也是使用字符数组保存字符串,如下就是,可知这两种对象都是可变的。
2、是否多线程安全
String中的对象是不可变的,也就可以理解为常量,显然线程安全。
StringBuffer对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的
StringBuilder并没有对方法进行加同步锁,所以是非线程安全的。
3、StringBuilder与StringBuffer共同点
StringBuilder与StringBuffer有公共父类AbstractStringBuilder(抽象类)。
StringBuilder、StringBuffer的方法都会调用AbstractStringBuilder中的公共方法,如super.append(...)。只是StringBuffer会在方法上加synchronized关键字,进行同步。

重载和重写的区别

方法重载是指同一个类中的多个方法具有相同的名字,但这些方法具有不同的参数列表,即参数的数量或参数类型不能完全相同
方法重写是存在子父类之间的,子类定义的方法与父类中的方法具有相同的方法名字,相同的参数表和相同的返回类型 
      注: 
        (1)子类中不能重写父类中的final方法 
        (2)子类中必须重写父类中的abstract方法

抽象类和接口有什么区别

•	1、抽象类和接口都不能直接实例化,如果要实例化,抽象类变量必须指向实现所有抽象方法的子类对象,接口变量必须指向实现所有接口方法的类对象。
•	2、抽象类要被子类继承,接口要被类实现。
•	3、接口只能做方法申明,抽象类中可以做方法申明,也可以做方法实现
•	4、接口里定义的变量只能是公共的静态的常量,抽象类中的变量是普通变量。
•	5、抽象类里的抽象方法必须全部被子类所实现,如果子类不能全部实现父类抽象方法,那么该子类只能是抽象类。同样,一个实现接口的时候,如不能全部实现接口方法,那么该类也只能为抽象类。
•	6、抽象方法只能申明,不能实现,接口是设计的结果 ,抽象类是重构的结果
•	7、抽象类里可以没有抽象方法
•	8、如果一个类里有抽象方法,那么这个类只能是抽象类
•	9、抽象方法要被实现,所以不能是静态的,也不能是私有的。
•	10、接口可继承接口,并可多继承接口,但类只能单根继承

说说反射的用途及实现

一、Java反射框架主要提供以下功能:1.在运行时判断任意一个对象所属的类;2.在运行时构造任意一个类的对象;3.在运行时判断任意一个类所具有的成员变量和方法(通过反射甚至可以调用private方法);4.在运行时调用任意一个对象的方法二、主要用途 :1、反射最重要的用途就是开发各种通用框架。三、基本反射功能的实现(反射相关的类一般都在java.lang.relfect包里):1、获得Class对象 使用Class类的forName静态方法,直接获取某一个对象的class, 调用某个对象的getClass()方法2、判断是否为某个类的实例 用instanceof关键字来判断是否为某个类的实例3、创建实例 使用Class对象的newInstance()方法来创建Class对象对应类的实例。 先通过Class对象获取指定的Constructor对象,再调用Constructor对象的newInstance()方法来创建实例。4、获取方法 getDeclaredMethods()5、获取构造器信息 getDeclaredMethods() getMethods() getMethod()6、获取类的成员变量(字段)信息 getFiled: 访问公有的成员变量 getDeclaredField:所有已声明的成员变量。但不能得到其父类的成员变量 getFileds和getDeclaredFields用法7、调用方法 invoke()8、利用反射创建数组 Array.newInstance()

说说自定义注解的场景及实现

跟踪代码的依赖性,实现代替配置文件的功能。比较常见的是Spring等框架中的基于注解配置。还可以生成文档常见的@See@param@return等。如@override放在方法签名,如果这个方法 并不是覆盖了超类方法,则编译时就能检查出。使用@interface自定义注解时,自动继承了java.lang.annotation.Annotation接口,由编译程序自动完成其他细节,在定义注解时,不能继承其他注解或接口。

HTTP请求的GET与POST方式的区别

1.get是从服务器上获取数据,post是向服务器传送数据。2.get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到。post是通过HTTPpost机制,将表单内各个字段与其内容放置在HTML HEADER内一起传送到ACTION属性所指的URL地址。用户看不到这个过程。3.对于get方式,服务器端用Request.QueryString获取变量的值,对于post方式,服务器端用Request.Form获取提交的数据。4.get传送的数据量较小,不能大于2KB。post传送的数据量较大,一般被默认为不受限制。但理论上,IIS4中最大量为80KB,IIS5中为100KB。(这里有看到其他文章介绍get和post的传送数据大小跟各个浏览器、操作系统以及服务器的限制有关)5.get安全性非常低,post安全性较高。

Session与Cookie区别

具体来说cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案。 同时我们也看到,由于才服务器端保持状态的方案在客户端也需要保存一个标识,所以session机制可能需要借助于cookie机制来达到保存标识的目的,但实际上还有其他选择

列出自己常用的JDK包

java.lang:包含一些Java语言的核心类,如String、Math、Integer、System和Thread,提供常用功能。java.awt:包含了构成抽象窗口工具集(abstract window toolkits)的多个类,这些类被用来构建和管理应用程序的图形用户界面(GUI)。java.applet:包含applet运行所需的一些类。java.net:包含执行与网络相关的操作的类。java.io:包含能提供多种输入/输出功能的类。java.util:包含一些实用工具类,如定义系统特性、使用与日期日历相关的函数。

MVC设计思想

MVC是model、view、controller的简称。它是一中软件的设计思想,将应用的一个输入、处理、输出按照模型层,视图层,控制层进行分层设计。 1)模型: 业务逻辑包含了业务数据的加工与处理以及相应的基础服务(为了保证业务逻辑能够正常进行的事务、安全、权限、日志等等的功能模块) 2)视图:展现模型处理的结果;另外,还要提供相应的操作界面,方便用户使用。 3)控制器:视图发请求给控制器,由控制器来选择相应的模型来处理;模型返回的结果给控制器,由控制器选择合适的视图。 主要作用是视图和业务分离。

equals与==的区别

== 使用来比较两个数据是否一致的,基本数据类型比较的就是数值。引用数据类型比较的是两个对象的地址。 Equals是Object类中定义的方法,也是比较当前对象和传入的参数对象的。默认情况下也是使用做比较的,所以默认情况下和是一样的效果。一般都会重写equals,重写之后就按照重写的程序执行。 String的equals就是重写的,比较的就是两个字符串的字符序列。

什么是Java序列化和反序列化,如何实现Java序列化?或者请解释Serializable 接口的作用

为了便于存储或者传输,将一个对象转换为另一种形式的过程就是序列换,反之就是反序列化。类似于商家将商品打包(序列化),方便快递送货,到货后买家将商品拆包(反序列化)。 Java中通过ObjectOuputStrean将对象序列化,要求对象类必须实现java.io.Serialization接口。通过ObjectInputStream将对象反序列化。

Object类中常见的方法,为什么wait notify会放在Object里边?

wait()暂停的是持有锁的对象,所以想调用wait()必须为:对象.wait();notify()唤醒的是等待锁的对象,调用:对象.notify();****wait(),notify(),notifyAll()都必须使用在同步中,因为要对持有监视器(锁)的线程操作。所以要使用在同步中,因为只有同步 才具有锁。****简单说:因为synchronized中的这把锁可以是任意对象,所以任意对象都可以调用wait()和notify();所以wait和notify属于Object。专业说:因为这些方法在操作同步线程时,都必须要标识它们操作线程的锁,只有同一个锁上的被等待线程,可以被同一个锁上的notify唤醒,不可以对不同锁中的线程进行唤醒。

JDK和JRE的区别

JRE顾名思义是java运行时环境,包含了java虚拟机,java基础类库。是使用java语言编写的程序运行所需要的软件环境,是提供给想运行java程序的用户使用的。 JDK顾名思义是java开发工具包,是程序员使用java语言编写java程序所需的开发工具包,是提供给程序员使用的。JDK包含了JRE,同时还包含了编译java源码的编译器javac,还包含了很多java程序调试和分析的工具:jconsole,jvisualvm等工具软件,还包含了java程序编写所需的文档和demo例子程序。

List 和 Set 区别

List和Set都是Conllection接口的子接口。List中的元素是有顺序的,可以重复的。Set中的额元素是没有顺序的,不可以重复的。

Set和hashCode以及equals方法的联系

Set是通过hashCode和equals比较元素是否重复的。先使用hashcode方法判断已经存在HashSet中元素的hashcode值和将要加入元素hashcode值是否相同。如果不同,直接添加;如果相同,再调用equals方法判断,如果返回true表示HashSet中已经添加该对象了,不需要再次添加(重复),如果返回false就表示不重复,可以直接加入HashSet中

List 和 Map 区别

List:是存储单列数据的集合,存储的数据是有序并且是可以重复的 Map:存储双列数据的集合,通过键值对存储数据,存储 的数据是无序的,Key值不能重复,value值可以重复

Arraylist 与 LinkedList 区别

1 ArrayList底层使用数组实现。LinkedList底层使用链表实现。2 对于随机方法 get和set ArrayList的优于LinkedList,因为LinkedList查询时需要指针移动。3 对应增删改操作 LinkedList优于ArrayList,因为ArrayList需要创建新数组拷贝数据,元素数量越多效率差距越大。

ArrayList 与 Vector 区别

1 ArrayList和Vector都是list的实现类。2 ArrayList和Vector底层都是数组实现的。区别1 ArrayList的所有方法都不是线程安全的,Vector的所有方法都是线程安全的。2 ArrayList和Vector的空间增长方式不同,ArrayList按照1.5被扩容,Vector当扩容容量大于0时,新数组的长度为原数组的长度+扩容容量。否则新数组的长度为原数组的两倍。

HashMap 和 Hashtable 的区别

核心区别:1 HashMap的方法不是同步的,Hashtable的方法是同步的。2 HashMap允许value为null,允许有一个key为null。Hashtable不允许出现为null的key和value。次要区别:1 HashMap和Hashtable继承的父类不同。2 两个Api也略有不同,3 Hashtable默认的初始大小为11,之后每次扩充,容量变为原来的2n+1。HashMap默认的初始化大小为16。之后每次扩充,容量变为原来的2倍

HashSet 和 HashMap 区别

1 HashMap实现的是Map接口。HashSet实现的是Set接口。2 HahsMap是以键值对的形式存储数据,HashSet只是存储对象。3 HashMap使用键值对来计算HashCode,HashSet使用对象来计算HashCode

HashMap 和 ConcurrentHashMap 的区别

1 HashMap不是线程安全的,ConcurrentHashMap是线程安全的。2 ConcurrentHashMap对整个桶数组进行了分段,而HashMap则没有

HashMap 的工作原理及代码实现

原理:HashMap是基于hashing的原理,我们使用put(key, value)存储对象到HashMap中,使用get(key)从HashMap中获取对象。当我们给put()方法传递键和值时,我们先对键调用hashCode()方法,返回的hashCode用于找到bucket位置来储存Entry对象。

线程和进程的概念、并行和并发的概念

进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元。线程是程序中一个单一的顺序控制流程。并行:多个线程可以同时执行,每一个时间段,可以有多个线程同时执行。并发:多个线程同时竞争一个位置,竞争到的才可以执行,每一个时间段只有一个线程在执行。

String s=”hello”,s=s+” geek”;这两行代码执行之后,原始的String对象内容有没改变?

没有。因为 String 被设计成不可变(immutable)类,所以它的所有对象都是不可变对象。在这段代码中,s 原先指向一个 String 对象,内容是 “Hello”,然后我们对 s 进行了“+”操作,那么 s 所指向的那个对象是不会改变的。这时,s 不指向原来那个对象了,而指向了另一个 String 对象,内容为"Hello world!",原来那个对象还存在于内存之中,只是 s 这个引用变量不再指向它了。

java中实现多态的机制是什么?

靠的是父类或者接口定义的引用变量可以指向子类或者具体实现类的实例对象,而程序调用的方法在运行期才动态绑定,就是引用变量所指向的具体的实例对象的方法,也就是内存里正在运行的那个对象的方法,而不是引用变量的类型中定义的方法。

简单描述java中的异常处理机制

异常分为check异常和uncheck异常。Java提供的异常处理方式有两种,一是使用try…catch处理异常,另一个是使用throws申明异常。 Check异常是强制处理的。而uncheck异常是可以不处理的。

throw和throws区别?

Throw是手动抛出一个异常。Throws是在方法申明中申明该方法可能抛出的异常。也是一种异常处理机制。

说出java中的基本数据类型.

Byte,short,char,int,long,float,double,boolean

switch是否能作用在byte上,是否能作用在long上,是否能作用在String上?

Java5以前,switch(expr) 中的表达式只能是byte,short,char,int。从java5开始可以是枚举,从java7开始可以是String。

数组有没有length()方法,String有没有length()方法

Java中数组没有length()方法,只有length()属性。 String有length()方法。 JavaScript中数组和字符串获取长度都是用length属性。

java中有几种流?

按照流的方向可以分为:输入流和输出流。按照流处理数据的单位可以分为:字节流和字符流。

字节流如何转换为字符流

字节输入流可以通过InputStreamReader流转换,InputStreamReader流的构造方法的输入参数就是InputStream。字节输出流可以通过OuputStringWriter流转换,OutputStreamWroiter流的构造方法的输入参数就是OutputStream。

什么是序列化,java中如何实现序列化?

为了便于存储或者传输,将一个对象转换为另一种形式的过程就是序列换,反之就是反序列化。类似于商家将商品打包(序列化),方便快递送货,到货后买家将商品拆包(反序列化)。 Java中通过ObjectOuputStrean将对象序列化,要求对象类必须实现java.io.Serialization接口。通过ObjectInputStream将对象反序列化。

字节流和字符流的区别?

节流在操作时本身不会用到缓冲区(内存),是文件本身直接操作的,而字符流在操作时使用了缓冲区,通过缓冲区再操作文件。字符流处理的单元为2个字节的Unicode字符,分别操作字符、字符数组或字符串,而字节流处理单元为1个字节,操作字节和字节数组。 字节流可用于任何类型的对象,包括二进制对象,而字符流只能处理字符或者字符串;

如何实现对象克隆

有两种方法:1 实现Cloneable接口,并且重写Object中的clone方法,通过colone方法克隆2 实现Serializable接口,通过对象流将对象进行序列化和反序列化,实现对象的克隆。

说说线程的几个状态

1、新建状态(New)新创建了一个线程对象。2、就绪状态(Runnable)线程对象创建后,其他线程调用了该对象的start()方法。该状态的线程位于“可运行线程池”中,变得可运行,只等待获取CPU的使用权**。**即在就绪状态的进程除CPU之外,其它的运行所需资源都已全部获得。3、运行状态(Running):就绪状态的线程获取了CPU,执行程序代码。4、阻塞状态(Blocked):阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行。直到线程进入就绪状态,才有机会转到运行状态。5、死亡状态(Dead):线程执行完了或者因异常退出了run()方法,该线程结束生命周期。

什么情况下会死锁,遇到死锁应该如何解决?

死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。死锁产生的四个必要条件 1、互斥使用,即当资源被一个线程使用(占有)时,别的线程不能使用 2、不可抢占,资源请求者不能强制从资源占有者手中夺取资源,资源只能由资源占有者主动释放。 3、请求和保持,即当资源请求者在请求其他的资源的同时保持对原有资源的占有。 4、循环等待,即存在一个等待队列:P1占有P2的资源,P2占有P3的资源,P3占有P1的资源。这样就形成了一个等待环路。 ⑶ 如何预防死锁? 答:根据产生死锁的四个必要条件,只要使其中之一不能成立,死锁就不会出现。为此,可以采取下列三种预防措施: 1、采用资源静态分配策略,破坏"部分分配"条件; 2、允许进程剥夺使用其他进程占有的资源,从而破坏"不可剥夺"条件; 3、采用资源有序分配法,破坏"环路"条件。 ⑷ 如何避免死锁? 答:死锁的避免不严格地限制死锁的必要条件的存在,而是系统在系统运行过程中小心地避免死锁的最终发生。最著名的死锁避免算 法是银行家算法。死锁避免算法需要很大的系统开销。 ⑸ 如何检测死锁? 答:解决死锁的另一条途径是死锁检测方法,这种方法对资源的分配不加限制,即允许死锁的发生。但系统定时地运行一个"死锁检 测"程序,判断系统是否已发生死锁,若检测到死锁发生则设法加以解除。 ⑹ 如何解除死锁? 答:常常采用下面两种方法: 1、资源剥夺法;2、撤消进程法

java中线程通信如何实现?

1 共享变量 多个线程共同持有相同的对象或者变量的引用,通过修改引用对象或者变量的状态或者属性来通知其他线程的信息。2 wait/notify机制 多个线程同时持有相同的对象。通过该对象的wait和notify方法相互通知信息。

启动一个线程是使用start方法还是run方法?

启动一个线程是调用start()方法,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由JVM调度并执行。这并不意味着线程就会立即运行。run()方法可以产生必须退出的标志来停止一个线程。Run方法是线程启动后的回调方法。

静态内部类和非静态内部类有什么区别?

内部类是申明在一个类的内部的类当内部类使用static修饰时,就是静态内部类,静态内部类在外部类没有实例化的情况下就可以实例化,而非静态内部类必须是外部类实例化之后才能实例化。

简述原生的JDBC操作数据的流程

第一步:加载驱动类。 通过Class.forname();第二步:通过DriverManger.getConnection获取数据库链接第三步:通过connection获取statement/preparedStatement对象第四步:执行sql语句。增删改使用update。查询使用query第五步: 如果是增删改则没有第五步。如果是查询,则需要处理上一步query返回的resultSet。第六步:关闭结果集,关闭回话,关闭链接。

statement和PreparedStatement区别

1、 preparedStatment是Statement的子类。2、 preparedStatment可以预编译sql语句。执行速度要高于statement。3、 preparedStatment可以通过占位符传入参数,可以有效的防止sql注入。4、 任何时候都不要使用statement的。

什么是数据库连接池?

数据库连接池就是预先创建一部分可用的链接存入集合(池)中。当需要使用时可以直接从池中获取链接,用完之后再还回池中。 这样可以提高数据库的访问速度。连接池可以根据需求自动增长链接数量,但是一定有上限,当达到上限是,再有需求就只能等待。可以自动减少链接数量。

HTTP的长链接和短链接

HTTP1.1规定了默认保持长连接(HTTP persistent connection ,也有翻译为持久连接),数据传输完成了保持TCP连接不断开(不发RST包、不四次握手),等待在同域名下继续用这个通道传输数据;相反的就是短连接。

HTTP有那些常见的状态码?

1XX系列:指定客户端应相应的某些动作,代表请求已被接受,需要继续处理。由于 HTTP/1.0 协议中没有定义任何 1xx 状态码,所以除非在某些试验条件下,服务器禁止向此类客户端发送 1xx 响应。  2XX系列:代表请求已成功被服务器接收、理解、并接受。  200状态码:表示请求已成功,请求所希望的响应头或数据体将随此响应返回   201状态码:表示请求成功并且服务器创建了新的资源,且其 URI 已经随Location 头信息返回。假如需要的资源无法及时建立的话,应当返回 ‘202 Accepted’  202状态码:服务器已接受请求,但尚未处理3XX系列:代表需要客户端采取进一步的操作才能完成请求,这些状态码用来重定向,后续的请求地址(重定向目标)在本次响应的 Location 域中指明。 301状态码:被请求的资源已永久移动到新位置。服务器返回此响应(对 GET 或 HEAD 请求的响应)时,会自动将请求者转到新位置。  302状态码:请求的资源临时从不同的URI响应请求,但请求者应继续使用原有位置来进行以后的请求 304自从上次请求后,请求的网页未修改过。服务器返回此响应时,不会返回网页内容。 如果网页自请求者上次请求后再也没有更改过,您应将服务器配置为返回此响应(称为 If-Modified-Since HTTP 标头)。  4XX系列:表示请求错误。代表了客户端看起来可能发生了错误,妨碍了服务器的处理。常见有:401、404状态码。   401状态码:请求要求身份验证。 对于需要登录的网页,服务器可能返回此响应。   403状态码:服务器已经理解请求,但是拒绝执行它。与401响应不同的是,身份验证并不能提供任何帮助,而且这个请求也不应该被重复提交。404状态码:请求失败,请求所希望得到的资源未被在服务器上发现。没有信息能够告诉用户这个状况到底是暂时的还是永久的。假如服务器知道情况的话,应当使用410状态码来告知旧资源因为某些内部的配置机制问题,已经永久的不可用,而且没有任何可以跳转的地址。404这个状态码被广泛应用于当服务器不想揭示到底为何请求被拒绝或者没有其他适合的响应可用的情况下。5xx系列:代表了服务器在处理请求的过程中有错误或者异常状态发生,也有可能是服务器意识到以当前的软硬件资源无法完成对请求的处理。常见有500、503状态码。   500状态码:服务器遇到了一个未曾预料的状况,导致了它无法完成对请求的处理。一般来说,这个问题都会在服务器的程序码出错时出现。   503状态码:由于临时的服务器维护或者过载,服务器当前无法处理请求。通常,这个是暂时状态,一段时间会恢复

HTTP中的重定向和转发有什么区别?

一、目标不同转发是服务器行为,重定向是客户端行为 。二、请求次数不同1、重定向是两次request 。第一次,客户端request一个网址,服务器响应,并response回来,告诉浏览器,你应该去别一个网址。2、请求转发只有一次请求三、网址定位不同重定向的网址可以是任何网址,请求转发只能是指定网址。四、导致的结果不同不做重定向,则用户收藏夹或搜索引擎数据库中旧地址只能让访问客户得到一个404页面错误信息,访问流量白白丧失;再者某些注册了多个域名的网站,也需要通过重定向让访问这些域名的用户自动跳转到主站点等。

JSP和servlet有什么关系?

Servlet是一个特殊的Java程序,它运行于服务器的JVM中,能够依靠服务器的支持向浏览器提供显示内容。 JSP本质上是Servlet的一种简易形式, JSP会被服务器处理成一个类似于Servlet的Java程序,可以简化页面内容的生成。Servlet和JSP最主要的不同点在于,Servlet 的应用逻辑是在Java 文件中,并且完全从表示层中的HTML分离开来。而JSP的情况是Java和HTML可以组合成一个扩展名为.jsp 的文件(有人说,Servlet就是在Java中写HTML,而JSP就是在HTML中写Java代码,当然,这个说法还是很片面的)。JSP侧重于视图,Servlet更侧重于控制逻辑,在MVC架构模式中,JSP适合充当视图(view)而Servlet适合充当控制器(controller)。

JSP有那些域对象?

四大域对象:(1)pageContext page 域-指当前页面,在当前 jsp 页面有效,跳到其它页面失效(2)request request 域-指一次请求范围内有效,从 http 请求到服务器处理结束,返回响应的整个过程。在这个过程中使用 forward(请求转发)方式跳转多个 jsp,在这些页面里你都可以使用这个变量(3)session session 域-指当前会话有效范围,浏览器从打开到关闭过程中,转发、重定向均可以使用(4)application context 域-指只能在同一个 web 中使用,服务器未关闭或者重启,数据就有效

数据库中 delete和truncate有什么区别?

1.truncate 是DDL(数据定义)语句,相当于重新定义一张新表,把原先的表丢弃了,所以执行速度快。delete 是DML语句,逐条删除数据,所以执行速度较慢。 2.truncate不写服务器log,delete写服务器log,也是truncate效率比delete高的原因。 3.truncate不激活trigger(触发器),但是会重置Identity(标识列、自增字段),相当于自增列会被置为初始值,又重新从1开始记录,而不是接着原来的ID数。delete删除以后,Identity依旧是接着被删除的最近的那一条记录ID加1后进行记录。 4.如果只需删除表中的部分记录,只能使用delete语句并用where条件过滤。

Oracle中的分页查询和mysql中的分页查询有什么区别?

(1)MySql的Limit m,n语句Limit后的两个参数中,参数m是起始下标,它从0开始;参数n是返回的记录数。我们需要分页的话指定这两个值即可(2)Oracle数据库的rownum在Oracle数据库中,分页方式没有MySql这样简单,它需要依靠rownum来实现.**** ****Rownum表示一条记录的行号,值得注意的是它在获取每一行后才赋予.因此,想指定rownum的区间来取得分页数据在一层查询语句中是无法做到的,要分页还要进行一次查询.就是使用rownum和子查询配合完成分页查询。

数据库的索引有什么优点和缺点?

一、数据库中创建索引的优点1、创建唯一性索引,保证数据库表中每一行数据的唯一性。2、加快数据的检索速度,这也是创建索引的最主要的原因。3、减少磁盘IO(向字典一样可以直接定位)。4、通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。 5、加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。二、数据库中创建索引的缺点1、创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。2、索引需要占用物理空间,特别是聚集索引,需要较大的空间。3、当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度

唯一约束和主键有什么异同?

相同点1 主键和唯一索引都保重了数据不重复。不同点1 每张表只能有一个主键,而唯一所以可以有多个。2 唯一所以可以有一个记录为null,而主键不行。3 主键可以作为其他表的外键,而唯一索引不行。

视图有什么好处?

1 视图能简化用户操作2视图使用户能以多种角度看待同一数据3视图对重构数据库提供了一定程序的逻辑独立性4视图能够对机密数据提供安全保护5适当的利用视图可以更清晰的表达查询

数据库三大范式是什么?

所谓第一范式(1NF)是指在关系模型中,对于添加的一个规范要求,所有的域都应该是原子性的,即数据库表的每一列都是不可分割的原子数据项,而不能是集合,数组,记录等非原子数据项。第二范式(2NF)要求数据库表中的每个实例或记录必须可以被唯一地区分。选取一个能区分每个实体的属性或属性组,作为实体的唯一标识。第三范式(3NF)要求一个关系中不包含已在其它关系已包含的非主关键字信息。

union和union all有什么不同?

union和union all的区别是,union会自动压缩多个结果集合中的重复结果,而union all则将所有的结果全部显示出来,不管是不是重复。

JDBC中的PreparedStatement相比Statement的好处

(1)PreparedStatement可以写动态参数化的查询用PreparedStatement你可以写带参数的sql查询语句,通过使用相同的sql语句和不同的参数值来做查询比创建一个不同的查询语句要好(2)PreparedStatement比 Statement 更快使用 PreparedStatement 最重要的一点好处是它拥有更佳的性能优势,SQL语句会预编译在数据库系统中。执行计划同样会被缓存起来,它允许数据库做参数化查询。使用预处理语句比普通的查询更快,因为它做的工作更少(3)PreparedStatement可以防止SQL注入式攻击

Class.forName的作用?为什么要用?

作用:按参数中指定的字符串形式的类名去搜索并加载相应的类,如果该类字节码已经被加载过,则返回代表该字节码的Class实例对象,否则,按类加载器的委托机制去搜索和加载该类,如果所有的类加载器都无法加载到该类,则抛出ClassNotFoundException。加载完这个Class字节码后,接着就可以使用Class字节码的newInstance方法去创建该类的实例对象了。为什么用:有时候,我们程序中所有使用的具体类名在设计时(即开发时)无法确定,只有程序运行时才能确定,这时候就需要使用Class.forName去动态加载该类,这个类名通常是在配置文件中配置的,例如,spring的ioc中每次依赖注入的具体类就是这样配置的,jdbc的驱动类名通常也是通过配置文件来配置的,以便在产品交付使用后不用修改源程序就可以更换驱动类名。

大数据量下的分页解决方法

最好的办法是利用sql语句进行分页,这样每次查询出的结果集中就只包含某页的数据内容。再sql语句无法实现分页的情况下,可以考虑对大的结果集通过游标定位方式来获取某页的数据。

说出数据连接池的工作机制是什么

J2EE服务器启动时会建立一定数量的池连接,并一直维持不少于此数目的池连接。客户端程序需要连接时,池驱动程序会返回一个未使用的池连接并将其表记为忙。如果当前没有空闲连接,池驱动程序就新建一定数量的连接,新建连接的数量有配置参数决定。当使用的池连接调用完成后,池驱动程序将此连接表记为空闲,其他调用就可以使用这个连接。 实现方式,返回的Connection是原始Connection的代理,代理Connection的close方法不是真正关连接,而是把它代理的Connection对象还回到连接池中。

为什么要用 ORM? 和 JDBC 有何不一样?

orm是一种思想,就是把object转变成数据库中的记录,或者把数据库中的记录转变成object,我们可以用jdbc来实现这种思想,其实,如果我们的项目是严格按照oop方式编写的话,我们的jdbc程序不管是有意还是无意,就已经在实现orm的工作了。 现在有许多orm工具,它们底层调用jdbc来实现了orm工作,我们直接使用这些工具,就省去了直接使用jdbc的繁琐细节,提高了开发效率。 例如mybatis。

说说什么是事务和事务的四大特性

事务指访问并可能更新数据库中各种数据项的一个程序执行单元,简单的说就是将多个修改数据库中数据的操作作为一个整体。要么一起成功,要么一起失败。 事务四大特性 :原子性,要么执行,要么不执行 隔离性,所有操作全部执行完以前,其它会话不能看到过程 一致性,事务前后,数据总额一致 持久性,一旦事务提交,对数据的改变就是永久的

Tomcat的优化经验

(1) 去掉对web.xml的监视,把jsp提前编辑成Servlet(2) 有富余物理内存的情况,加大tomcat使用的jvm的内存(3) 调整tomcat的并发处理线程数量。

什么是servlet

Servlet是运行在服务器(servlet容器)端的java小程序。servlet有良好的生存期的定义,包括加载和实例化、初始化、处理请求以及服务结束。这个生存期由javax.servlet.Servlet接口的init,service和destroy方法表达。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

师兄阿_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值