1、面向对象的特征有哪些方面?
1.封装:定义与自己相关的属性和方法,隐藏实现的细节,只向外界提供最简单的编程接口。
2.继承:继承是从已有类得到继承信息创建新类的过程。继承可以提高代码的重用性,JAVA中只允许单一继承。
3.多态性:不同子类型的对象对同一消息作出不同的响应。方法重载(overload)实现的是编译时的多态性(也称为静态多态),而方法重写(override)实现的是运行时的多态性(也称为动态多态)。一般多态通过方法重写来实现。
2、访问修饰符public,private,protected,以及不写(默认)时的区别?
修饰符 当前类 同 包 子 类 其他包
public √ √ √ √
protected √ √ √ ×
default √ √ × ×
private √ × × ×
类的成员不写访问修饰时默认为default。默认对于同一个包中的其他类相当于公开(public),对于不是同一个包中的其他类相当于私有(private)。受保护(protected)对子类相当于公开,对不是同一包中的没有父子关系的类相当于私有。Java中,外部类的修饰符只能是public或默认,类的成员(包括内部类)的修饰符可以是以上四种。
3、String 是最基本的数据类型吗?
答:不是。Java中的基本数据类型只有8个:byte、short、int、long、float、double、char、boolean;除了基本类型(primitive type)和枚举类型(enumeration type),剩下的都是引用类型(reference type)。
4、int和Integer有什么区别?
1.int是基本数据类型, Integer是int的包装类,包装类提供了很多操作方法,如各种类型直接转换等
2.int默认值为0,integer的默认值为null
3.integer的取值范围-128到127之间
4.保存方式不同:Integer实际是对象的引用,当new一个Integer时,实际上是生成一个指针指向此对象;而int则是直接存储数据值
5、&和&&的区别?
&运算符有两种用法:(1)按位与;(2)逻辑与。
&&运算符是短路与运算。逻辑与跟短路与的差别是非常巨大的,虽然二者都要求运算符左右两端的布尔值都是true整个表达式的值才是true。&&之所以称为短路运算是因为,如果&&左边的表达式的值是false,右边的表达式会被直接短路掉,不会进行运算。
6、解释内存中的栈(stack)、堆(heap)和静态区(static area)的用法。
基本数据类型的变量,一个对象的引用,还有就是函数调用的现场保存都使用内存中的栈空间;
通过new关键字和构造器创建的对象放在堆空间;
直接书写的100、"hello"和常量都是放在静态区中。
栈空间操作起来最快但是栈很小,通常大量的对象都是放在堆空间,理论上整个内存没有被其他进程使用的空间甚至硬盘上的虚拟内存都可以被当成堆空间来使用。
7.数组有没有length()方法?String有没有length()方法?
数组没有length()方法,有length 的属性。
String 有length()方法。JavaScript中,获得字符串的长度是通过length属性得到的,这一点容易和Java混淆。
8.在Java中,如何跳出当前的多重嵌套循环?
答:用break ;可以跳出多重循环。直接结束所有的循环
continue结束本次循环
9构造方法(constructor)是否可被重写(override)?
答:构造器不能被继承,因此不能被重写,但可以被重载。
10.两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对?
答:不对,如果两个对象x和y满足x.equals(y) == true,它们的哈希码(hash code)应当相同。Java对于eqauls方法和hashCode方法是这样规定的:
(1)如果两个对象相同(equals方法返回true),那么它们的hashCode值一定要相同;
(2)如果两个对象的hashCode相同,它们并不一定相同。
11.String和StringBuilder、StringBuffer的区别?
答String是只读字符串,也就意味着String引用的字符串内容是不能被改变的。StringBuffer/StringBuilder类表示的字符串对象可以直接进行修改。对象是变量StringBuilder是Java 5中引入的,它和StringBuffer的方法完全相同,区别在于它是在单线程环境下使用的,因为它的所有方面都没有被synchronized修饰,因此它的效率也比StringBuffer要高。
12.重载和重写的区别。重载的方法能否根据返回类型进行区分?
答:重载发生在一个类中,同名的方法如果有不同的参数列表(参数类型不同、参数个数不同或者二者都不同)则视为重载;
重写发生在子类与父类之间,重写要求子类被重写方法与父类被重写方法有相同的返回类型,比父类被重写方法更好访问,不能比父类被重写方法声明更多的异常(里氏代换原则)。重载对返回类型没有特殊的要求。
13.char 型变量中能不能存贮一个中文汉字,为什么?
答:char类型可以存储一个中文汉字,因为Java中使用的编码是Unicode(不选择任何特定的编码,直接使用字符在字符集中的编号,这是统一的唯一方法),一个char类型占2个字节(16比特),所以放一个中文是没问题的。
14.抽象类(abstract class)和接口(interface)有什么异同?
答:相同:抽象类和接口都不能够实例化,但可以定义抽象类和接口类型的引用。
不同:
抽象类中可以定义构造器,可以有抽象方法和具体方法,而接口中不能定义构造器而且其中的方法全部都是抽象方法。
抽象类中的成员可以是private、默认、protected、public的,而接口中的成员全都是public的。
抽象类中可以定义成员变量,而接口中定义的成员变量实际上都是常量。
15.Java 中会存在内存泄漏吗,请简单描述。
答:理论上不会,Java有垃圾回收机制(GC)不会存在内存泄露问题();
然而在实际开发中,可能会存在无用但可达的对象,这些对象不能被GC回收,因此也会导致内存泄露的发生。(例如放在一个全局map对象中),然后一直不再使用它,这个对象一直被缓存引用,但却不再被使用。
16.Java 中的final关键字有哪些用法?
答:(1)修饰类:表示该类不能被继承;(2)修饰方法:表示方法不能被重写;(3)修饰变量:表示变量只能一次赋值以后值不能被修改(常量)。
17.Java语言如何进行异常处理,关键字:throws、throw、try、catch、finally分别如何使用?
答:
throws用来声明一个方法可能抛出的各种异常
throw语句用来明确地抛出一个异常;
try-catch-finally try里放可能出现异常的代码,引发了异常使用catch来捕捉,finally里面不论是否引发异常,都会执行里面的代码
18.运行时异常与受检异常有何异同?
答:运行时异常表示虚拟机的通常操作中可能遇到的异常不会引起编译错误。
受检异常会强制抛出异常挥着用try-catch捕捉,不然会编译错误
19.列出一些你常见的运行时异常?
ArithmeticException(算术异常)
ClassCastException (类转换异常)
IllegalArgumentException (非法参数异常)
IndexOutOfBoundsException (下标越界异常)
NullPointerException (空指针异常)
SecurityException (安全异常)
20.Collection和Collections的区别?
Collection是一个接口,它是Set、List等容器的父接口;Collections是个一个工具类,提供了一系列的静态方法来辅助容器操作,这些方法包括对容器的搜索、排序、线程安全化等等
(Collection:以前的文章有具体说明)
https://blog.csdn.net/weixin_43974466/article/details/102707253
21.当一个线程进入一个对象的synchronized方法A之后,其它线程是否可进入此对象的synchronized方法B?
答:不能。其它线程只能访问该对象的非同步方法,同步方法则不能进入。因为非静态方法上的synchronized修饰符要求执行方法时要获得对象的锁,如果已经进入A方法说明对象锁已经被取走,那么试图进入B方法的线程就只能在等锁池(注意不是等待池哦)中等待对象的锁。
22.什么是线程池(thread pool)?
答:在面向对象编程中,创建和销毁对象是很费时间的,因为创建一个对象要获取内存资源或者其它更多资源。线程池顾名思义就是事先创建若干个可执行的线程放入一个池(容器)中,需要的时候从池中获取线程不用自行创建,使用完毕不需要销毁线程而是放回池中,从而减少创建和销毁线程对象的开销。
23.Java中如何实现序列化,有什么意义?
答:实现Serializable接口。序列化就是一种用来处理对象流的机制,就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。序列化是为了解决对象流读写操作时可能引发的问题。
24.阐述JDBC操作数据库的步骤。
1.加载驱动。
2.创建连接。
3.创建sql语句。
4.执行sql语句。
5.处理结果。
6.关闭资源。
25.Statement和PreparedStatement有什么区别?哪个性能更好?
答:与Statement相比,
①PreparedStatement接口代表预编译的语句,它主要的优势在于可以减少SQL的编译错误并增加SQL的安全性(减少SQL注射攻击的可能性);
②PreparedStatement中的SQL语句是可以带参数的,避免了用字符串连接拼接SQL语句的麻烦和不安全;
③当批量处理SQL或频繁执行相同的查询时,PreparedStatement有明显的性能上的优势,由于数据库可以将编译优化后的SQL语句缓存起来,下次执行相同结构的语句时就会很快(不用再次编译和生成执行计划)。
26.什么是DAO模式?
答:DAO(Data Access Object)顾名思义是一个为数据库或其他持久化机制提供了抽象接口的对象,在不暴露底层持久化方案实现细节的前提下提供了各种数据访问操作。DAO模式实际上包含了两个模式,一是Data Accessor(数据访问器),二是Data Object(数据对象),前者要解决如何访问数据的问题,而后者要解决的是如何用对象封装数据。
27.事务的ACID是指什么?
答:
- 原子性(Atomic):事务中各项操作,要么全做要么全不做,任何一项操作的失败都会导致整个事务的失败;
- 一致性(Consistent):当事务执行失败时,所有被该事务影响的数据都应该恢复到事务执行前的状态;
- 隔离性(Isolated):在事务执行过程中对数据的修改,在事务提交之前对其他事务不可见
- 持久性(Durable):事务完成后所做的改动都会被持久化
28.获得一个类的类对象有哪些方式?
答:
方法1:类型.class,例如:String.class
方法2:对象.getClass(),例如:“hello”.getClass()
方法3:Class.forName(),例如:Class.forName(“java.lang.String”)
29.如何通过反射创建对象?
方法1:通过类对象调用newInstance()方法,例如:String.class.newInstance()
方法2:通过类对象的getConstructor()或getDeclaredConstructor()方法获得构造器(Constructor)对象并调用其newInstance()方法创建对象,例如:String.class.getConstructor(String.class).newInstance(“Hello”);
30.如何通过反射获取和设置对象私有字段的值?
答:可以通过类对象的getDeclaredField()方法字段(Field)对象,然后再通过字段对象的setAccessible(true)将其设置为可以访问,接下来就可以通过get/set方法来获取/设置字段的值了。
31.用Java写一个单例类。
饿汉式单例
public class Singleton {
private Singleton(){}
private static Singleton instance = new Singleton();
public static Singleton getInstance(){
return instance;
}
}
懒汉式单例
public class Singleton {
private static Singleton instance = null;
private Singleton() {}
public static synchronized Singleton getInstance(){
if (instance == null) instance = new Singleton();
return instance;
}
}
32.用Java写一个冒泡排序。
for (int i = 1, len = list.length; i < len && swapped; ++i) {
for (int j = 0; j < len - i; ++j) {
if (comp.compare(list[j], list[j + 1]) > 0) {
T temp = list[j];
list[j] = list[j + 1];
list[j + 1] = temp;
swapped = true;
}
33.转发(forward)和重定向(redirect)的区别?
(1).转发是服务器行为,重定向是客户端行为。
(2).forward更加高效,所以在满足需要时尽量使用forward
(3).转发可以通过ServletRequest对象的getRequestDispatcher()方法获得,重定向通过HttpServletResponse对象调用其sendRedirect()方法实现。
(4)…转发(forward)服务器请求资源,地址栏url不变。
重定向(redirect)相当于两次请求,url地址会变化
34.get和post请求的区别?
(1)get将表单中数据按照name=value的形式提交,各个变量之间使用"&“连接;post是将表单中的数据放在HTTP协议的请求头或消息体中,传递到所指向URL;(post更加安全)
(2)get传输的数据要受到URL长度限制(1024字节);而post可以传输大量的数据,上传文件通常要使用post方式;
(3)使用get时参数会显示在地址栏上,如果这些数据不是敏感数据,那么可以使用get;对于敏感数据还是应用使用post;
(4)get使用MIME类型application/x-www-form-urlencoded的URL编码(也叫百分号编码)文本的格式传递参数,保证被传送的参数由遵循规范的文本组成,例如一个空格的编码是”%20"。
35.JSP有哪些内置对象?作用分别是什么?
答:JSP有9个内置对象:
- request:封装客户端的请求,其中包含来自GET或POST请求的参数;
- response:封装服务器对客户端的响应;
- pageContext:通过该对象可以获取其他对象;
- session:封装用户会话的对象;
- application:封装服务器运行环境的对象;
- out:输出服务器响应的输出流对象;
- config:Web应用的配置对象;
- page:JSP页面本身(相当于Java程序中的this);
- exception:封装页面抛出异常的对象。
36.你的项目中使用过哪些JSTL标签?
答:项目中主要使用了JSTL的核心标签库,包括<c:if>、<c:choose>、<c: when>、<c: otherwise>、<c:forEach>等,主要用于构造循环和分支结构以控制显示逻辑。
37.java中==和eqauls()的区别?
是运算符,用于比较两个变量是否相等,对于基本类型而言比较的是变量的值,对于对象类型而言比较的是对象的地址.
equals()是比较两个对象的地址,此时直接比较的的结果一样.对于可能用于集合存储中的对象元素而言,通常需要重写其equals()方法.
38.a=a+b与a+=b有什么区别吗?
+=操作符会进行隐式自动类型转换,此处a+=b隐式的将加操作的结果类型强制转换为持有结果的类型,而a=a+b则不会自动进行类型转换.如
39.Thread类中的start()和run()方法有什么区别?
在start()方法中最终要的是调用了Native方法start0()用来启动新创建的线程线程启动后会自动调用run()方法.如果我们直接调用其run()方法就和我们调用其他方法一样,不会在新的线程中执行.
##怎么检测一个线程是否持有对象锁
Thread类提供了一个Native方法holdsLock(Object obj)方法用于检测是否持有某个对象锁:当且仅当对象obj的锁被某线程持有的时候才会返回true.
40wait()与sleep()的区别
sleep()来自Thread类,和wait()来自Object类.调用sleep()方法的过程中,线程不会释放对象锁。而 调用 wait 方法线程会释放对象锁
sleep()睡眠后不出让系统资源,wait让其他线程可以占用CPU
sleep(milliseconds)需要指定一个睡眠时间,时间一到会自动唤醒.而wait()需要配合notify()或者notifyAll()使用