Java的基本特征:封装、抽象、继承、多态
八个基本数据类型
数字Byte short int long float double
字符Char
非数字非字符Boolean
面向对象特征概念
封装:私有化属性,并提供公有化方法来对属性进行取值和设置。
继承:子类继承父类,并拥有父类给予的属性和方法
多态:不同对象对同一方法作用不一样(一把剪刀,看谁用,给理发师用,园艺师用)
有了基本类型为什么还要有包装类型呢?
基本类型并不具有对象的性质,为了让基本类型也具有对象的特征,就出现了包装类型。当需要往ArrayList,HashMap中放东西时,像int,double这种基本类型是放不进去的,因为容器都是装object的,这是就需要这些基本类型的包装器类了。
Continue跳出当前循环,进入下一循环
Break跳出此次循环,结束循环
Return跳出当前方法
System.Exit(参数)0表示正常退出,跳出整个程序
==和equal有什么区别
==是基本数据类型比较的值
==用来比较引用数据类型的话是比较的地址值
Equal用来比较引用数据类型的值是否相等
引用数据和基本数据类型的区别
引用数据类型的值存在堆中,栈存的是地址值。基本数据类型存在栈中
String是不可变字符串,StringBuilder和StringBuffer是可变字符串
StringBuffer是线程安全的,效率较低StringBuilder不是线程安全的,效率较高
字符串常的方法
Length()统计的是字符串的长度
Indexof(string str)指的是str在字符串中第一次出现的位置
CharAt(int i)返回的是索引对应的字符
ToUpperCase()小写转大写
ToLowercase()大写转小写
ReplaceAll()替换掉当前字符串指定的内容
Date时间转换格式
DateFormate df=new SimpleDateFormate(“yyyy-MM-dd HH:mm:ss”)df.formate(date类型放入)
有序集合
Set下有HashSet,LinkedHashSet,TreeSet
List下有ArrayList,Vector,LinkedList
Map下有Hashtable,LinkedHashMap,HashMap,TreeMap
List 有序,可重复
ArrayList优点:底层数据结构是数组,查询快。
Vector优点:底层数据结构是数组,线程安全
LinkedList优点:底层数据结构是链表,增删快
Set 无序,唯一
HashSet
底层数据结构是哈希表。(无序,唯一)
如何来保证元素唯一性?
1.依赖两个方法:hashCode()和equals()
LinkedHashSet
底层数据结构是链表和哈希表。(FIFO先进先出插入有序,唯一)
1.由链表保证元素有序
2.由哈希表保证元素唯一
TreeSet
底层数据结构是红黑树。(唯一,有序)
1.如何保证元素排序的呢?
自然排序
比较器排序
2.如何保证元素唯一性的呢?
根据compareto()比较的返回值是否是0来决定(0则相等不储存)
Map接口有三个比较重要的实现类,分别是HashMap、TreeMap和HashTable。
TreeMap是有序的,HashMap和HashTable都是是无序的,两者最主要的区别。
Hashtable的方法是同步的,线程安全的,效率较低,不允许null值。HashMap的方法不是同步的,不是线程安全的,效率较高,允许null值。
HashMap常用的方法:
size()返回map的长度
put(key,value)将键值对放入集合中
get(key)通过key值得到对应value
containKey(key)返回对应是否有该key值的boolean
List是有序的,而且可以存放重复值,Set是无序的,不可以存放重复值
5.ArrayList底层代码是数组,查询效率高,增加删除效率低,LinkedList的底层代码是链表增加删除效率高
6.HashMap是可以用null当做key值或者value值,但HashTable不能
HashMap不是线程安全的,效率较高,HashTable是线程安全的,但效率较低
知识拓展:
我想线程安全但是我又想效率高?尚未了解和证实
通过把整个Map分为N个Segment(类似HashTable),可以提供相同的线程安全,但是效率提升N倍,默认提升16倍。
Java的四种内部类包括如下:
1、成员内部类
2、静态内部类
3、局部内部类
4、匿名内部类
如果需要访问内部的属性或者方法,必须先实例主类,然后通过主类的实例.new方式获取内部类对象。
访问修饰符
访问权限类 包 子类 其他包
public ∨ ∨ ∨ ∨ (对任何人都是可用的)
protect ∨ ∨ ∨ × (继承的类可以访问以及和private一
default ∨ ∨ × × (包访问权限即在整个包内均可被访问)
private ∨ × × × (除类型创建者和类型的内部方法之外的任何人都不能访问的元素)
当用final修饰一个类时,表明这个类不能被继承。final修饰的方法表明这个方法不能重写 final成员变量表示常量,只能被赋值一次,赋值后值不再改变
关系型数据库:Mysql,Oracle,Sql Server
非关系型数据库:MongoDB尤其擅长存储json格式的数据。存储的量大概在10亿级别,再往上性能就下降了,除非另外分库Hbase(大数据常用的数据库)擅长rowkey的快速查询存储的量可以达到百亿甚至以上
SQL语法
添加语法insert into表名(字段1,字段2...) values(字段1的值,字段2的值...)
修改的语法update表名 set 字段1=值1,字段2=值2 ..... where 条件
删除语法delete from表名 where 条件
查询语法select字段1,字段2.... 或者 * from 表名 +条件
String StringBuffer StringBuilder
不同点:
String是不可变字符串,如果长度或者内容发生改变,那么会重新开辟空间。
StringBuffer和StringBuilder都是可变字符串。如果长度或者内容发生改变,不会重新开辟空间。StringBuffer是线程安全的,在多线程环境下使用比较安全。StringBuilder非线程安全,速度会比StringBuffer来得快。
File类
常用方法:
exists()判断文件或者目录是否存在
isFile() isDirectory()判断是否文件或者目录
delete()删除文件或者目录
length()返回文件的长度
getName()返回文件的名称
getAbsoluteName返回文件的绝对路径
createFile()创建文件并返回是否创建成功
mkdir()创建目录,父级目录必须存在
mkdirs()创建目录 ,父级目录不存在也可以创建
流的概念
按照流的方向:输入流和输出流
传输的数据类型:字节流和字符流
基本上所有的文件都可以使用字节流来传输,但是特殊文件比如说中文内容的记事本,world文档等等一些含有中文内容的文件,那么可以考虑使用字符流,如果使用字节流,有可能出现乱码。
字节流
FileinputStream
用于读取文件的内容(从文件中读取数据到内存中),属于字节流。
构造方法:
FileinputStream fis=new FileInputStream(File对象)
常用方法:
close()读取结束后关闭流
read()…….读取一个字节,返回读取的内容,当返回值为-1表示读取结束。
read(byte数组) 一次读取指定byte数组长度个的内容,当返回值为-1表示读取结束。
FileOutputStream
文件输出流,用来将内存中的数据写入到文件中。
构造
FileOutputStream fos=new FileOutputStream(file对象);
常用方法:
write(byte数组)一次性写入byte数组长度的内容
close()关闭文件输出流。
字符流
FileRead:以字符流的形式读取文件中的内容
构造方法
FileRead read=new FileRead(file对象)
通常FileRead读取效率较低,建议配合BufferReader来使用
BufferReader br=new BufferReader(fileRead对象)
调用BufferReader对象readLine(),按照行来读取字符。
FileWriter:以字符流的形式写入到文件中
构造方法
FileWriter fw=new FileWriter(file对象);
由于FileWriter方法读取效率较低,通常结合BufferWriter来使用
BufferWriter bw=new BufferWriter (FileWriter的对象)
常用方法:
write(字符串) 写入字符串
newline()换行
close()关闭流
对象流
ObjectInputStream和ObjectOutputStream
通常要结合FileInputStream和FileOutputStream一起使用,写入的对象必须实现序列化接口
对象流要注意的事项:
1要存入的对象必须是实现序列化接口(Serializable)
2流必须在读取结束或者写入结束的时候关闭
3 outputStream或者Writer 在调用write方法后,记得再调用flush方法。
4对于连续写入到文件流,默认情况下都写入头文件,可能在读取时候引发 invalid type … AC. 解决方法就是重写ObjectOutputStream中的writeStreamHeader()方法,直接返回。
对象序列化
Java的对象序列化(Object Serialization)将那些实现了 Serializable接口的对象转换成一个字节序列,并可以在以后将这个字节序列完全恢复为原来的对象。这一过程甚至可通过网络进行。这意味着序列化机制能自动弥补不同操作系统之间的差异。
只要对象实现了Serializable接口(该接口仅是一个标记接口,不包括任何方法),对象的序列化处理就会非常简单。当序列化的概念被加入到语言中时,许多标准库类都发生了改变,以便能够使之序列化——其中包括所有原始数据类型的包装器、所有容器类以及许多其他的东西。甚至 Class 对象也可以被序列化。
接口和抽象类的区别
区别:1接口中的方法都是抽象方法,而抽象类可以有非抽象方法。
2实现接口后可以继续实现其他接口,继承抽象类就不能再继承其他类
3接口中的属性都是常量,抽象类的属性可以有变量
4实现接口一定要重写所有的抽象方法,继承抽象类可以不用全部实现,但是该类就会变成抽象类
相同:两者都不能直接实例化。
关键字static final abstract的用法
static静态
1修饰属性 该属性是静态属性,当前的类的所有对象对该静态属性都是共享。静态属性可以直接通过类名.属性名的形式来访问。
2修饰方法 该方法是静态方法,静态方法可以直接类名.静态方法名的形式访问,静态方法中不能访问非静态类属性。
3修饰类 只能修饰内部类。
4静态块 类的首次加载的时候就调用
abstract抽象
1修饰类 : 表示该类是抽象类,抽象类不能直接实例化,通常用于被继承来重写方法。
2修饰方法:表示该方法是抽象方法,抽象方法没有方法体。
多线程
一、实现方式
1、通过继承Thread类实现一个线程
2、通过实现Runnable接口实现一个线程
继承扩展性不强,java总支持单继承,如果一个类继承了thread就不能继承其他的类了。
二、怎么启动
Thread thread = new Thread(继承了thread的对象/实现了Runnable的对象)
thread.setName("设置一个线程名称");
thread.start();
启动线程使用start方法,而启动了以后执行的是run方法。
三、怎么区分线程?在一个系统中有很多线程,每个线程都会打印日志,我想区分是那个线程,打印怎么办?
thread.setName("设置一个线程名称");这是一种规范,在创建线程完成后,都需要设置名称。
简单了解一下线程并发库
JDK5中增加了DougLea 的并发库,这一引进给Java线程的管理和使用提供了强大的便利性。java.util.current包中提供了对线程优化、管理的各项操作,使得线程的使用变得的心应手。该包提供了线程的运行,线程池的创建,线程生命周期的控制。
线程池的作用?
1、限定线程的个数,不会导致由于线程过多导致系统运行缓慢或崩溃。
2、线程池不需要每次都去创建或销毁,节约了资源。
3、线程池不需要每次都去创建,响应时间更快。
Java通过Executors提供四个静态方法创建四种线程池,分别为:(还没接触过线程池)
newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
newScheduledThreadPool创建一个定长线程池,支持定时及周期性任务执行。
newSingleThreadExecutor创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行
Servlet方面
1、说一说Servlet的生命周期?
Servlet有良好的生存期的定义,包括加载和实例化、初始化、处理请求以及服务结束。这个生存期由javax.servlet.Servlet接口的init,service和destroy方法表达。 Servlet被服务器实例化后,容器运行其init方法,请求到达时运行其service方法,service方法自动派遣运行与请求对应的doXXX方法(doGet,doPost)等,当服务器决定将实例销毁的时候调用其destroy方法。
[if !supportLists]2、[endif]SERVLET中forward() 与redirect()的区别?
forward方式:request.getRequestDispatcher("/somePage.jsp").forward(request,response); redirect方式:response.sendRedirect("/somePage.jsp");
forward:转发页面和转发到的页面可以共享request里面的数据.redirect:不能共享数据.
4、什么情况下调用doGet()和doPost()?
JSP页面中的form标签里的method属性为get时调用doGet(),为post时调用doPost();超链接跳转页面时调用doGet()
九大内置对象
Out,request,response,session,application,pageContext,Config,Page,Exception
四大作用域
内置对象作用域:application>session>request>pageContext
JSP中九大内置对象为:
request 请求对象 类型 javax.servlet.ServletRequest 作用域 Request
response 响应对象 类型 javax.servlet.SrvletResponse 作用域 Page
pageContext 页面上下文对象 类型 javax.servlet.jsp.PageContext 作用域 Page
session 会话对象 类型 javax.servlet.http.HttpSession 作用域 Session
application 应用程序对象 类型 javax.servlet.ServletContext 作用域 Application
out 输出对象 类型 javax.servlet.jsp.JspWriter 作用域 Page
config 配置对象 类型 javax.servlet.ServletConfig 作用域 Page
page 页面对象 类型 javax.lang.Object 作用域 Page
exception 例外对象 类型 javax.lang.Throwable 作用域 page
事务的四大特性
数据库事务 transanction 正确执行的四个基本要素。ACID,原子性(Atomicity)、一致性(Correspondence)、隔离
性(Isolation)、持久性(Durability)。
(1)原子性:整个事务中的所有操作,要么全部完成,要么全部不完成,不可能停滞在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
(2)一致性:在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。
(3)隔离性:隔离状态执行事务,使它们好像是系统在给定时间内执行的唯一操作。如果有两个事务,运行在相同的时间内,执行 相同的功能,事务的隔离性将确保每一事务在系统中认为只有该事务在使用系统。这种属性有时称为串行化,为了防止事务操作间的混淆, 必须串行化或序列化请 求,使得在同一时间仅有一个请求用于同一数据。
(4)持久性:在事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。
Spring框架中的三大核心思想是什么
DI(依赖注入),IOC(控制反转),AOP(面向切面编程)