本帖最后由 小石姐姐 于 2018-4-25 17:14 编辑
学习笔记
多线程的概述
进程:Process,一个应用程序在内存中的执行区域(一个正运行的程序,可以有一个或多个)
线程:Thread, 进程中的一条执行路径(一个进程可以有多个线程,也可以有一个)
并发:并行发生,同时发生,多线程就可以实现并发
同步:不是同时的意思,是指一步接着一步的执行,一个执行完毕再开始执行下一个.单线程就是同步
异步:不是一步一步执行, 而是同时执行多步, 每个步骤何时结束不确定. 多线程就是异步
阻塞:上一行代码正在执行, 还没有执行完毕, 程序就阻塞在这里了,下一行代码必须等上一行不再阻塞后才能执行
单线程和多线程的特点
单线程:安全性高,效率低,同一时间只做一件事
多线程:安全性低,效率高,同一时间做多个事情
多线程的实现方式
1.继承Thread类,重写run方法
2.实现Runnable接口,重写run方法(调用时仍要创建Thread类对象)
java.lang.Thread类:实现了Runnable接口
构造方法
Thread Thread() 创建Thread对象
Thread Thread(Runnable r): 通过Runnable对象创建Thread对象
Thread Thread(Runnable r, String threadName): 通过Runnable对象创建Thread对象并指定线程名
成员方法
void start(): 启动线程, 即让线程开始执行run()方法中的代码
String getName(): 获取线程的名称
void setName(String name): 设置线程名称
静态方法
static Thread currentThread(): 返回对当前正在执行的线程对象的引用
static void sleep(long millis): 让所在线程睡眠指定的毫秒
多线程中的常见问题
资源共享: 卖票问题
共享资源定义位置: 共享资源要定义在多个线程能够共同使用的地方, 如:
多个Thread共用同一个Runnable实现类对象, 则定义为Runnable实现类的非静态成员变量
如果只用Thread子类, 则可以定义为Thread子类的静态成员变量
操作共享数据的线程安全问题: 使用同步解决
同步代码块
synchronized (锁对象) {}
锁对象
必须是多个线程共享的对象:
一个类的Class对象
如果是实现Runnable, 则可以是this
同步方法
public (static) synchronized void method() {}
锁对象
静态同步方法, 锁对象是: 方法所在类的Class对象
非静态同步方法, 锁对象是: this
网络编程概述
Socket
套接字
用于描述IP地址和域名,是一种网络编程,通信的两端都会有Socket
网络通信3要素
传输协议
IP地址
端口号
常见的通信协议
UDP: 无连接的不可靠的协议;每次传输限制为64k(一个包);不需要建立连接即可传输;发送速度快,不检查接收方是否真正接收到,有可能会丢包;
TCP: 需要建立连接的可靠协议,传输数据没有大小限制;在传输前需要先建立连接(三次握手);它的重发机制保证了数据传输的准确性,但因为需要接收方发回验证信息,所以数据发送时间长,数据流量大
java.net.InetAddress类:用于表示IP地址,可以获取主机名,IP地址等信息
静态方法
static InetAddress getLocalHost();获取本机的InetAddress对象
static InetAddress getByName(String host)根据主机名或IP的字符串获取主机的InetAddress对象
static InetAddress getLoopbackAddress();获取回环地址的InetAddress对象,即127.0.0.1或localhost是一个固定的值
static InetAddress getByAddress(byte[] addr): 根据IP获取InetAddress对象
如: InetAddress.getByAddress(new byte[]{(byte)192, (byte)168, (byte)1, (byte)1});
成员方法
String getHostAddress();返回主机的IP地址
String getHostName();返回主机名
UDP相关的类
java.net.DatagramSocket类:基于UDP协议的Socket
构造方法
DatagramSocket();创建DatagramSocket对象,随机分配端口号
DatagramSocket(int port);创建DatagramSocket对象,指定端口号
成员方法
void send(DatagramPacket p);发送数据包
void receive(DatagramPacket p);接收数据,数据保存在DatagramPacket对象中
void close():关闭通信,释放资源
java.net.DatagramPacket类: UDP数据包
构造方法
DatagramPackage(byte[] msg, int msgLength, InetAddress host, int port): 创建数据包对象, 指定数据,数据长度, 目标主机对象, 端口
DatagramPacket(byte[] buf, int length): 创建数据包对象, 接收数据为length的数据, 存入byte数组中
成员方法
byte[] getData(): 获取包中的数据, 以byte数组形式返回
int getLength(): 获取数据包中数据的长度, 即byte数组的长度
int getPort(): 获取发送方端口号
InetAddress getAddress(): 获取数据包发送方的InetAddress对象
UDP收发数据步骤
发送端
1. 为发送端创建Socket对象(DatagramSocket):
- DatagramSocket udp = new DatagramSocket();
2. 创建数据并打包:
- DatagramPacket packet = new DatagramPacket(buf, buf.length, address, port);
3. 发送数据:
- DatagramSocket对象的void send(DatagramPackage p)
4. 释放资源:
- DatagramSocket对象的void close()
接收端
1. 创建接收端Socket对象:
- DatagramSocket DatagramSocket(int port)
2. 接收数据
- 创建包对象: DatagramPacket datagramPackage(byte[] buf, int length)
- 接收包: DatagramSocket对象的void receive(DatagramPacket p), 该方法会阻塞等待接收数据
3. 解析数据
- 获取发送端信息
- DatagramPacket对象的InetAddress getAddress(): 获取客户端
- DatagramPacket对象的byte[] getData(): 获取数据
- DatagramPacket对象的int getLength(): 获取数据长度
4. 输出数据
5. 释放资源:
- DatagramSocket对象的void close()
TCP相关类
java.net.Socket类: 基于TCP协议的Socket(是客户端)
构造方法
Socket(InetAddress add, int port) 传入服务端的IP地址和端口号
成员方法
OutputStream getOutputStream(): 获取输出流对象, 用于发送数据
InputStream getInputStream(): 获取输出流, 即接收数据
void close(): 释放资源
java.net.ServerSocket: TCP服务端
构造方法
ServerSocket(int port);给出指定的端口号
成员方法
Socket accept(): 监听数据, 会阻塞. 收到数据后返回Socket对象
void close(): 关闭Socket
TCP收发数据步骤
客户端
1. 创建客户端Socket对象(建立连接):
- Socket Socket(InetAddress add, int port)
2. 获取输出流对象:
- Socket对象的OutputStream getOutputStream()
3. 发送数据:
- OutputStream对象的void write(byte[] b)
4. 释放资源:
- OutputStream对象的close()
- Socket对象的close()
服务端
1. 创建服务端ServerSocket对象:
- ServerSocket ServerSocket(int port)
2. 监听数据:
- ServerSocket对象的Socket accept(), 获取客户端Socket对象
- 监听时是阻塞的
3. 获取输入流对象:
- Socket对象的InputStream getInputStream()
4. 获取数据:
- InputStream对象的int read(byte[] buf)
5. 输出数据:
- 将获取的字节数组转换为String打印输出
6. 释放资源:
- Socket对象的void close()方法
- ServerSocket对象的void close()方法
反射
反射的摸目的:
反射可以在不修改源代码的前提下, 改变程序的运行方式
反射是后期web框架的底层实现基础, 帮助我们更好理解框架的原理
概念:在程序运行时,获取任何一个类的所有属性和方法(包括私有),调用任意一个对象的所有属性和方法(包括私有)
前提:获得字节码对象
获取字节码对象的方式:
1 对象.getClass();
2 类名.class
3 Class.forName(String fullClassName)传入字符串的全类名
反射能干的事:
获取一个类的字节码对象,通过该字节码对象:
获取一个类的构造方法,创建一个类的对象,获取一个类的成员属性(获取属性值,设置属性值),获取一个类的成员方法(调用成员方法)
反射使用的相关类和方法
java.lang.Class类:类的字节码对象
获取构造方法
Constructor<?>[] getConstructors(): 以数组形式返回该类中所有public的构造方法. 如果没有public的, 则数组长度为0
Constructor<?>[] getDeclaredConstructors(): 以数组形式返回该类中所有权限的构造方法, 包括private的. 如果该类是接口, 基本类型, 数组, void, 则数组长度为0
Constructor<T> getConstructor(Class<?>... parameterTypes): 根据参数列表返回指定的public的构造方法. 参数列表填写参数的字节码对象(没有参数可以不填,可变参数)
Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes): 根据参数列表返回指定的所有权限的构造方法, 包括private的. 参数列表填写参数的字节码对象(没有参数可以不填,可变参数)
获取成员属性
Field[] getFields(): 获取所有public的成员变量
Field[] getDeclaredFields(): 获取所有权限的成员变量, 包括private的
Field getField(String fieldName): 通过指定的成员变量名获取指定的public的成员变量
Field getDeclaredField(String fieldName): 通过指定的成员变量名获取指定的所有权限的成员变量, 包括private的
获取成员方法
Method[] getMethods(): 返回所有public的方法数组
Method[] getDeclaredMethods(): 返回所有权限的方法数组
Method getMethod(String name, Class<?>... parameterTypes): 获取public的方法, 传入方法名和方法形参字节码对象(没有参数可以不填,可变参数)
Method getDeclaredMethod(String name, Class<?>... parameterTypes): 获取所有权限的指定方法, 传入方法名和方法形参字节码对象(没有参数可以不填,可变参数)
创建对象
T newInstance():使用该类的无参构造创建一个对象
java.lang.reflect.Constructor类: 构造方法对象
T newInstance(): 通过无参构造方法对象创建一个类的对象
T newInstance(Object... initargs): 通过有参构造方法对象创建一个类的对象, 传入构造方法所需的参数列表
void setAccessible(boolean canAccess): 设置为true时禁用Java的访问安全检查, 可以访问所有权限的构造方法
java.lang.reflect.Field类:成员变量对象
Object get(Object obj): 获取指定对象的属性值
void set(Object obj, Object value): 将指定对象的属性值设置为指定的值
void setAccessible(boolean canAccess): 设置为true时禁用Java的访问安全检查, 可以访问所有权限的成员属性
java.lang.reflect.Method类: 成员方法对象
Object invoke(Object obj, Object... args): 调用指定对象的成员方法
void setAccessible(boolean canAccess): 设置为true时禁用Java的访问安全检查, 可以访问所有权限的成员方法
JavaBean
就是一个类
作用: 用于封装和存储数据
规范
类必须是public修饰的
成员变量必须是private的
必须有public的set/get方法
至少提供一个无参构造方法
实现Serializable接口(当对象需要通过IO流传输时)
Jar包
Java ARchive, 后缀名为.jar, 是一个压缩文件, 里面包含编译后的class文件和说明信息
作用: jar包中是写好的代码编译出来的class文件, 有了这些类文件, 就可以调用其中的方法
导入jar包的步骤
项目根目录下创建名为lib的目录
复制jar文件, 粘贴到项目根目录下的lib目录下
选中项目中的jar包, 右键, 选择Build Path, 点击Add to Build Path. 此时项目中的Referenced Libraries中会出现jar包名称的奶瓶, 说明已经添加成功
导入的jar包整个项目都能使用
BeanUtils
Apache组织提供的第三方类库Commons中的一个组件
作用:
利用反射技术给一个类的对象的成员属性赋值或获取值, 用于快速封装数据到JavaBean
BeanUtils类常用的3个方法
static void setProperty(Object bean, String name, Object value): 给JavaBean对象的成员属性赋值, 传入对象, 成员属性名, 属性值
static String getProperty(Object bean, String name): 获取JavaBean成员属性的属性值, 传入对象, 成员属性名, 返回属性值的字符串形式
static void populate(Object bean, Map properties): 给JavaBean对象的成员属性赋值, 传入对象, Map的key是属性名, value是属性值
菜鸟教程(学习网站)
HTML的概述
HTML:Hyper Text Markup Language 超文本标记语言
标记语言:通过一组标签的形式描述事物的一门语言
超文本:比普通的文本更强大
作用:制作静态页面
使用:设计网站页面的时候
创建:扩展名是.html或.htm结尾
标签的属性:<标签 属性名="属性值" (可以有多个属性)></标签>
注释<!-- 具体内容-->
结构标签:
跟标签<html></html>
头标签<head></head>
体标签<boby>中间是具体的内容</boby>
字体标签
<font>字体标签
属性:
color属性:字体颜色
值:英语单词设置,16进制数设置
size属性:字体的大小(1到7)
face属性:设置字体
排版标签
标题标签: <h>标签h1到h6之间
段落标签: <p>标签
字体加粗: <b>标签
字体斜体: <i>标签
字体下划线: <u>标签
居中标签: <center>
横线<hr>
原生标签,(就是原来是什么现在就是什么)<pre>
图片标签
<img>图片标签
属性:
src: 图片路径; 相对路径的写法: ./当前路径 ../上一级(多加一个就是在上一级);下一级写文件名/图片名
width:宽度
height:高度
alt:图片找不到显示的内容
(px是像素单位)
列表标签
有序<ol>
<li>内容</li>
</ol>
type属性
1 :数字类型
a :英文类型
i :罗马字符
start属性:从哪开始
无序<ul>
<li>内容</li>
</ul>
type属性
disc:实心点
circle空心圆
square:方块
超链接标签
<a>标签
属性:
href :链接路径
target:打开方式
打开方式的设置:
_self:在自身页面打开
_blank:新打开一个窗口
_parent(有嵌套关系是才可用)
表格标签
<table>表格标签
<tr>行
<td>列
属性:
width:表格宽度
height:表格高度
border:显示边框
align:表格水平位置(left左边,center中间,right右边)
合并单元格用到<td>的属性
colspan="列数"
rowspan="行数"
合并单元格要找准是跨行还是跨列
bgcolor:设置背景颜色
background背景图片设置
表单标签
<form>表单标签
属性:action="表单数据提交的地址"
method="提交的方式;有很多方式,常用get和post"
get和post的区别
get数据会显示到地址栏,提交是有大小限制的
post数据不会显示到地址栏中,提交的是没有大小限制的
表单元素
<input type="属性"> 根据type属性的不同有不同的输入类型
文本框<input type="text">
属性:name(表单的名字,必要有,后台才可以接收数据)
value:默认显示的值; size:文本框的长度
maxlength:最大长度; readonly:只读
密码框<input type="password">
属性: name必须有,后台接收数据
value:默认显示的值;size长度;maxlength:最大长度
单选按钮<input type="radio">
属性:name必须有,后台接收数据
value:提交到后台的值
checked:默认被选中
复选按钮<input type="checkbox">
属性:跟单选一样
文件上传<input type="file"> 属性:name必须有
提交按钮<input type="submit" value="是显示在按钮上的字"/>
重置按钮<input type="reset" value="是显示在按钮上的字"/>
普通按钮<input type="button" value="是显示在按钮上的字"/>
HTML5扩展的表单标签(不是所有浏览器都能用的)
<input type=”email”>只能写邮箱
<input type=”date”>日期选择
<input type=”number”>只能写数字
<input type=”color”>颜色选择
表单文本域:<textarea>
<textarea name="必须有" rows="几行" cols="计列"></textarea>
表单下拉列表:<select>
<select name="必须有">
<option value="提交到后台的值">中间写显示在页面的字</option> (有多个选项可以写多个<option></option>)
</select>
特殊字符的标签:
空格
< <
> >
|
|