JavaSE
Java基础篇
1、解释下什么是面向对象?
面向对像是一种基于面向过程的编程思想,是一种“万物皆是对象”的编程思想。任何物体都可以归为一类事物,而每个个体都是一类事物的实列,以类的方式组织代码,以对象的封装数据。
2、面向对象和面向过程的区别
编程思路不同
面向过程是以实现功能的函数开发为主,而面向对象是要首先抽象出类、属性和方法,然后通过实列化进行开发。
封装性
都有封装性,但是面向过程是封装的是功能,而面向对象封装的是数据和功能
继承性、多态性
面向对象具有继承性和多态性,而面向过程没有
3、面向对象的三大特性,分别解释
封装、继承、多态
封装:是指把数据和操作数据的方法封装起来,对数据的访问只能通过已定义的接口。
继承:子类继承父类的所有功能,并无需重新编译原来的类的情况下对这些功能进行使用和扩展。
多态:多态是建立在继承的基础上的,子类继承了父类的属性和方法后是可以扩展的,所以多个不同的子类就可以拥有各自不同的形态。多态有编译时多态(方法重载)和运行时多态(方法重写)
多态存在的三个必要条件:要有继承,方法重写,父类引用指向子类对象。
4、JDK、JRE、JVM之间的关系
JDK (JAVA Development kit):JAVA开发工具包,是java的核心,包括了java运行环境JRE、Java工具和Java基础类库。
JRE(Java Runtime Environment) :是Java运行环境 包含了JVM实现和java核心类库
JVM(Java Virtual Machine)Java虚拟机,是Java实现跨平台的核心部分。
5、重载和重写的区别
重载是编译时多态,同一类中的有许多同名的方法,而这些同名方法具有不同的参数列表。
重写是运行时多态,子类重写父类的方法。
6、Java中是否能重写private或者static方法
不能。被static修饰的方法是属于类的,而不是属于实列的
被private修饰的方法对子类不可见
7、构造方法有哪些特性
1、名字与类名相同
2、没有返回值,也不能用void声明
3、生成类的对象时自动执行,无需调用。
8、在java中定义一个不做事并且没有参数构造方法有什么作用
创建子类的过程中会优先创建父类对象,创建父类对象会默认调用父类的无参构造,如果没有则编译会失败。
9、Java中创建对象的几种方式
1、new 关键字
2、使用clone()方法
3、反序列化
10、抽象类和接口有什么区别
1、构造函数
抽象类可以定义构造函数,而接口不能定义
2、方法
抽象类可以有抽象方法和具体方法,而接口只能由抽象方法
3、成员权限
抽象类中的成员权限可以是public、default、protected
而接口中的成员只可以是public(方法默认是public abstract 成员变量默认:public static)
4、静态方法
抽象类可以包含静态方法,而接口中不可以包含静态方法
11、静态变量和实列变量的区别
静态变量是指被static修饰的变量,是类变量,属于类,静态变量可以实现让多个对象共享内存。
实列变量:属于某个实列,需要先创建对象,通过对象才能访问。
12、short s1 = 1;s1 = s1 + 1;有什么错?那么 short s1 = 1; s1 += 1;呢?有没有错误?
short s1 = 1;s1 = s1 + 1; s1+1自动提升表达式类型为int,int赋给short类型,会出现类型转换错误。
而 short s1 = 1; s1 += 1;+=隐含强制类型转换 所以不报错
13、Integer 和int的区别
1、int是java八大基本数据类型之一,而Integer是java为int类型提供的封装类。
2、int 型变量默认为0,而Integer默认为null
3、integer变量必须实列化才能使用,而int不需要
延伸:Integer 变量和 int 变量比较时,只要两个变量的值是相等的,则结果为 true
14、装箱和拆箱的区别
自动装箱是java编译器在基本数据类型与对应的包装类之间做的一个转化、比如int 转化为Integer,反之就是自动拆箱
15、switch语句能否作用在byte上,能否作用在long上,能否作用在String上
switch()中的只能是一个整数表达式或者枚举常量,能作用在byte ,能为它能隐式转化int,而long、String类型不符合swith的语法
并且不能被隐式转化为int,注:jdk1.7之后switch可以作用在String上
16、final finally、finalize的区别
final:用于声明属性、方法、类,分别表示属性不可变、方法不可覆盖、被修饰类不可继承
finally:异常处理语句结构的一部分、表示总是执行
finalize:Object类的一个方法,在垃圾回收时会调用被回收对像的finalize
17、== 和equals的区别
==:如果比较的是基本数据类型,则比较的是数值是否相等,如果比较的是引用数据类型,则比较的是他们的地址值是否相等
equals方法:用来比较两个对象的内容是否相等
18、两个对象的hashCode()相同,则equals()也一定为true嘛
不一定。,因为在散列表中,hashCode() 相等即两个键值对的哈希值相等,然而哈希值相等,并不一定能得出键值对相等
19、为什么重写equals()就一定要重写hashCode()方法
哈希code是系统认为的相等,重写以后的equals是程序员认为的相等,两者可能不相等。只重写equals不重写hashCode可能会导致hash表存进相同元素,而这是程序所不希望的
20、& 和&&的区别
&&与&都是表示与的逻辑运算符号,但两边表达式为true,整个运算结果才为true,否则为false。
&&:有短路功能,当第一个表达式的值为false的时候,则不再计算第二个表达式
&不管第一个表达式是否为true,第二个都会执行。
21、Java 中的参数传递时传值呢?还是传引用?
java中是值传递
22、java中的Math.round(-1.5)等于多少
等于-1 向上取整
23、如何实现对象的克隆
(1)实现 Cloneable 接口并重写 Object 类中的 clone() 方法;
(2)实现 Serializable 接口,通过对象的序列化和反序列化实现克隆,可以实现真正的深克隆
24、深克隆和浅克隆的区别
浅克隆:只是复制了对象的引用地址,两个对象指向同一个内存地址,所以修改其中任意的值,另一个值都会随之变化,这就是浅克隆。
深克隆:是将对象及值复制过来,两个对象修改其中任意的值另一个值不会改变,这就是深拷贝
25、什么是Java的序列化,如何实现java序列化
java的序列化就是将对象状态转化为字符流的过程。序列化的实现:就是被序列化的类实现serializable接口,如何使用输出流构造一个输出流对象,使用输出流对象的writeobject()方法
26、什么情况下需要序列化
(1)想把的内存中的对象状态保存到一个文件中或者数据库中时候;
(2)通过 远程方法调用传输对象的时候。
27、List< extends T > 和 List < super T > 之间有什么区别 ?
List< extends T > 可以接收继承t类型的List 而List < super T >可以接收t的父类构成的List
28、Java 中的反射是什么意思?有哪些应用场景?
对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射
应用举例:工厂模式,使用反射机制,根据限定类名获得某个类的 Class 实例。
29、反射的优缺点
优点:
动态加载类,提高代码的灵活度
缺点 性能开销(反射操作的效率要比那些非反射操作低得多)、安全限制(使用反射技术要求程序必须在一个没有安全限制的环境中运行)
30、Java 中的动态代理是什么?有哪些应用?
动态代理:当想要给实现了某个接口的类中的方法,加一些额外的处理。比如说加日志,加事务等。可以给这个类创建一个代理,故名思议就是创建一个新的类,这个类还在原来的基础上添加了额外处理的新功能
应用:Spring的AOP、加事物、加日志
31、static关键字的作用
1、静态变量,这个变量是属于类的,类所有的实列都共享静态变量
2、静态方法:静态方法在类加载的时候就存在了,他不依赖于任何实列
3、静态语句块:静态语句块在类初始化时运行一次
4、静态内部类:静态内部类不能访问外部类的非静态的变量和方法;
32、super关键字的作用
(1)访问父类的构造函数:可以使用 super() 函数访问父类的构造函数
(2)访问父类的方法:如果子类重写了父类的某个方法,可以通过使用 super 关键字来引用父类的方法实现。
32、字节和字符的区别
字节是存储容量的基本单位;
字符是数字、字母、汉字以及其他语言的各种符号;
1 字节 = 8 个二进制单位,一个字符由一个字节或多个字节的二进制单位组成
32、String 为什么要设计为不可变类?
安全问题:String被许多java库当作参数,像url、文件路径path等如果String不是固定不变的 可能会有安全问题
字符串常量池需要:当创建一个String对象时,如果字符串值已经在常量池中,则不会创建一个新的对象,而是引用已经存在的对象
32、String、StringBuilder、StringBuffer 的区别?
String:用于字符串操作,属于不可变类 StringBuilder:用于字符串操作,可变类,线程不安全 StringBuffer:用于字符串操作,可变类,对方法加了同步锁,线程安全 执行效率:StringBuilder > StringBuffer > String
33、String 字符串修改实现的原理?
当用 String 类型来对字符串进行修改时,其实现方法是首先创建一个 StringBuilder,其次调用 StringBuilder 的 append() 方法,最后调用 StringBuilder 的 toString() 方法把结果返回。
34、String str = “i” 与 String str = new String(“i”) 一样吗?
不一样,因为内存的分配方式不一样。String str = “i” 的方式,Java 虚拟机会将其分配到常量池中;而 String str = new String(“i”) 则会被分到堆内存中。
35、String 类的常用方法都有那些?
toLowerCase():将字符串转成小写字母。
substring():截取字符串。
equals():字符串比较。
getBytes():返回字符串的 byte 类型数组。
replace():字符串替换。
36、final 修饰 StringBuffer 后还可以 append 吗?
可以。final 修饰的是一个引用变量,那么这个引用始终只能指向这个对象,但是这个对象内部的属性是可以变化的。
37、Java 中的 IO 流的分类?说出几个你熟悉的实现类?
按功能来分:输入流(input)、输出流(output)。
按类型来分:字节流 和 字符流。
字节流:InputStream/OutputStream
字符流:Reader/Writer
38、字节流和字符流有什么区别?
字节流按 8 位传输,以字节为单位输入输出数据,字符流按 16 位传输,以字符为单位输入输出数据。
39、BIO、NIO、AIO 有什么区别?
BIO:Block IO,同步阻塞式 IO(传统 IO),服务实现模式为一个连接对应一个线程,即客户端发送一个连接,服务端要有一个线程来处理。如果连接多了,线程数量不够,就只能等待,即会发生阻塞。它的特点是模式简单使用方便,并发处理能力低。
NIO:New IO,同步非阻塞 IO(传统 IO 的升级),客户端和服务器端通过 Channel(通道)通讯,实现了多路复用。一个线程可以处理多个连接,即客户端发送的连接都会注册到多路复用器上,然后进行轮询连接,有I/O请求就处理
AIO:Asynchronous IO,异步非阻塞IO(又升级),基于事件和回调机制。引入了异步通道,采用的是proactor模式,特点是:有效的请求才启动线程,先有操作系统完成再通知服务端。
Java并发面试题
1、并行和并发有什么区别?
1、并行是两个及多个事件以上的在同一时刻发生,而并发是两个及多个事件以上的在同一时间段发生
2、并行是不同实体的多个事件,并发是同一实体的多个事件
2、线程和进程的区别?
进程是资源分配的最小单位,线程是CPU调度的最小单位
深刻理解,把进程当作火车,线程当做车厢
1、线程在进程中运行(单独的车厢是无法运行的)
2、一个进程包含多个线程(一个火车可以用多个车厢)
3、同一进程下的不同线程的数据很容易共享(人员流动 a车厢到b车厢)
4、相反,不同进程下的数据很难共享
5、 不同的进程 相互之间不影响(两辆火车各管个的)
6、一个线程挂叼了将导致整个进程挂掉(火车厢失火了 蔓延整个火车)
3、创建线程的几种方式
-
继承 Thread 类创建线程;
-
实现 Runnable 接口创建线程;
-
通过线程池创建线程。
4、线程状态及转换?
新建、可运行、阻塞、等待、定时等待和终止
5、sleep() 和 wait() 的区别?
1、来自不同的类 sleep是来自thread类 而wait是来自object类
2、sleep没有释放锁,不出让系统资源,而wait释放了锁,出让系统资源,其他线程可以占用CPU
3、使用范围不同,wait只能使用在同步控制方法或者块中,而sleep
6、Start()和Run()的区别
start
方法是用来启动一个线程的,而run
方法执行的才是你写的具体的功能
7、说下对悲观锁和乐观锁的理解?
悲观锁:就是假色最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据都会上锁
乐观锁:假设最好的情况,每次去拿数据的时候认为别人不会修改,所以不会上锁
多写用悲观 多读用乐观
标签:Java,String,对象,线程,java,JavaSE,方法 From: https://www.cnblogs.com/madao-super/p/17159020.html