文章目录
简介
- 本文是2021/05/07整理的笔记
- 赘述可能有点多,还请各位朋友耐心阅读
- 本人的内容和答案不一定是最好最正确的,欢迎各位朋友评论区指正改进
总结
在JDK中可以通过几种形式实现HTTP通讯?
在JDK中可以通过HttpURLConnection完成HTTP通讯,也可以直接通过Socket模拟完成HTTP的客户端和服务器端应用
HTTP服务器中线程池有什么重要性?
HTTP请求的生命周期很短,因此对其数据进行维护的线程生命周期也很短,在一个较短的时间段内也会存在大量的请求,如果每次都创建新的线程,则会存在大量的线程申请和释放的操作,消耗性能,因此HTTP服务器均需要创建适当的线程池来保证性能。
实现HTTP通讯
URL url = new URL("http://127.0.0.1:9999");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
//响应状态码
int responseCode = connection.getResponseCode();
if(responseCode == HttpURLConnection.HTTP_OK){
System.out.println("OK...");
}
Http协议
请求报文
请求行:GET/HTTP/版本号 \r\n
请求头:
空行:
请求体:
响应报文
状态行:协议/版本号 状态 状态描述信息\r\n 例如:HTTP/1.1 200 OK\r\n
响应头
空行
响应体
线程池
特点:
- 效率高
- 可重用性好
- 节省资源
什么是XML
Extensible MarkUp Language 可扩展的标记语言
XML特点
1.传输数据
2.标签需要自定义
3.不依赖于语言平台
4.W3C 的推荐标准
合法的形式良好的 XML 的特点
1.必须有一个根元素
2.节点元素必须有关闭标签
3.标签大小写敏感
4.元素必须被正确的嵌套
5.属性值必须加引号
Dom 和 SAX 区别
DOM:DocumentObjectModel,文档对象模型,将整个文档加载进内存并分析整颗
树的数据结构,根据节点元素之间的父子关系完成整棵树上所有节点的遍历
•优势:符合 XML 树的数据结构逻辑定义,可以对树结构进行修改
•劣势:需要完整加载文档,对于 LDAP 领域等能够产生超大型 XML 文档的环
境明显不适用
SAX:•SimpleAPIforXML,针对 XML 文档的事件驱动解析引擎,逐行对文档进行分析,
遇到文档的特定组成部分后回调预先定义的事件回调
•优势:无需预先完整加载文档,不会对程序的运行时内存造成毁灭性影响
•劣势:不符合 XML 文档的本质数据结构,只能用来解析遍历,而不能修改
DOM 解析 XML
思路:
1.DocumentBuilderFactory.newInstance().newDocumentBuilder()返回 documentBuilder 实例
2.使用 documentBuilder 实例.parse(Inputstream)返回 Document 对象
3.使用 Document 对象.getDocumentElement()返回 Node
4.调用 Node.getChildNodes()返回 NodeList
5.遍历 NodeList
for (int i = 0; i < childNodes.getLength(); i++) {Node item = childNodes.item(i);
NodeList childNodes2 = item.getChildNodes();
//遍历
for (int j = 0; j < childNodes2.getLength(); j++) {
Node item2 = childNodes2.item(j);
if (item2!=null && item2.getNodeType()==Node.TEXT_NODE) {
System.out.println(item.getNodeName()+":"+item2.getNodeValue());
}
}
}
SAX 解析 XML
边加载边解析,不占太多的内存.一般用来解析 XML,不适合修改 XML. 思路:
1.创建 SaxParser 对象
SAXParser saxParser = SAXParserFactory.newInstance().newSAXParser();
2.得到 xmlReader 对象
XMLReader xmlReader = saxParser.getXMLReader();
3.设置 ContentHandler
xmlReader.setContentHandler(contentHandler)
contentHandler 的 3 个方法
/* 当解析器遇到开始元素回调执行 startElement 方法
*/
@Override
public void startElement(String uri, String localName, String qName, Attributes atts)
throws SAXException {
System.out.println("TestSax.startElement([uri, localName, qName, atts])方法
"+qName);
builder=new StringBuilder();
}
@Override
public void endElement(String uri, String localName, String qName) throws
SAXException {
System.out.println("endElement:"+qName);
if (qName.equals("note")){
System.out.println("解析结束:"+qName+":"+builder);
}
}
/*将节点的文本内容放到字符数组 char[]中,从 start 开始,长度是 length
*/
@Overridepublic void characters(char[] ch, int start, int length) throws SAXException {
String content = new String(ch, start, length);
builder.append(content);
System.out.println("characters:"+content);
}
5.解析
xmlReader.parse(new InputSource(new FileInputStream(“Note.xml”)))
Gson使用总结
Gson 使用总结
Gson 对 json 的处理流程是什么?
创建 Gson 对象
对象->json 字符串:gson.toJson(对象)
Json 字符串->对象:gson.fromJson(json,类类型)
集合的类类型使用 TypeToken: new TypeToken(集合类型含泛型)(){}.getType()
设计模式总结
1.什么是设计模式
设计模式是一套代码经验的总结. 2.设计模式的分类可以分为哪 3 大类,说出常见的设计模式
创建型模式
工厂方法模式
抽象工厂模式
单例模式
建造者模式
原型模式
结构型模式
适配器
装配器
代理
外观
桥接
组合
享元模式
行为型模式
策略
模板
观察者
2.设计模式的 6 大原则
开闭原则:对扩展开发,对修改关闭
里氏代换:基类出现的地方=子类一定可以出现
依赖倒转:面向接口编程
接口隔离:解耦
迪米特最少知道:一个实体最少与其他实体发生相互作用合成复用:尽量使用合成/聚合,尽量不使用继承
3.什么是单例模式
在整个应用中某个类只有一个该类的实例叫做单例模式. 5.单例模式的特点
只能有一个实例
必须自己创建自己的一个实例
对外提供访问实例的公有方法
4.单例模式的分类
饿汉单例模式(类加载时创建实例,类加载速度慢,读对象的速度快)
懒汉单例模式(类加载时不创建实例)
1.饿汉式单例模式
1.private static Singleton instance=new Singleton();
2.private Singleton(){}
3.public static Singleton getInstance(){return instance;}
2.懒汉式
1.private static Singleton instance;
2.private Singleton(){}
3.public static Singleton getInstance(){
if()instancenull){
instancenew Singleton();
}
return instance;
}
3.同步方法
1.private static Singleton instance;
2.private Singleton(){}
3.public synchronized static Singleton getInstance(){
if()instancenull){
instancenew Singleton();
}
return instance;
}
4.同步代码块,双重空验证
1.private static Singleton instance;
2.private Singleton(){}
3.public static Singleton getInstance(){
if(instancenull){
synchronized(Singleton.class){
if(instancenull){
instance==new Singleton();
}
}
}return instance;
}
5.静态内部类
public class Singleton3 {
1.private static class SingletonHolder{
private static Singleton3 instance=new Singleton3();
}
//构造方法私有化
2.private Singleton3(){}
//公开的方法
3.public static Singleton3 getInstance(){
return SingletonHolder.instance;
}
}
6.枚举类
public enum SingletonBanana {
1.INSTANCE;
2.private Banana banana;
3.SingletonBanana() {
this.banana = new Banana();
}
4.public Banana getBanana() {
return banana;
}
}
public static void main(String[] args) {
for (int i = 0; i < 2000; i++) {
new Thread(){
@Override
public void run() {
Banana banana = SingletonBanana.INSTANCE.getBanana();
// System.out.println(banana);
}
}.start();
}
}