Java锁
集合的种类 ? list 和 set 的区别? arraylist 和 linkedlist 区别 ?
Collection :单列集合
List:有序 可以重复 有索引 可以通过索引对元素进行操作
ArrayList
LinkedList
Vector
Set:无序 不可以重复
HashSet
TreeSet
Map:双列集合
特点:
双列集合 Collection是单列集合
键不可以重复,值可以重复。Set:无序 不可以重复
数据结构针对键有效
静态变量 成员变量 局部变量的区别
书写位置
静态 :类中方法外 加了一个关键字 static
成员: 类中方法外 没有static
局部: 方法内
内存:
静态:方法区里面的静态区
成员:堆
局部:栈
生命周期
静态:随着类的加载而加载 随着类的消失而消失(虚拟机停掉才会消失)
成员:随着对象的创建而存在 随着对象消失而消失(当一个对象没有任何指向的时候 过一段时间垃圾回收器就会来清理)
局部:随着方法的调用而存在 随着方法的执行完毕而消失
初始化:
静态:有默认初始化
成员:有默认初始化
局部:没有了默认初始化 所以在使用之前必须先赋值
重载和重写的区别:
重写:发生在子父类中 子类出现和父类一模一样的方法 才是方法的重写
子类重写父类的方法
重载:发生在一个类中 只要满足 方法名相同 参数列表(顺序 个数 类型)不同 与返回值无关的方法
就叫做他们之间构成相互重载。
重载Overload表示同一个类中可以有多个名称相同的方法,但这些方法的参数列表各不相同(即参数个数或类型不同)。
重写Override表示子类中的方法可以与父类的某个方法的名称和参数完全相同,通过子类创建的实例对象调用这个方法时,将调用子类中的定义方法,这相当于把父类中定义的那个完全相同的方法给覆盖了,这也是面向对象编程的多态性的一种表现。
构造方法:
创建对象时一定会执行. 没有返回值 构造方法名必须和类名一致 可以写一个单独的return;
有参构造和Set方法的区别:
有参构造方法,是在创建对象的同时 顺便给成员变量进行赋值 ,强调的是创建对象
而set方法 就是为了给成员变量赋值的一个方法
static静态:
1:随着类的加载而加载 并且只会加载一次 随着类的消失而消失(虚拟机停掉 才会消失)
2:优先于对象而存在
3:被 包含静态的这个类的所有对象 共享
4:不仅能用对象名调用 还能用类名直接调用(推荐类名调用)
权限修饰符的访问权限:
private: 是为本类准备的
默认:是为同一个包下的类准备的
protected:是为子类准备的 无论子类在任何地方
public: 为所有类准备的
final:关键字
final修饰的类:不能被继承
final修饰的方法:不能被重写
final修饰的变量是常量: 常量只能被赋值一次
代码块:
局部代码块:
在方法内部{}
限定变量生命周期,及早释放,提高内存利用率
构造代码块:
在方法外面 类里面 {}
每创建一次对象 就执行一次 而且是在构造方法执行前执行的,所以说就可以把构造方法里面的共性内容写到构造代码块里面
静态代码块:
在方法外面 类里面 static{}
随着类的加载而执行 只执行一次
做一些全局初始化的内容
this和super的区别:
this代表当前对象的引用 不仅可以调用本类的 也可以调用父类的(本类没有的前提下才能调用父类的)
super代表的是父类内存空间的标识
Object
Object:是一切类的超类或父类
Object的hashCode():返回该对象的哈希值(根据地址值算出的一个int数字)
不同对象的hashCode()值一般不同, 相同对象的hashCode值相同
Object的getClass():返回该对象的字节码文件对象
Object的toString()
1):我们在打印一个对象的时候,默认调用的对象的toString方法,如果该对象没有重写toString()那么调用的
Object的toString()方法,因为继承了Object嘛
2):Object的toString方法 返回 类的全路径名称 + @ + 16进制哈希值, 这样返回一般没有意义
3):所以我们一般在编写类的时候 都重写Object的toString(),一般要求是把类里面的属性都显示出来
Object的equals()
1):Object中equals方法的源码
public boolean equals(Object obj){
return (this == obj);
}
比较的引用类型的地址值,开发中 我们调用equals方法是想比较对象里面的属性值
2):所以在编写类的时候一般重写Object中的equals方法,让其比较对象的属性值
== 和 equals 的区别?
(1)== 比较的是 内存中的地址值 equals重写之后比较的是属性值,否则等价于 == .
抽象类abstract:
特点:
1)抽象类里面可以没有抽象方法,但是有抽象方法的类必须得是抽象类
2)抽象类不能被实例化
3)普通子类继承抽象类,必须全部重写抽象类里面的抽象方法,要不子类也是抽象类
表单提交两种方式GET和POST的区别:
GET的提交的参数会显示到地址栏上,而POST不显示.
GET往往是有大小限制的,而POST没有大小的限制.
GET没有请求体,而POST有请求体.form表单用post
JDBC的优点:
直接底层操作,提供了很简单、便捷的访问数据库的方法,跨平台性比较强。灵活性比较强,可以写很复杂的SQL语句。
JDBC的缺点:
因为JAVA是面向对象的,JDBC没有做到使数据能够面向对象的编程,使程序员的思考仍停留在SQL语句上。
操作比较繁琐,很多代码需要重复写很多次。
如果遇到批量操作,频繁与数据库进行交互,容易造成效率的下降。
jdbc步骤 : 注册驱动 获得数据库的连接 创建代表sql语句的对象 执行sql语句 遍历结果集(查询语句) 释放资源
wait 和 sleep 的区别:
wait:属于object 类,释放同步锁 ,不需要捕获异常
无限期,除非调用notify
sleep:属于 thread类,不释放同步锁 ,需要捕获异常
有时间限制,调用interreput() 可以强行打断
线程创建的两种方式:
1. extends thread 类
2. implements runnable 接口(更好的解耦合)
Servlet的生命周期:(*****)
Servlet生命周期:Servlet从创建到销毁的过程.
何时创建:用户第一次访问Servlet创建Servlet的实例
何时销毁:当项目从服务器中移除的时候,或者关闭服务器的时候.
用户第一次访问Servlet的时候,服务器会创建一个Servlet的实例,那么Servlet中init方法就会执行.任何一次请求服务器都会创建一个新的线程访问Servlet中的service的方法.在service方法内部根据请求的方式的不同调用doXXX的方法.(get请求调用doGet,post请求调用doPost).当Servlet中服务器中移除掉,或者关闭服务器,Servlet的实例就会被销毁,那么destroy方法就会执行.
转发与重定向 的 区别:
转发:1.一次请求 一次响应
2.地址栏不会改变
3.只能在本网站内访问
4.路径不用加工程名
重定向: 1.两次请求,两次响应
2.地址栏会改变
3.可以定向到任意网站
4.要加工程名.
Final,finally,finalize的区别?
final用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。内部类要访问局部变量,局部变量必须定义成final类型。
finally是异常处理语句结构的一部分,表示总是执行。
finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提高垃圾收集时的其他资源回收,例如关闭文件等。JVM不保证此方法总被调用。
Java中如何实现序列化,有什么意义?
序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。序列化是为了解决对象流读写操作时可能引发的问题(如果不进行序列化可能会存在数据乱序的问题)。
要实现序列化,需要让一个类实现Serializable接口,该接口是一个标识性接口,标注该类对象是可被序列化的,然后使用一个输出流来构造一个对象输出流并通过writeObject(Object)方法就可以将实现对象写出(即保存其状态);如果需要反序列化则可以用一个输入流建立对象输入流,然后通过readObject方法从流中读取对象。序列化除了能够实现对象的持久化之外,还能够用于对象的深度克隆。
abstract,static,final三个特殊 关键字的用法
abstract(抽象的): 主要是修饰类和方法, 并且abstract修饰的类要求有子类,父类不能实例化对象;
static(静态的): 主要是修饰属性和方法, 并且static修饰后直接通过类名.格式来调用属性和方法;
final(最终的): 主要修饰类,属性和方法. 并且final修饰的类要求不能有子类,可以该类能产生对象.
Java中的编译器和解释器:
编译程序只需要面向虚拟机,生成虚拟机能够理解的代码,然后由解释器来将虚拟机代码转换为特定系统的机器码执行。
在Java中,这种供虚拟机理解的代码叫做字节码(即扩展名为.class的文件)。
Java源代码—->编译器—->jvm可执行的Java字节码(即虚拟指令)—->jvm—->jvm中解释器—–>机器可执行的二进制机器码—->程序运行。
Java八种基本数据类型
Java语言提供了八种基本类型。六种数字类型(四个整数型,两个浮点型),一种字符类型,还有一种布尔型。
byte:
- byte 数据类型是8位、有符号的,以二进制补码表示的整数;
- 最小值是 -128(-2^7);
- 最大值是 127(2^7-1);
- 默认值是 0;
- byte 类型用在大型数组中节约空间,主要代替整数,因为 byte 变量占用的空间只有 int 类型的四分之一;
- 例子:byte a = 100,byte b = -50。
short:
- short 数据类型是 16 位、有符号的以二进制补码表示的整数
- 最小值是 -32768(-2^15);
- 最大值是 32767(2^15 - 1);
- Short 数据类型也可以像 byte 那样节省空间。一个short变量是int型变量所占空间的二分之一;
- 默认值是 0;
- 例子:short s = 1000,short r = -20000。
int:
- int 数据类型是32位、有符号的以二进制补码表示的整数;
- 最小值是 -2,147,483,648(-2^31);
- 最大值是 2,147,483,647(2^31 - 1);
- 一般地整型变量默认为 int 类型;
- 默认值是 0 ;
- 例子:int a = 100000, int b = -200000。
long:
- long 数据类型是 64 位、有符号的以二进制补码表示的整数;
- 最小值是 -9,223,372,036,854,775,808(-2^63);
- 最大值是 9,223,372,036,854,775,807(2^63 -1);
- 这种类型主要使用在需要比较大整数的系统上;
- 默认值是 0L;
- 例子: long a = 100000L,Long b = -200000L。
"L"理论上不分大小写,但是若写成"l"容易与数字"1"混淆,不容易分辩。所以最好大写。
float:
- float 数据类型是单精度、32位、符合IEEE 754标准的浮点数;
- float 在储存大型浮点数组的时候可节省内存空间;
- 默认值是 0.0f;
- 浮点数不能用来表示精确的值,如货币;
- 例子:float f1 = 234.5f。
double:
- double 数据类型是双精度、64 位、符合IEEE 754标准的浮点数;
- 浮点数的默认类型为double类型;
- double类型同样不能表示精确的值,如货币;
- 默认值是 0.0d;
- 例子:double d1 = 123.4。
boolean:
- boolean数据类型表示一位的信息;
- 只有两个取值:true 和 false;
- 这种类型只作为一种标志来记录 true/false 情况;
- 默认值是 false;
- 例子:boolean one = true。
char:
- char类型是一个单一的 16 位 Unicode 字符;
- 最小值是 \u0000(即为0);
- 最大值是 \uffff(即为65,535);
- char 数据类型可以储存任何字符;
- 例子:char letter = 'A';。