单例,TCP/IP,普适性排序算法
-
单例
package com.qfedu.single;
/*
需求:
要求当类对象在整个程序运行过程中,有且只能有一个类对象!!!
单例!!!你是如何获取类对象的?
new一个问题:
通过new 关键字 和 构造方法,创建的对象,每一次都是新的对象写个公告:
这个对象我new过了,你们不能在new了!!!解决第一个问题:
创建对象的方式过于轻松,借助于 new 和 构造方法 即可
私有化构造方法第二个问题:
类外没有创建 或者说 获取对象的方式类外有没有当前类对象,没有 期望可以获取 或者 创建对象 这里只可以使用成员方法获取 或者 创建类对象
分析这个成员方法该写成什么样子
类外可以使用 权限修饰为public
类外没有当前类对象,普通的成员方法不能使用,只能使用 static修饰的静态成员方法 static
当前方法是需要获取或者创建类对象,这里需要一个返回值 SingleDog
方法名: getInstance
形式参数列表:没有参数public static SingleDog getInstance()
问题3:
通过这种方式获取的类对象,实际上就是 new 对象期望的是该方法可以提供给我们之前创建的类对象,如果之前没有创建,调用当前方法时创建。 空间首地址,如何保存???空间首地址在哪里??? 1. 保存空间首地址,变量 成员变量: 每一个类对象内,都有一个成员变量,而且是完全不同的!!! 不存在统一性,并且生命周期可能无法满足我们对于代码的需求!!! 局部变量: 只能在方法内使用,方法调用,存在,运行结束,销毁,如何保存??? 静态成员变量: 生命周期足够长 在静态成员方法使用静态成员变量,是刚刚好!!! private static SingleDog sd = null;
【思考】貌似问题全部解决了,代码实现了,请问有没有其他需要考虑的问题???
目前代码在多线程情况下,存在抢占机制。有可能导致对象不一致!!!
【加锁】
使用同步代码块!!!
锁对象如何选择???
sd
“SingleDog”
SingleDog.class/
/*-
单例
-
默写!!!
*/
class SingleDog {private static SingleDog sd = null;
private SingleDog() {}
public static SingleDog getInstance() {
synchronized (SingleDog.class) {
if (null == sd) {
sd = new SingleDog();
}
}
return sd;
}
}
class MyThread1 implements Runnable {
@Override public void run() { SingleDog instance = SingleDog.getInstance(); System.out.println(instance); }
}
class MyThread2 implements Runnable {
@Override public void run() { SingleDog instance = SingleDog.getInstance(); System.out.println(instance); }
}
public class Demo1 {
public static void main(String[] args) {
new Thread(new MyThread2()).start();
new Thread(new MyThread1()).start();
}
} -
-
IP
网络编程:
解决计算机和计算机之间的通信问题,PC,手机,iPad,手表,摄像头。QQ聊天,FeiQ网页编程:
给予HTML页面基础之上,给予数据的展示,用户的交互,数据的传递… JD taobao tmall计算机网络:
各种各样的计算机,相互之间通过网络传输协议,完成的一个交互信息的网络。IP 地址
IP地址就是你的计算机在网络世界的唯一地址!!!
IPV4
IPV6 让地球上的每一粒沙子都有IP地址
IPV4 是由32个二进制位组成的数据
00000000 00000000 00000000 00000000
一般大家所看到的,或者交流的地址
127.0.0.1 这是IP地址的底层32位二进制的一个映射关系
0.0.0.0 ~ 255.255.255.255A类地址:一个网络号 + 三个主机号 国家政府 B类地址:两个网络号 + 两个主机号 事业单位,医院,学校 C类地址:三个网络号 + 一个主机号 网络运营商给予一个区域范围用户的IP地址
IP类:
Java中提供了一个操作IP地址的类对象。
InetAddress
InetAddress.getLoaclhost();
InetAddress.getByName();
InetAddress.getAllByName();
InetAddress.getHostByName(); -
UDP
Socket 套接字
在网络传输中一个非常重要的协议,需要在不同的计算机上按照有Socket这些计算机才可以完成借助于网络的信息传递。协议:
要求协议的双方必须按照一些条件和规矩来处理一些内容。
IEEEUDP协议下的socket:
1. 是按照数据包的方式来处理数据,面向无连接。
2. 每一个数据包有大小限制,要求在64KB以内!
3. 因为面向无连接,所有传输数据不安全,不稳定
4. 因为面向无连接,所有传输速度贼快
5. UDP不区分客户端和服务器,只有发送端和接收端UDP下的socket:
DatagramSocket();
UDP协议下的Socket
DatagramPacket(byte[] buff, int length, InetAddress ip, int port);
UDP协议下的数据表方方法
buff: 数据内容,要求是一个byte类型数组
length: 发送的byte类型数组的字节的长度
ip: 接收人的IP类对象
port: 端口号
总端口号 0 ~ 65535
0 ~ 1023 不能使用,因为绑定系统服务
剩余的随便用!!! 10000+++
Tomcat 8080send receive
数据丢失的原因:
1. 带宽不够
2. 电脑处理能力不足 -
TCP
TCP特征:
1. TCP协议是完全依赖IO流的,面向连接的!!!
2. 数据传输没有大小限制
3. 因为面向连接,所以数据安全
4. 因为面向连接,所以速度较慢
5. TCP协议严格区别客户端和服务器TCP协议的三次握手
建立TCP的过程
1. 获取TCP协议的Socket
Socket 客户端: 这里需要服务器的IP地址和端口号
ServerSocket 服务器: 确定端口号即可
2. 获取对应的【IO流对象】对象
InputStream
OutputStream
3. 处理数据,读取(receive)或者写入(send);
4. 关闭Scoket -
普适性排序算法【重点】
我们希望能够得到一个可以排序任何数据类型,并且按照自己需要的排序要求来完成的排序算法
核心内容;
1. 泛型
2. Comparator接口/**
-
使用自定义泛型,和Comparator接口作为比较方式约束的一个普适性排序算法
-
@param arr T类型的数组,可以是任意类型,而且该数组的数据类型用于约束当前方法的泛型对应具体数据类* 型
-
@param com Comparator接口的实现类对象,而且受到泛型约束,泛型对应的具体数据类型,根据第一个的参* 数T类型数组决定
*/
public static void selectSort(T[] arr, Comparator com) {
if (null == arr || arr.length == 0 || null == com) {
throw new NullPointerException();
}for (int i = 0; i < arr.length - 1; i++) {
int index = i;
for (int j = i + 1; j < arr.length; j++) {
if (com.compare(arr[index], arr[j]) > 0) {
index = j;
}
}if (index != i) { T temp = arr[index]; arr[index] = arr[i]; arr[i] = temp; }
}
}
-