前言概念-----------------------------------------------------------------------------------
1、什么是java??
跨平台、面向对象的程序设计语言 具有编译型 / 解释型/面向对象/强类型语言。
(强类型语言是一种总是强制类型定义的语言,要求变量的使用要严格符合定义,所有变量都必须先定义后使用
编译型语言的首先将源代码编译生成机器语言,再由机器运行机器码(二进制)。
相对于编译型语言存在的,源代码不是直接翻译成机器语言,而是先翻译成中间代码,再由解释器对中间代码进行解释运行。)
2、Java特点??
易操作、安全、跨平台、面向对象、支持多线程
- 「跨平台:(JVM)通过Java虚拟机可以将Java程序在不同的操作系统上运行(Windows、Linux等),实现跨平台特性。」
- 「面向对象:将现实事物抽象成对象的一种程序设计思想。将现实世界中的关系抽象为继承;更容易理解、分析、设计和编写。」
- 「多线程通过Java的多线程接口,实现程序并发执行,方便地写出多线程的应用,提高程序的执行效率」
3、什么是面向对象??面向对象的特点/特征??
-
面向对象是一种程序设计思想,它的核心概念是“对象”将某一类中共同的特征和行为封装起来,对象就是类里面的一个具体事物。(人类是一个类,具体到人:张三,李四 就是对象。)
特征
封装:是面向对象的核心思想,将对象的属性和行为封装起来,不需要让外界知道具体实现细节,不允许外界随意访问,通过提供的方法访问。(能够减少耦合。提高代码的复用性 类内部的结构可以自由修改。“高内聚”:封装细节,便于修改内部代码,提高可维护性。
“低耦合”:简化外部调用,便于调用者使用,便于扩展和协作。 )
良好的封装增强了代码块之间的独立性,减少了耦合度。
封装可以将数据和方法组合在一个类中,方便其他代码复用,避免了代码重复,提高了代码的复用性和可维护性
高内聚:尽可能类的每个成员方法只完成一件事(最大限度的聚合); 低耦合:减少类内部,一个成员方法调用另一个成员方法。从类角度来看, 高内聚低耦合:减少类内部,对其他类的调用;从功能块来看 高内聚低耦合:减少模块之间的交互复杂度(接口数量,参数数据
继承:extends子类对于父类,通过继承,继承父类的属性和方法 可以继承私有,但是无法使用(访问)只是拥有了该属性,但是还是不能直接访问。
多态: 指不同的对象在调用同一个方法时所呈现出的多种不同行为。
「一个接口,多种实现。
之前方法名相同参数不同是重载。
多态存在的三个必要条件:
继承和多态:让程序易扩展,易修改维护、易复用。
多态:向上转型::::涉及到将子类对象当做父类类型使用的情况,
Animal an1 = new Cat();
(父类指向子类对象,但是只能访问父类中有的方法属性,不能访问子类中有父类中没有的。
父类调用共有的方法,实现的是子类里面重写的。)」
多态的优点:可替换性。多态对已存在代码具有可替换性。例如,多态对圆 Circle 类 工作,对其他任何圆形几何体,如圆环,也同样工作。
可扩充性。多态对代码具有可扩充性。增加新的子类不影响已存在类的多态
4、什么是JDK ?? JDK的环境变量的作用?是否必须配置?
Java的开发环境,JDK中包含了开发工具,包含了JRE, java的编译器,还包含了很多 java 程序调试和分析的工具。
作用:保证javac命令可以在任意目录下运行。用户通过设置环境变量,来更好的运行进程。可以简单的认为环境变量是指定路径,通常是文件目录的路径
「(要想在系统中的任何位置都能编译和运行Java程序,还需要对环境变量进行配置)通俗点来讲,就是为了能够在任何文件夹下都调用到某一指定目录下的文件,当你未配置该目录的环境变量时,则必须在该文件所在目录下打开cmd,再运行该文件, 配置环境变量,为了在在任何文件夹下都调用到某一指定目录下的文件,而不用我们去手动打开这些文件所在目录再运行」
5、什么是JRE??
Java运行环境,JRE中包含了Java基础类库和JVM。
(jvm负责运行由Java编译器生成的字节码文件(.class文件)运行环境:运行工具启动jvm,运行字节码文件。)
5.2区别:
JDK 包含了 JRE,还包含开发工具一系列Java程序所必须的可执行程序。
简单来说:如果你需要运行 java 程序,只需安装 JRE 就可以了,如果你需要编写 java 程序,需要安装 JDK。
6、什么是jvm/什么是编译器(javac)??
JVM虚拟机是运行所有java程序的抽象计算机。Java虚拟机相当于一个虚拟的操作系统。
介绍:(JDK,Java的核心,JDK中包含了开发工具和JRE,同时还包含了编译 java源码的编译器. javacJava编译器、Java运行工具、Java文档生成工具、Java打包工具等。而JRE中又包含了Java基础类库和JVM。其中JVM是运行Java程序的核心虚拟机,而运行Java程序不仅需要核心虚拟机,还需要类加载器、字节码校验器以及Java的基础类库等。
javac.exe编译器工具:它可以将编写好的Java文件编译成Java字节码文件(.class文件???可执行的Java程序)。基本的开发工具
java.exe运行工具
虚拟机的作用:Java通过编译后生成字节码交给JVM执行,不同平台只要安装了JVM就都可以执行java程序字节码,它只关心被谁执行。你写好了代码之后既可以在windows操作系统下运行也可以在Linux下运行,甚至可以在移动终端上运行。
7、什么是类??(描述,统称)什么是类的封装??
用于描述一组对象的共同特征和行为,所有的代码都在类中写,程序的单元。
类的封装:指在定义一个类时,将类的属性私有化,使用private关键字来修饰。需要提供一些使用public修饰的公有方法访问私有属性。
8、什么是对象??
对象用于描述现实中的个体,是类的实例。
9、类和对象的关系??
类是描述某类事物,对象是表示这类事物的一个个体,它是类的实例。
10、什么是变量??
临时数据存在内存单元中,内存单元就是变量,内存单元用标识符标识。标识符就是变量名,数据就是变量的值。
11、内存泄漏和内存溢出??
12、Java 中的四大引用分别是什么??
13、Java 中怎么创建一个不可变对象??
14、在 java 源文件中可以有多个类吗内部类除外??
JavaWeb-----------------------------------------------------------------------------------
1、session 和 cookie 的区别?
17.什么是 Servlet?
2、servlet 的生命周期?
Java Servlet的简称,用于Java编写的服务器端程序响应任何类型请求的,主要功能在于交互式地浏览和生成数据,生成动态Web内容。
Servlet 生命周期可以分成四个阶段:加载和实例化、初始化、服务、销毁。
「当客户第一次请求时,首先判断是否存在 Servlet 对象,若不存在,则由 Web 容器创建对象, 而后调用 init()方法对其初始化,此初始化方法在整个 Servlet 生命周期中只调用一次。完成 Servlet 对象的创建和实例化之后,Web 容器会调用 Servlet 对象的 service()方法来
处理请求。 当 Web 容器关闭或者 Servlet 对象要从容器中被删除时,会自动调用 destory()方法。 」
3.什么是 webservice
10.Http 请求的 get 和 post 方法的区别?
11.tomcat 容器是如何创建 servlet 类实例?用到了什么原理?
12.JDBC 访问数据库的基本步骤是什么?
14.数据库连接池的原理,为什么要使用连接池?
16.JDBC 的 ResultSet 是什么?
22.如何防止表单重复提交?
25.Cookie 对象的缺陷?
28.Filter 的工作原理?
34.常用的日志框架?
JVM 虚拟机--------------------------------------------------------------------------------
2.什么是 Java 虚拟机,为什么 Java 被称作是无关平台的编程语言?
Java 虚拟机是一个可以执行 Java 字节码的虚拟机进程。Java 源文件被编译成能被 Java 虚拟机 执行的字节码文件。 Java 被设计成允许应用程序可以运行在任意的平台,而不需要程序员为每 一个平台单独重写或者是重新编译。Java 虚拟机让这个变为可能,因为它知道底层硬件平台的指令长度和其他特性。
3.如何判断一个对象应该被回收?
基础--------------------------------------------------------------------------------------
1、Java 的基本类型和字节大小?Int及其其他的取值范围和位数??
可以根据相对的位数 来算 int是32位,就是2的31次方
2、拆箱和装箱?
一切皆对象,八种基本数据类型不是对象。把Int包装成一个类,这样的一个类就可以以对象的形式操作基本数据类型。
8种基本数据类型却不支持面向对象的编程机制,很多类的方法都需要接收引用类型的对象,此时就无法将一个基本数据类型的值传入。为了解决这样的问题,JDK中提供了一系列的包装类,通过这些包装类可以将基本数据类型的值包装为引用数据类型的对象。
将基本数据类型变成包装类称为装箱。
将包装类的类型变为基本数据类型称为拆箱。
int 和 Integer 的区别:
Integer 是 int 的包装类型,在拆箱和装箱中,二者自动转换.int 是基本类型,直接存数值;而
integer 是对象;用一个引用指向这个对象.由于 Integer 是一个对象,在 JVM 中对象需要一定的数据结构进行描述,相比 int 而言,其占用的内存更大一些。
3、什么是数组??
存储相同数据类型的有序变量集合。再找找其他的
数组在内存中如何分配?
当一个对象使用 new 关键字创建的时候,会在堆上分配内存空间,然后才返回到对象的引用。这对数组来说也是一样的,因为数组也是一个对象,简单的值类型的数组,每个数组成员是一个引用(指针)引用到栈上的空间
数组的遍历、最值的获取、数组的排序????
3、什么是构造??
构造方法(也称为构造器)定义类中的用来初始化对象的方法(特殊的成员方法),并可以给对象中的实例进行赋值。名字必须与类名相同,在创建对象时由编译器自动调用,并且在整个对象的生命周期内只调用一次。
3.2、Java 支持多继承么?
不支持,Java 不支持多继承。每个类都只能继承一个类,但是可以实现多个接口。
4、什么是重载?什么是重写??重载和重写的区别?
重载是一个类中多态性的一种表现。定义相同的方法名,为了处理不同的数据
「(例如:求和数字的个数和类型都不确定 统一方法处理不同类型数据时用)」
重写是父类与子类之间多态性的一种表现。
区别:如果在子类中定义的方法与父类有相同的名称和参数,我们说该方法被重写。子类的对象使用这个方法时,将调用子类中的定义,不使用父类中对应的方法。
如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载
5、访问修饰符和区别??
6、Static的理解 si:da:tei:ke??为什么可以直接使用类名.方法名/变量名使用??
Static 可以修饰内部类、方法、变量、代码块;Static 修饰的类是静态内部类;Static 修饰的方法是静态方法,Static 修饰变量是静态变量或者叫类变量表示该方法属于当前类的,而不属于某个对象的,静态方法也不能被重写,可以直接使用类名来调用。在 static 方法中不能使用 this 或者 super 关键字。
静态的 是被所有实例所共享,不是依赖于对象的。 静态变量在内存中只有一份拷贝,在 JVM 加载类的时候,只为静态分配一次内存。 Static 修饰的代码块叫静态代码块,通常用来做程序优化的。静态代码块中的代码在整个类加载的时候只会执行一次。静态代码块可以有多个,如果有多个,按照先后顺序依次执行。
静态类型有什么特点?
1、静态的属性:随着类的加载而加载,该属性不在属于某个对象,属于整个类
2、静态的方法:直接用类名调用,静态方法里不能访问非静态成员变量
3、静态类:不能直接创建对象,不可被继承
6.2、是否可以在 static 环境中访问非 static 变量?
static 变量在 Java 中是属于类的,它在所有的实例中的值是一样的。当类被 Java 虚拟机载入的时候,会对 static 变量进行初始化。如果你的代码尝试不用实例来访问非 static 的变量,编 译器会报错,因为这些变量还没有被创建出来,还没有跟任何实例关联上。
7、final
被 final 修饰的类不可以被继承,被 final 修饰的方法不可以被重写,被 final 修饰的变量不可以被改变.如果修饰引用,那么表示引用不可变,引用指向的内容可变.被 final 修饰的方法,JVM会尝试将其内联,以提高运行效率,被 final 修饰的常量,在编译阶段会存入常量池中.
final修饰类不能被继承,修饰方法不能被重写,修饰变量不能被修改。
final,finalize 和 finally 的不同之处?
final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。
finally 是异常处理语句结构的一部分,表示总是执行。
finalize 是 Object 类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以
覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等
7、抽象类??
由abstract修饰的类叫做抽象类,也可以修饰抽象方法,抽象方法可以不在抽象类当中实现,但一定要在子类当中重写,并实现
只有抽象类当中才能有抽象方法,普通类当中不能有抽象方法
抽象类当中不一定全是抽象方法,也可以使用普通方法,普通方法可以不用重写
抽象类可以有构造,不能被实例化 抽象方法只声明不能实现。必须被重写.
可以在类中创建 构造方法\普通属性\普通方法\静态属性\静态方法\抽象方法
使用:无法完整描述一个类,只能抽象化概念来使用。比如动物吃东西。 (跟普通类不同的是 确实也可以创建普通的动物类 继承之后也是重写 但是抽象类是强制重写啊)
优点:简单、规范性、维护、拓展性、安全、严密性
8、接口???? 抽象类和接口的区别??
什么情况下用接口 社么情况下用抽象类。搜索一下
interface 实现:implements 接口是一种特殊的抽象类,它不能包含普通方法,其内部的所有方法都是抽象方法,只能声明不能被实现。
使用:接口的主要作用是实现多态性和代码重用。它允许您定义一组方法,然后在多个类中使用这些方法,而无需为每个类重新编写相同的代码。通过使用接口,您可以将代码与实现分离,并且可以在不修改实现的情况下更改代码
区别:
1、接口中所有的方法隐含的都是抽象的。而抽象类则可以同时包含抽象和非抽象的方法。
2、类可以实现很多个接口,但是只能继承一个抽象类 。
3、类如果要实现一个接口,它必须要实现接口声明的所有方法。但是,类可以不实现 抽象类声明的所有方法,当然,在这种情况下,类也必须得声明成是抽象的。
4、抽象类可以在不提供接口方法实现的情况下实现接口。
5、Java 接口中声明的变量默认都是 final 的。抽象类可以包含非 final 的变量。
6、Java 接口中的成员函数默认是 public 的。抽象类的成员函数可以是 private,protecte或者是 public 。
7、接口是绝对抽象的,不可以被实例化(java 8 已支持在接口中实现默认的方法)。抽象类也不可以被实例化,但是,如果它包含 main 方法的话是可以被调用的
9、Object对象常用方法有哪些???????
1.toString()方法:该方法返回对象的字符串表示形式,它使用当前对象的类名和哈希码 (即内存地址) 来创建该字符串。
2.equals()方法:equals0用于比较两个对象的值是否相等。如果对象引用相同,则认为两个对象的值相等。
3.hashCode()方法:hashCode0用于获取对象的哈希码(即内存地址)。
4.getClass()方法:getClass()用于获取对象的类名。
5.clone()方法:clone0方法允许将一个对象复制到另一个对象,以便两个对象都保留相同的值。
6.finalize()方法:finalize0是在垃圾收集器将对象回收之前执行的方法。它使程序员能够释放对象使用的本地资源 (如文件句柄或网络连接)。
10、String 是基本数据类型吗???String,StringBuilder,StringBuffer 区别?
不是的,java.lang.String 类是 final 类型的,因此不可以继承这个类、不能修改这个类。为了提高效率节省空间,我们应该用 StringBuffer 类。
String 字符串常量,不可变,使用字符串拼接时是不同的 2 个空间
StringBuffer 字符串变量,可变,线程安全,字符串拼接直接在字符串后追加
StringBuilder 字符串变量,可变,非线程安全字符串拼接直接在字符串后追加
1.StringBuilder 执行效率高于 StringBuffer 高于 String.
2.String 是一个常量,是不可变的,所以对于每一次+=赋值都会创建一个新的对象,
StringBuffer 和 StringBuilder 都是可变的,当进行字符串拼接时采用 append 方法,在原来的
基础上进行追加,所以性能比 String 要高,又因为 StringBuffer 是线程安全的而 StringBuilder
是线程非安全的,所以 StringBuilder 的效率高于 StringBuffer.
3.对于大数据量的字符串的拼接,采用 StringBuffer,StringBuilder.
StringBuffer类:String一旦创建,其内容和长度是不可改变的。可以使用StringBuffer类(也称字符串缓冲区)来操作字符串。
StringBuffer是线程安全的 StringBuilder不是线程安全,不能同步,速度快。
「
java 中操作字符串都有哪些类?它们之间有什么区别?
操作字符串的类有:String、StringBuffer、StringBuilder。
String 和 StringBuffer、StringBuilder 的区别在于 String 声明的是不可变的对象,每次操作都会生成新的 String 对象,然后将指针指向新的 String 对象,而 StringBuffer、StringBuilder 可以在原有对象的基础上进行操作,所以在经常改变字符串内容的情况下最好不要使用 String。
StringBuffer 和 StringBuilder 最大的区别在于,StringBuffer 是线程安全的,而 StringBuilder 是非线程安全的,但 StringBuilder 的性能却高于 StringBuffer,所以在单线程环境下推荐使用 StringBuilder,多线程环境下推荐使用 StringBuffer。
如何将字符串反转?
使用 StringBuilder 或者 stringBuffer 的 reverse() 方法。
StringBuffer stringBuffer = new StringBuffer();
stringBuffer.append("abcdefg");
System.out.println(stringBuffer.reverse()); // gfedcba// StringBuilder reverse
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("abcdefg");
System.out.println(stringBuilder.reverse()); // gfedcba
」
小知识点:--------------------------------------------------------------------------
1、内存泄漏和内存溢出?
内存泄漏(memoryleak),是指应用程序在申请内存后,无法释放已经申请的内存空间,一次内存泄漏危害可以忽略,但如果任其发展最终会导致内存溢出。如读取文件后流 要进行及时的关闭以及对数据库连接的释放。
内存溢出(outofmemory)是指应用程序在申请内存时,没有足够的内存空间供其使用。如我们在项目中对于大批量数据的导入,采用分批量提交的方式。
2、说几个常见的异常?
编译时异常:
SQLException ei:ke:si:sai:po:shen 提供有关数据库访问错误或其他错误的信息的异常。
IOexception 表示发生了某种 I / O 异常的信号。此类是由失败或中断的 I / O 操作产生的一般
异常类
FileNotFoundException 当试图打开指定路径名表示的文件失败时,抛出此异常。
ClassNotFoundException 找不到具有指定名称的类的定义。
EOFException 当输入过程中意外到达文件或流的末尾时,抛出此异常。
运行时异常:
ArithmeticException(算术异常)
ClassCastException 类转换异常)
IllegalArgumentException (非法参数异常)
IndexOutOfBoundsException 下标越界异常)
NullPointerException(空指针异常)
SecurityException(安全异常)
2.2、Error 和 Exception 有什么区别?
error 表示恢复不是不可能但很困难的情况下的一种严重问题。比如说内存溢出。不可能指望程序能处理这样的情况。exception 表示一种设计或实现问题。也就是说,它表示如果程序运行正常,从不会发生的情况。
2.3、异常的分类?
Throwable 是 Java 语言中所有错误或异常的超类。下一层分为 Error 和 Exception
Error
1.Error 类是指 java 运行时系统的内部错误和资源耗尽错误。应用程序不会抛出该类对象。如
果出现了这样的错误,除了告知用户,剩下的就是尽力使程序安全的终止。 Exception(RuntimeException、CheckedException)
2.Exception 又 有 两 个 分 支 ,一 个 是 运 行 时 异 常 RuntimeException ,一 个 是CheckedException。 RuntimeException 如: NullPointerException 、 ClassCastException ;一个是检查异常 CheckedException,如 I/O 错误导致的 IOException、SQLException。 RuntimeException 是那些可能在 Java 虚拟机正常运行期间抛出的异常的超类。 如果出现 RuntimeException,那么一定是程序员的错误.
检查异常 CheckedException:一般是外部错误,这种异常都发生在编译阶段,Java 编译器会强制程序去捕获此类异常,即会出现要求你把这段可能出现异常的程序进行 try catch,该类异常一般包括几个方面:
1.试图在文件尾部读取数据
2.试图打开一个错误格式的 URL
3.试图根据给定的字符串查找 class 对象,而这个字符串表示的类并不存在
2.4、throw 和 throws 的区别?
throw:
throw 语句用在方法体内,表示抛出异常,由方法体内的语句处理。throw 是具体向外抛出异常的动作,所以它抛出的是一个异常实例,执行 throw 一定是抛出了某种异常。
throws:
throws 语句是用在方法声明后面,表示如果抛出异常,由该方法的调用者来进行异常的处理。
throws 主要是声明这个方法会抛出某种类型的异常,让它的使用者要知道需要捕获的异常的类型。throws 表示出现异常的一种可能性,并不一定会发生这种异常。
2.5、Error 和 Exception 有什么区别?
error 表示恢复不是不可能但很困难的情况下的一种严重问题。比如说内存溢出。不可能指望程 序能处理这样的情况。exception 表示一种设计或实现问题。也就是说,它表示如果程序运行正常,从不会发生的情况。
3、Java 中怎么创建一个不可变对象?
1.对象的状态在构造函数之后都不能被修改,任何修改应该通过创建一个新对象来实现.
2.所有的对象属性应该都设置为 final
3.对象创建要正确,例如:对象的应用不能在构造函数中被泄露出去
4.对象要设置为 final,确保不要继承的 Class 修改了 immutability 特性
4、Java 创建对象的几种方式?
1.new 创建新对象;
2.通过反射机制;
3.采用 clone 机制;
4.通过序列化机制
5、Java 中++操作符是线程安全的吗?
不是线程安全的操作。它涉及到多个指令,如读取变量值,增加,然后存储回内存,这个过程可能会出现多个线程交差。
6、new 一个对象的过程和 clone 一个对象的过程?
new 操作符的本意是分配内存。程序执行到 new 操作符时,首先去看 new 操作符后面的类型,因为知道了类型,才能知道要分配多大的内存空间。分配完内存之后,再调用构造函数,填充对象的各个域,这一步叫做对象的初始化,构造方法返回后,一个对象创建完毕,可以把他的引用 (地址)发布到外部,在外部就可以使用这个引用操纵这个对象。clone 在第一步是和 new 相似的,都是分配内存,调用 clone 方法时,分配的内存和原对象(即调用 clone 方法的对象)相同,然后再使用原对象中对应的各个域,填充新对象的域,填充完成之后,clone 方法返回,一个新的相同的对象被创建,同样可以把这个新对象的引用发布到外部。
7、Java 中==和 equals()的区别?
本质上没有区别,因为 equals 的内部就是使用的==,但是用法上是有些区别的。 使用==比较原生类型如:boolean、int、char 等等,使用 equals()比较对象。 ==是判断两个变量或实例是不是指向同一个内存空间。可以用于判断基本类型是否相同。 equals 是一个方法,只能是对象才可以调用,默认是比较的对象的地址是否相同,但是某些类的 equals 本身发生了重写,比如 String 的 equals 是比较的内容。
equals 来检测两个对象是否相等,即两个对象的内容是否相等
== 比较的是两个对象是否相同 是不是指向同一个内存地址。 即判断两个对象是不是同一个对象
8、&和&&的区别?
&是位运算符,表示按位与运算(按位与,两个都为1则为1,有一个0就是0),&&是逻辑运算符,表示逻辑与(and)。
9、在 java 源文件中可以有多个类吗内部类除外?
一个.java 源文件中可以包括多个类(不是内部类),但是单个文件中只能有一个 public 类, 并且该 public 类必须与文件名相同
10、如何正确的退出多层嵌套循环?
1、使用标号和 break;
2、通过在外层循环中添加标识符
3、return
11、内部类有什么作用?
(内部类是指在一个外部类的内部再定义一个类)
1、内部类可以很好的实现隐藏,一般的非内部类,是不允许有 private 与 protected 权限的,但内部类可以
2、内部类拥有外围类的所有元素的访问权限
3、可是实现多重继承
4、可以避免修改接口而实现同一个类中两种同名方法的调用
12、什么是值传递和引用传递?
(值传递就是只是传值 无影响)。 (引用传递是传递的对象地址 实体也会被修改)
对象被值传递,意味着传递了对象的一个副本。因此,就算是改变了对象副本,也不会影响源对 象的值,对象被引用传递,意味着传递的并不是实际的对象,而是对象的引用。因此,外部对引用对象所做的改变会反映到所有的对象上。
13、成员变量和局部变量的区别有哪些?
(在方法的内部定义的是局部变量。要初始化赋值)(类的内部方法外面定义的是成员变量 不用赋值)
1、从语法形式上,看成员变量是属于类的,而局部变量是在方法中定义的变量或是方法的参数成员变量可以被 public,private,static 等修饰符所修饰,而局部变量不能被访问控制修饰符及static 所修饰;成员变量和局部变量都能被 final 所修饰;
2、从变量在内存中的存储方式来看,成员变量是对象的一部分,而对象存在于堆内存,局部变量存在于栈内存
3、从变量在内存中的生存时间上看,成员变量是对象的一部分,它随着对象的创建而存在,而局部变量随着方法的调用而自动消失。
4、成员变量如果没有被赋初值,则会自动以类型的默认值而赋值(一种情况例外被 final 修饰但没有被 static 修饰的成员变量必须显示地赋值);而局部变量则不会自动赋值。
14、break 和 continue 的区别?
break 和 continue 都是用来控制循环的语句。break 用于完全结束一个循环,跳出循环体执行循环后面的语句。continue 用于跳过本次循环,继续下次循环。
14、Comparable 和 Comparator 接口的区别?
不能继承的是类是那些用 final 关键字修饰的类。一般比较基本的类型或防止扩展类无意间破坏原来方法的实现的类型都应该是 final 的,在 jdk 中 System,String,StringBuffer 等都是基本 类型。
15、字符串常量池到底存在于内存空间的哪里?
jdk 6.0 字符串常量池在方法区,方法区的具体体现可以看做是堆中的永久区。
jdk 7.0 java 虚拟机规范中不再声明方法区,字符串常量池存放在堆空间中
jdk 8.0 java 虚拟机规范中又声明了元空间,字符串常量池存放在元空间中
16、说出一些 JDK1.8 的新特性?
Java 8 在 Java 历史上是一个开创新的版本,下面 JDK 8 中 5 个主要的特性: Lambda 表达式,允许像对象一样传递匿名函数
Stream API:充分利用现代多核 CPU,可以写出很简洁的代码 Date 与 Time API,最终,有一个稳定、简单的日期和时间库可供你使用扩展方法, 现在,接口中可以有静态、默认方法。
重复注解,现在你可以将相同的注解在同一类型上使用多次。
17、super 和 this 的共同点与区别?
super(参数):调用基类中的某一个构造函数(应该为构造函数中的第一条语句this(参数):调用本类中另一种形成的构造函数(应该为构造函数中的第一条语句)super: 它引用当前对象的直接父类中的成员(用来访问直接父类中被隐藏的父类中成员数据或
函数,基类与派生类中有相同成员定义时如:super.变量名 super.成员函数据名(实参)
this:它代表当前对象名(在程序中易产生二义性之处,应使用 this 来指明当前对象;如果函
数的形参与类中的成员数据同名,这时需用 this 来指明成员变量名)调用 super()必须写在子类构造方法的第一行,否则编译不通过。每个子类构造方法的第一条语 句,都是隐含地调用 super(),如果父类没这种形式的构造函数,那么在编译的时候就会报错。
super() 和 this() 类似,区别是,super() 从子类中调用父类的构造方法,this() 在同一类内调用其它方法。
super() 和 this() 均需放在构造方法内第一行。 尽管可以用 this 调用一个构造器,但却不能调用两个。 this 和 super 不能同时出现在一个构造函数里面,因为 this 必然会调用其它的构造函数,其 它的构造函数必然也会有 super 语句的存在,所以在同一个构造函数里面有相同的语句,就失去了语句的意义,编译器也不会通过。 this() 和 super() 都指的是对象,所以,均不可以在 static 环境中使用。包括:static 变
量,static 方法,static 语句块。 从本质上讲,this 是一个指向本对象的指针, 然而 super 是一个 Java 关键字
18、并行和并发的区别
并行:指在同一时间,应用程序能够同时执行不同的任务, 同时执行
并发:指在一定单位时间内,应用程序能够交替执行不同的任务 交替执行
集合:--------------------------------------------------------------------------
1、什么是集合??集合作用?? 集合的类型??
集合就是一个放数据的容器,准确的说是放数据对象引用的容器。
可以存储任意类型的对象,并且长度可变。
集合类型主要有3种:set(集)、list(列表)和map(映射)
2、Java 集合 list,set,queue,map,stack 的特点与用法?
List集合:有序的,可重复的;
Set集合:不可重复;
双列集合Map:无序,键唯一,值不唯一。用于存储具有键(Key)、值(Value)映射关系的元素
Map
Map 是键值对,键 Key 是唯一不能重复的,一个键对应一个值,值可以重复。 TreeMap 可以保证顺序,HashMap 不保证顺序,即为无序的,Map 中可以将 Key 和 Value 单独抽取出来,其中 KeySet()方法可以将所有的 keys 抽取成一个 Set,而 Values()方法可以将 map 中所有的 values 抽取成一个集合。
Set :不包含重复元素的集合,set 中最多包含一个 null 元素,只能用 Iterator 实现单项遍历,Set中没有同步方法。
List :有序的可重复集合,可以在任意位置增加删除元素,用 Iterator 实现单向遍历,也可用ListIterator 实现双向遍历。
Queue :Queue遵从先进先出原则,使用时尽量避免add()和remove()方法,而是使用offer()来添加元素,使用 poll()来移除元素,它的优点是可以通过返回值来判断是否成功,LinkedList 实现了 Queue接口,Queue 通常不允许插入 null 元素。
Stack :Stack 遵从后进先出原则,Stack 继承自 Vector,它通过五个操作对类 Vector 进行扩展,允许将向量视为堆栈,它提供了通常的 push 和 pop 操作,以及取堆栈顶点的 peek()方法、测试堆栈是否为空的 empty 方法等。
用法
如果涉及堆栈,队列等操作,建议使用 List。
对于快速插入和删除元素的,建议使用 LinkedList。
如果需要快速随机访问元素的,建议使用 ArrayList。
3、集合对应的实现??
ArrayList:ArrrayList底层的数据结构是数组,遍历和查找元素速度快(随机访问),不适合做大量的增删操作
LinkedList集合: LinkedList 的底层数据结构是双向循环链表(first和last属性),对于元素的增删操作效率高。对于元素的遍历和查找效率较低。
HashSet:根据对象的哈希值来确定元素的存储的位置,适合存取和快速定位元素。(因此具有良好的存取和查找性能 优点在于快速定位元素)
TreeSet:以二叉树的方式来存储元素,它可以实现对元素进行排序 实现有序的集合 采用自平衡的排序二叉树实现有序的集合。
HashMap底层是由哈希表结构组成的,其实就是“数组+链表”的组合体,数组是HashMap的主体结构,链表则主要是为了解决哈希值冲突而存在的分支结构。
HashMap集合对于元素的增、删、改、查操作表现出的效率都比较高。
「
HashSet 的底层实现是什么?
HashSet 的实现是依赖于 HashMap 的,HashSet 的值都是存储在 HashMap 中的。在 HashSet 的构造法中会初始化一个 HashMap 对象,HashSet 不允许值重复。 因此,HashSet 的值是作为 HashMap 的 key 存储在 HashMap 中的,当存储的值已经存在时返回false
」
4、说出 ArrayList,Vector, LinkedList 的存储性能和特性?
ArrayList 和 Vector 都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector 由于使用了 synchronized 方法(线程安全),通常性能上较 ArrayList 差,而 LinkedList 使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。
5、HashSet 和 TreeSet 有什么区别?
HashSet 是由一个 hash 表来实现的,因此,它的元素是无序的。add(),remove(),contains() 方法的时间复杂度是 O(1)。TreeSet 是由一个树形的结构来实现的,它里面的元素是有序的。因 此,add(),remove(),contains()方法的时间复杂度是 O(logn)。
6、为什么重写 equals 时必须重写 hashCode 方法?
hashCode() 的作用是获取哈希码,也称为散列码;它实际上是返回一个 int 整数。这个哈希码的作用是确定该对象在哈希表中的索引位置。如果两个对象相等,则 hashcode 一定也是相同的如果两个对象相等,对两个对象分别调用 equals 方法都返回 true 如果两个对象有相同的hashcode 值,它们也不一定是相等的因此,equals 方法被覆盖过,则 hashCode 方法也必须被覆 盖。hashCode()的默认行为是对堆上的对象产生独特值。如果没有重写 hashCode(),则该 class的两个对象无论如何都不会相等(即使这两个对象指向相同的数据)
7、Hashtable 和 Hashmap 的区别?
1、HashTable 线程安全,HashMap 非线程安全
2、Hashtable 不允许 null 值(key 和 value 都不可以),HashMap 允许 null 值(key 和 value 都可以)。
3、两者的遍历方式大同小异,Hashtable 仅仅比 HashMap 多一个 elements 方法。
8、TreeMap,HashMap,LindedHashMap 的区别?
LinkedHashMap 可以保证 HashMap 集合有序。存入的顺序和取出的顺序一致。TreeMap 实现SortMap 接口,能够把它保存的记录根据键排序,默认是按键值的升序排序,也可以指定排序的比较器,当用 Iterator 遍历 TreeMap 时,得到的记录是排过序的。HashMap 不保证顺序,即为无序的,具有很快的访问速度。HashMap 最多只允许一条记录的键为 Null;允许多条记录的值为 Null;HashMap 不支持线程的同步。
用哪两种方式来实现集合的排序?
可以使用有序集合,如 TreeSet 或 TreeMap,你也可以使用有顺序的的集合,如 list,然后通 过 Collections.sort() 来排序。
.遍历集合的时候能否增删元素?
1.foreach 遍历,iterator 遍历都不能在遍历的过程中使用 list.remove 或 list.add 操作,会报并发修改异常,遍历删除后加个 break 即可解决。
2.iterator 遍历过程中如果需要删除可以使用 iterator 提供的 remove()方法。
3.遍历根据元素索引删除是可行的。
排序呀。遍历啊。等等?
集合与数组的区别:数组创建后不可改变大小,集合创建后可以改变大小
如何实现数组和 List 之间的转换?
List转换成为数组:调用ArrayList的toArray方法。???????怎么调用
数组转换成为List:调用Arrays的asList方法。
ArrayList 和 LinkedList 的区别是什么?
最明显的区别是 ArrrayList底层的数据结构是数组,支持随机访问,而 LinkedList 的底层数据结构是双向循环链表,不支持随机访问。(必须把底下数据都访问一遍)
27. ArrayList 和 Vector 的区别是什么?
Vector是同步的,而ArrayList不是。然而,如果你寻求在迭代的时候对列表进行改变,你应该使用CopyOnWriteArrayList。
ArrayList比Vector快,它因为有同步,不会过载。
ArrayList更加通用,因为我们可以使用Collections工具类轻易地获取同步列表和只读列表。
Array 和 ArrayList 有何区别?
Array可以容纳基本类型和对象,而ArrayList只能容纳对象。
Array是指定大小后不可变的,而ArrayList大小是可变的。
Array没有提供ArrayList那么多功能,比如addAll、removeAll和iterator等。
22. 如何决定使用 HashMap 还是 TreeMap?
对于在Map中插入、删除和定位元素这类操作,HashMap是最好的选择。HashMap中添加元素会更快
TreeMap需要对一个有序的key集合进行遍历
30. 哪些集合类是线程安全的?
vector:就比arraylist多了个同步化机制(线程安全),因为效率较低,现在已经不太建议使用。在web应用中,特别是前台页面,往往效率(页面响应速度)是优先考虑的。
statck:堆栈类,先进后出
hashtable:就比hashmap多了个线程安全。
enumeration:枚举,相当于迭代器。
反射:--------------------------------------------------------------------------
1、什么是反射?
反射就是动态加载对象,并对对象进行剖析。在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法,这种动态获取信息以及动态调用对象方法的功能成为 Java 反射机制。
2、反射的作用?
1)在运行时判断任意一个对象所属的类
2)在运行时构造任意一个类的对象
3)在运行时判断任意一个类所具有的成员变量和方法
4)在运行时调用任意一个对象的方法
3、反射中,Class.forName()和 ClassLoader.loadClass()的区别?
Class.forName(className)方法,内部实际调用的方法是 Class.forName(className,true, classloader);第 2 个 boolean 参数表示类是否需要初始化,Class.forName(className)默认是 需要初始化,一旦初始化,就会触发目标对象的 static 块代码执行,static 参数也也会被再次 初 始 化 ,ClassLoader.loadClass(className) 方 法 , 内 部 实 际 调 用 的 方 法 是 ClassLoader.loadClass (className,false);第 2 个 boolean 参数,表示目标对象是否进行链接,false 表示不进行链接,由上面介绍可以,不进行链接意味着不进行包括初始化等一些列步骤,那么静态块和静态对象就不会得到执行
等等等
线程:--------------------------------------------------------------------------
1、进程和线程:
进程是执行中的一段程序,进程中的每个任务就是一个线程。一个线程只属于一个进程,一个进程包含多个线程。
2、线程:
当一个Java程序启动时,就会产生一个进程,该进程中会默认创建一个线程,在这个线程上会运行main()方法中的代码。
3、实现多线程的方法::
(1)继承Thread类,重写run()方法 (线程类本身就是调用的 Runnable 接口所以你可以继承 Thread 类)
(2)实现Runnable接口,重写run()方法
(3)使用Thread有参构造方法创建线程实例,并将Runnable接口的实现类的实例对象作为参数传入;(使用Thread的构造方法,将runnable的实现类传进去)
(4)实现Callable接口,重写call()方法,并使用Futrue来获取call()方法的返回结果(既能创建多线程又可以有返回值的需求。)
多线程的同步,即限制某个资源在同一时刻只能被一个线程访问。
4、线程的几个方法:
start()方法启动线程。
等待:(1)sleep(long millis)、(2)wait(long timeout)、(3)join(long millis)方法,就会转换为定时等待状态。
(sleep使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要捕捉 InterruptedException 异常。
终止:(1)run()方法,(2)call()方法正常执行完毕或者线程抛出一个未捕获的异常(Exception)、错误(Error),线程就进入终止状态。
唤醒:notify():唤醒一个处于等待状态的线程,注意的是在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由 JVM 确定唤醒哪个线程,而且不是按优先级。
唤醒所有:notifyAll():唤醒所有处入等待状态的线程,注意并不是给所有唤醒线程一个对象的锁,而是让它们竞争。
5、线程的状态:
创建、就绪、运行、阻塞、死亡
6、死锁问题
两个线程在运行时都在等待对方的锁,这样便造成了程序的停滞,这种现象称为死锁。
7、产生死锁的条件::
(1)互斥条件:一个资源每次只能被一个进程使用。
8、避免死锁方式:
加锁顺序(线程按照一定的顺序加锁)
加锁时限(线程尝试获取锁的时候加上一定的时限,超过时限则放弃对该锁的请求,并释放自己占有的锁)
死锁检测:::
插队:当在某个线程中调用其他线程的join()方法时,调用的线程将被阻塞,直到被join()方法加入的线程执行完成后它才会继续运行。
线程通信:Java在Object类中提供了wait()、notify()、notifyAll()等方法用于解决线程间的通信问题。
线程池:创建、分配和释放多线程对象会产生大量内存管理开销。为此,可以考虑使用Java提供的线程池来创建多线程,进一步优化线程管理。
什么是乐观锁和悲观锁?
线程安全又怎么着 其它又怎么着?
10、线程调用 start()和 run()的区别?
Java 中如何停止一个线程?
11、什么是线程池,线程池有哪些(创建)?
线程池就是事先将多个线程对象放到一个容器中,当使用的时候就不用 new 线程而是直接去池中拿线程即可,节省了开辟子线程的时间,提高的代码执行效率
(看高频面试题 word的那个)
IO
反射------------------------------------------------------------------------------
redis
spring---------------------------------------------------------
1、什么是 Spring 框架?
基本是介绍:::::::
Spring 是一款开源的轻量级 Java 开发框架(Spring Framework)。
要先了解的--------------------------------------
第一个 spring框架基础介绍
Spring 提供的核心功能主要是 IoC 和 AOP。学习 Spring ,一定要把 IoC 和 AOP 的核心思想搞懂!
(介绍:它是很多模块的集合,使用这些模块可以很方便地协助我们进行开发
Spring 最核心的思想就是不重新造轮子,开箱即用,提高开发效率)
各个模块:
模块1:下面的这个:基础模块 提供IOC功能的
模块2 AOP。:中间第一个 面向切面编程
模块3 :第一个 提供数据库访问的
模块4 :第二个 针对web功能的
模块5:测试的
第二个问题:Spring,Spring MVC,Spring Boot 之间什么关系?
Spring 包含了多个功能模块(上面刚刚提到过),其中最重要的是 Spring-Core(主要提供 IoC 依赖注入功能的支持) 模块, Spring 中的其他模块(比如 Spring MVC)的功能实现基本都需要依赖于该模块。
了解结束--------------------------------------
数据库