JAVA基础
-
基本数据类型
数值型:byte 1字节 8位 -128~127 short 2字节 16位 -32768~32767 int 4字节 32位 -2^31~2^31-1 long 8字节 64位 2^63~2^63-1
浮点类型:
float 4字节 32位 double 8字节 64位
字符型:char 2字节 16位 0~65535
布尔型:boolean true false
2.引用类型:
字符串 String、 类 class 、枚举 enum、接口interface
3.重载与重写
重载(Overload):函数名相同,参数不同。可以改变返回值类型,参数的个数和类型。
重写(Override):和父类的的方法名称、参数完全相同。
4.面向对象的三大特征
封装、继承、多态。
5.抽象类
1、如果一个类里有抽象方法,那么这个类必须声明成抽象类。
2、一个类里面可以没有抽象方法,可以有非抽象方法,
3、类继承抽象类:
把子类也用abstract修饰,变成抽象类。
子类重写父类的抽象的方法
4、抽象类不能创建对象。
5、抽象类可以有构造方法,在创建子类的时候,super隐式调用父类的构造方法,将父类的属性和方法放到子类的对象空间里。
6、在继承你关系中,子类能够继承抽象类的各种属性和方法,除了私有的和构造方法。
7、只有公开的才可以和abstract连用,static final private 都不可以。
static属于类方法,不允许覆盖,abstract必须被覆盖。final不能被重写。
6.接口与抽象类区别
1、关键字:抽象类 abstract 接口interface
2、抽象类继承 extends 接口实现 implements
3、子类继承抽象类和 实现类实现接口的格式不同
4、接口中只有全局变量和抽象方法 抽象类中有各种属性和方法
5、抽象类只能单继承 接口可以多实现
6、抽象类的子类只能继承一个父类 实现类可以实现多个接口,并且还可以继承父类
7、抽象类的作用:提高代码的复用性 接口的作用:1、规范代码2、提高代码的拓展性
7.访问权限修饰符
本类中 本包中 其他包子类 其他包非子类 public √ √ √ √ protected √ √ √ × default √ √ × × private √ × × ×
8.内部类
-
成员内部类
1、可以用四种访问权限修饰符修饰 2、可以有自己的属性和方法,除了静态的。 3、可以使用外部类的所有属性和方法,包括私有的。 4、创建对象 1、通过创建外部类对象的方式创建对象 外部类 外部类对象=new 外部类(); 内部类 对象名=外部类对象.new 内部类(); 2、内部类 对象名=new 外部类.new 内部类();
-
静态内部类
1、格式:static class 类名{} 2、可以声明静态的属性和方法 3、可以使用外部的静态的属性和方法 4、创建对象 内类名 对象名=new 内类名();(可以直接创建) 外部类名.内部类 对象名=new 外部类.内部类(); 包名.外部类名.内部类 对象名=new 包名.外部类.内部类(); 5、外部类与内部类同名时,默认是使用内部类对象调用外部类属性 this代表内部类对象 6、要想使用外部类属性,需要使用外部类对象调用
-
局部内部类
1、在方法中声明 2、只能用default修饰 3、可以声明属性和方法,但不能是静态的 4、创建对象,必须在声明内部类的方法内创建 5、调用方法的时候,局部内部类才会被执行
-
匿名内部类
1、匿名内部类只是用一次 2、格式: 父类或接口名 对象名=new 父类或接口名(参数列表){ 重写抽象方法 } 调用抽象方法:对象名.方法名
9.String、StringBuffer、StringBuilder
String 长度不可变
StringBuffer 长度可变 线程安全 速度慢
StringBuilder 长度可变 线程不安全 速度快
10.异常
try{}catch(){}catch(){}... catch中子类异常放在父类异常的上面
try{]catch(){}finally{} finally中的代码一定会被执行到
11.设计模式
1、单例模式
分类:懒汉式、饿汉式
1、构造方法私有化
2、在本类中创建本类对象
3、保证对象的唯一性final
4、给外界提供得到对象的方法 static
5、在多线程中,饿汉式安全,懒汉式不安全
2、简单工厂模式
批量创建对象
1 创建工厂类 : 创建对象的方法
2 果汁类 是所有种类果汁的父类
3 在工厂类的方法中返回果汁类
4 根据测试类中传递的字符串判断到底返回哪种果汁
5 测试类通过工厂类返回果汁对象
3、建造者模式
内部类使用场景
目的:静态内部类创建外部类对象
1、 创建外部类,在其中创建一个静态内部类
2、静态内部类中写属性,构造方法和set get方法
3、静态内部类中写一个方法,必须返回外部类对象
4、 给外部类创建对象,传递参数。
4、装饰者模式
1、在处理流中使用
2、子类重写父类的方法,提高父类方法的功能及效率
3、为了尽可能减少重复代码,在重写的方法中用父类的对象调用父类原来的方法
4、得到父类对象可以通过将父类对象作为子类属性,通过子类构造方法传递父类对象
12.集合
-
HashMap和Hashtable的区别?
HashMap:实现了Map接口,允许空(null)键值(key),由于非线程安全,在只有一个线程访问的情况下,效率高于Hashtable。 Hashtable:不能将null作为key或者value。方法是同步的,线程安全。
-
ConncurrentHashMap和hashtable比较
ConcurrentHashMap融合了hashtable和hashmap二者的优势。hashtable是做了同步的,即线程安全,hashmap未考虑同 步。所以hashmap在单线程情况下效率较高。hashtable在的多线程情况下,同步操作能保证程序执行的正确性。 但是hashtable是阻塞的,每次同步执行的时候都要锁住整个结构,ConcurrentHashMap正是为了解决这个问题而诞生的, ConcurrentHashMap允许多个修改操作并发进行,其关键在于使用了锁分离技术(一个Array保存多个Object,使用这些对 象的锁作为分离锁,get/put时随机使用任意一个)。它使用了多个锁来控制对hash表的不同部分进行的修改。
-
HashMap的工作原理
HashMap基于hashing原理,我们通过put()和get()方法储存和获取对象。当我们将键值对传递给put()方法时,它调用键对象 的hashCode()方法来计算hashcode,让后找到bucket位置来储存值对象。当获取对象时,通过键对象的equals()方法找到正 确的键值对,然后返回值对象。HashMap使用链表来解决碰撞问题,当发生碰撞了,对象将会储存在链表的下一个节点中。 HashMap在每个链表节点中储存键值对对象。
13.Java I/O
1.字节流
FileInputStream,FileOutputStream
2.字符流
FileReader,FileWriter
缓冲流,转换流,对象流,打印流。。。
14.多线程
-
进程和线程的区别
1、进程是资源分配的最小单位,线程是程序执行的最小单位(资源调度的最小单位) 2、进程有自己的独立地址空间,每启动一个进程,系统就会为它分配地址空间而线程是共享进程中的数据的,使用相同的地址空间。 3、线程之间的通信更方便,同一进程下的线程共享全局变量、静态变量等数据,而进程之间的通信需要以通信的方式(IPC)进行。 4、多进程程序更健壮。多线程程序只要有一个线程死掉,整个进程也死掉了,而一个进程死掉并不会对另外一个进程造成影响。
-
创建线程的两种方式
1、创建一个类继承Thread→重写run方法→创建线程对象→启动线程 2、实现Runable→重写run方法→创建共享资源对象→创建线程对象,将将共享资源对象添加到线程中→启动线程
-
run与start的区别
run没有开辟新的栈空间,没有新线程,都是主线程在执行。 start开辟了新的栈空间,在新的栈空间启动run()方法。
-
线程调度
setPriority();分配优先级,默认5,最低1,最高10 .join();插队,阻塞指定的线程等到另一个线程完成以后再继续执行 .sleep();需要设置睡眠时间 .yield();礼让,当执行到这个方法时,会让出cpu时间,立马变成可执行状态 **java中的sleep()和wait()的区别** 对于sleep()方法,我们首先要知道该方法是属于Thread类中的。而wait()方法,则是属于Object类中的。 sleep()方法导致了程序暂停执行指定的时间,让出cpu该其他线程,但是他的监控状态依然保持者, 当指定的时间到了又会 自动恢复运行状态。 在调用sleep()方法的过程中,线程不会释放对象锁。 而当调用wait()方法的时候,线程会放弃对象锁,进入等待此对象的等待锁定池, 只有针对此对象调用notify()方法后本线程才进入 对象锁定池准备获取对象锁进入运行状态。
-
线程的五种状态
新建 就绪 执行 死亡 阻塞
-
线程同步
1、synchronized修饰静态方法和普通方法有什么区别? 在static方法前加synchronizedstatic:静态方法属于类方法,它属于这个类,获取到的锁,是属于类的锁。 在普通方法前加synchronizedstatic:非static方法获取到的锁,是属于当前对象的锁。 2、synchronized与Lock的区别? 首先synchronized是java内置关键字,在jvm层面,Lock是个java类; synchronized无法判断是否获取锁的状态,Lock可以判断是否获取到锁; synchronized会自动释放锁(a 线程执行完同步代码会释放锁 ;b 线程执行过程中发生异常会释放锁),Lock需在finally中手工释放锁(unlock()方法释放锁),否则容易造成线程死锁; 用synchronized关键字的两个线程1和线程2,如果当前线程1获得锁,线程2线程等待。如果线程1阻塞,线程2则会一直等待下去,而Lock锁就不一定会等待下去,如果尝试获取不到锁,线程可以不用一直等待就结束了; Lock锁适合大量同步的代码的同步问题,synchronized锁适合代码少量的同步问题
Java网络编程
1.TCP/UDP/IP协议
1、TCP/IP协议与Http协议的区别?
TPC/IP协议是传输层协议,主要解决数据如何在网络中传输,而HTTP是应用层协议,主要解决如何包装数据;IP协议是网际互连协议,只为主机提供一种无连接、不可靠的、尽力而为的数据包传输服务。
2、TCP与UDP
TCP(Transmission Control Protocol): 面向连接,数据安全可靠,效率偏低,传输数据大小无限制
UDP:面向无连接,数据安全不可靠,执行效率高,数据大小不超过64kb
2.反射机制
1、反射:
反射是将类中的属性,方法,构造方法等解剖成一个个小的对象,并且能够调用
2、为什么使用反射:
在一个类中,可以创建另外一个类的对象,调用其的属性和方法,无论那个类是否被创建了。
3、如何使用反射:
类
Class class=Class.forName(包名.类名),每一个类都有唯一的一个类对象,这个类对象可以的得到类中的所有信息。
构造方法
class.getConstructor(null); 得到无参构造方法,返回Constructor
class.getConstructor(String.clss,int.class);得到有参构造方法,返回Constructor
constructor2.newInstance("曹菜菜",21); 返回Object类型的对象
class.getConstructors(); 得到所有构造方法,返回Constructor[]数组
方法
getMethod(); 得到普通的方法,返回Method,指定方法名
class1.getMethod("eat", null); 无参、无返回值、非私有的方法。
class1.getMethod("play", String.class); 有参、无返回值。非私有方法。参数一,方法名。参数二,参数类型.class
method(n).invoke(object,null); 方法的执行,参数一是对象,参数二是传的参数值。
getMethods(); 得到子类和父类所有普通的方法,返回Method[]数组
class1.getDeclaredMethod("sleep", null);得到私有的方法
method6.setAccessible(true);
class1.getDeclaredMethods(); 得到自己类的所有方法,包括私有的,返回Method[]
属性
getFields(); 得到public所有属性,返回Field[]
getFileld("name"); 得到public属性,返回Field,指定属性名
field3.set(object5, "菜菜");
Object object6 = field3.get(object5);
getDeclareFields(); 得到所有属性,包括私有的,返回Field[]
getDeclareField(); 得到属性,包括私有的,指定属性名,返回Field
4、反射的优点
1、提高了java程序的灵活性和扩展性,降低了耦合性,提高了自适应的能力
2、允许程序创建和控制任何类的对象,无需提前编码目标类
5、反射的缺点
1、性能问题
2、代码维护问题
3.JS
4.SQL
1、创建表 create table [if not exists] tablename(_id integer primary key autoincrement,name vachar(15)....);
2、追加列 alter table tablename add 字段名 integer
3、插入数据 insert into tablename(id,name...)values(1,'aa');
4、查询数据 select * from tablename where name='aa';
5、修改数据 update tablename set name='aa' where name='aa';
6、删除数据 delete from tablename where name='aa'
7、模糊查询 select * from tablename where name like '%aa%';
8、升序 select * from employees order by id ;
9、降序 select * from employees order by id desc;
10、多字段 select * from employees order by department_id desc,salary asc;
5.Servlet
1、浏览器和服务器的交互 请求/响应式交互
1>浏览器先发送请求给服务器
2>指定的servlet去接收 (根据method属性值如果是post则调用doPost,如果不是则 调用doGet)
3>在servlet中动态的执行逻辑代码,也可以动态给浏览器发送数据
4>服务器响应浏览器的请求
2、C/S结构:客户端/服务器
优势:充分利用两端硬件的优势,提高了执行效率
劣势:必须安装客户端软件,维护客户端的更新
3、B/S结构:浏览器/服务器
优势:操作简单,不需要下载软件。只需要网络
劣势:将所有的操作全部交给服务器处理,增加了服务器的压力。
4、页面跳转:
request.getRequestDispatcher("new.jsp").forward(request, response);
地址栏显示servelet的名字?属性名=属性值&...,可以将前一个网页的值传递过去。
5、重定向:
response.sendRedirect("new.jsp");
地址栏中显示指定页面的值。不能传递数据。
6、request
request.getParameter("useName");括号内写的是输入框的名字。
request.getParameterValues("hobby");复选框,返回数组。
requst.setAttribute(属性的名字,属性值)
requst.getAttribute(属性名字),在另一个页面中写。
doGet()
name = new String(name.getBytes("iso-8859-1"),"utf-8")
doPost()
给requst设置统一的编码格式 (要在得到表单中内容之前调用)
request.setCharacterEncoding("utf-8");
7、response
response.sendRedirect("new.jsp");地址栏中显示的是 指定页面的地址。
8、请求方式:
get:
1、可以缓存
2、请求保留在浏览器的历史中
3、可以收藏为书签
4、处理敏感数据时不能用
5、数据的长度有限制
6、数据在URL中对所有人可见
7、数据类型必须使用ASCII编码。
8、安全性差
post:
1、不可以缓存
2、请求不保留在浏览器的历史中
3、不可以收藏为书签
4、数据的长度无限制
5、数据在URL中不可见
6、数据类型无限制
7、安全在好
9、生命周期:
http请求→解析请求→创建servlet实例→调用init()方法→调用service方法→输出响应信息→响应
10、错误提示
404:没有找到页面
500:服务器发生错误,一般代码有误
200:正确连接
6.forward和redirect两种跳转方式的区别?
1.从地址栏显示来说
forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器.浏览器根本不知道服务器发送的内容从哪里来的,所以它的地址栏还是原来的地址.
redirect是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址.所以地址栏显示的是新的URL.
2.从数据共享来说
forward:转发页面和转发到的页面可以共享request里面的数据.
redirect:不能共享数据.
3.从运用地方来说
forward:一般用于用户登陆的时候,根据角色转发到相应的模块.
redirect:一般用于用户注销登陆时返回主页面和跳转到其它的网站等.
4.从效率来说
forward:高.
redirect:低.
本质上说, 转发是服务器行为,重定向是客户端行为。
SSM
- spring
spring bean的生命周期包括四个阶段:实例化 Instantiation 属性赋值 Populate 初始化 Initialization 销毁 Destruction