文章目录
优化拼接字符串
String
:
-
是复合类型 ,相当于char的数组
-
是final类,也就是不支持继承
public final class String { private final char value[]; 。。。。 }
-
低层分析:当String字符串进行拼接的时候,会创建一个新的char数组。
**即:**每次对String对象进行操作,都需要创建新的对象,把数据一个个拷贝到新的空间。
-
**缺点:**占用了更多的空间,速度也慢。
-
如何解决这个问题?
- 使用StringBuffer,同样是String对象,但是可以被多次修改。
StringBuffer
——带同步块Synchronized,适合多线程使用,速度较慢
StringBuilder
—— 新增的等价类,不带同步块,所以单线程使用,速度较快
3、面试题:三者区别
1、String 是字符串常量,对象一旦创建不可更改,这就导致**字符串常量池中没有所需的对象,**每次对String对象进行操作都会创建一个新的String对象,不仅效率低下还会浪费大量的内存空间。
2、StringBuffer和StringBuilder,是字符串变量,是可以改变的对象,和String不同的是,前者两个类型的对象能够被多次修改,且不产生新的未使用的对象。
3、StringBuffer和StringBuilder的差别在于:StringBuffer是线程安全的,StringBuilder是JDK新增的单个线程使用的等价类,也就是线程不安全的。
所以通常来说StringBuffer更安全(多线程),StringBuilder更快(单线程用)
JSON JavaScript Object Notation
目前已学的数据交互格式:
-
拼接字符串:客户端 将信息拼接成字符串,再发送给服务器
客户端<——拼接字符串——>服务端
-
XML格式:拓展标记语言(也是将字符串拼接成XML格式)
- 常用于HTML
- 缺点:比较重、麻烦——打包和解包麻烦 (多加了很多新的字符)
-
JSON格式:
1、认识JSON
- JavaScript Object Notation 一种轻量级的数据交换格式。易于人阅读和编写,可以在多种语言之间进行数据交换
- 易于机器解析和生成。
- 本质上就是将对象——转换为——>字符串
2、JSON的两种结构
-
对象用大括号表示
{}
-
列表用中括号表示
[]
-
语法如下
[ { key1:value1, key2:value2 }, { key3:value3, key4:value4 } ]
-
举个例子
// 对象: { "friendId":"1001", "groupId":7, "qqid":"1003", "friendName":"小美1" } // 列表,(存放多个对象时可以分别用大括号表示 [ { "friendId":"1001", "groupId":7, "qqid":"1003", "friendName":"小美1" }, { "friendId":"1001", "groupId":7, "qqid":"1003", "friendName":"小美1" } ]
3、JSON的用法
JSON是一种规范,就提供了工具包,这里使用阿里巴巴的包FASTJSON.jar
这里展示的JSON用法就是基于FASTJSON包来使用的。
最新下载地址github.com/alibaba/fastjson/wiki
⭐️JSON 字符串、JSON 对象、Bean 对象、集合对象之间的相互转换
-
重要!!对象的属性权限要注意!类和属性也需要public公开的权限或者有公开的访问方式
-
字符串 —— 对象
JSONObject.toJSONString
:对象转字符串JSONObject.parseObject(字符串, 类名.class);
:字符串转换成对应的对象
-
字符串——集合对象
JSONArray.toJSONString
:集合转字符串JSONArray.parseArray(字符串, 元素类名.class)
:字符串转集合
-
字符串——JSON对象
JSONObject
本质是一种存放键值对映射的map格式的对象。可以使用put(key,value)
插入元素JSONObject.toJSONString
一样,对象转字符串JSONObject jsonObjNew = JSONObject.parseObject(jsonStr);
:字符串转JSON对象
package com;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import java.util.ArrayList;
import java.util.List;
public class JSONDemo2 {
public static void main(String[] args) {
// 声明学生对象
Student stu1 = new Student("小A" , 15 , 001 ,"福建省厦门市思明区");
Student stu2 = new Student("小B" , 11 , 002 ,"福建省福州市鼓楼区");
Student stu3 = new Student("小C" , 17 , 003 ,"福建省泉州市丰泽区");
// 声明一个列表存储对象
ArrayList<Student> stuList = new ArrayList<>();
stuList.add(stu1);
stuList.add(stu2);
stuList.add(stu3);
// 1、JSON 字符串 —— 对象
String stu1Json = JSONObject.toJSONString(stu1);
System.out.println("对象转字符串:"+stu1Json);
Student stu1New = JSONObject.parseObject(stu1Json , Student.class);
System.out.println("字符串转对象: "+stu1New);
// 2JSON字符串 —— 集合对象
String listJson = JSONArray.toJSONString(stuList);
System.out.println("集合转字符串:"+listJson);
List<Student> studentList = JSONArray.parseArray(listJson, Student.class);
System.out.println("字符串转数组:(长度)"+ studentList.size()+"(内容)"+studentList.get(0)+studentList.get(1)+studentList.get(2));
// 3 JSON字符串 —— JSON对象
JSONObject jsonObject = new JSONObject();
jsonObject.put("type","学生信息");
jsonObject.put("list",stuList); // json对象存放数组
jsonObject.put("object",stu1); // json对象存放对象
String jsonStr = JSONObject.toJSONString(jsonObject);
System.out.println("JSON对象转字符串:"+jsonStr);
JSONObject jsonObjNew = JSONObject.parseObject(jsonStr);
System.out.println(jsonObjNew.get("type"));
System.out.println(jsonObjNew.get("list"));
System.out.println(jsonObjNew.get("object"));
}
}
package com;
public class Student {
public String name;
public int age;
public int stuID;
public String address;
public Student(String name, int age, int stuID, String address) {
this.name = name;
this.age = age;
this.stuID = stuID;
this.address = address;
}
@Override
public String toString() {
return "Student类的值为:{" +
"name='" + name + '\'' +
", age=" + age +
", stuID=" + stuID +
", address='" + address + '\'' +
'}';
}
}
输出结果
对象转字符串:{"address":"福建省厦门市思明区","age":15,"name":"小A","stuID":1}
字符串转对象: Student类的值为:{name='小A', age=15, stuID=1, address='福建省厦门市思明区'}
集合转字符串:[{"address":"福建省厦门市思明区","age":15,"name":"小A","stuID":1},{"address":"福建省福州市鼓楼区","age":11,"name":"小B","stuID":2},{"address":"福建省泉州市丰泽区","age":17,"name":"小C","stuID":3}]
字符串转数组:(长度)3(内容)Student类的值为:{name='小A', age=15, stuID=1, address='福建省厦门市思明区'}Student类的值为:{name='小B', age=11, stuID=2, address='福建省福州市鼓楼区'}Student类的值为:{name='小C', age=17, stuID=3, address='福建省泉州市丰泽区'}
JSON对象转字符串:{"type":"学生信息","list":[{"address":"福建省厦门市思明区","age":15,"name":"小A","stuID":1},{"address":"福建省福州市鼓楼区","age":11,"name":"小B","stuID":2},{"address":"福建省泉州市丰泽区","age":17,"name":"小C","stuID":3}],"object":{"$ref":"$.list[0]"}}
学生信息
[{"address":"福建省厦门市思明区","stuID":1,"name":"小A","age":15},{"address":"福建省福州市鼓楼区","stuID":2,"name":"小B","age":11},{"address":"福建省泉州市丰泽区","stuID":3,"name":"小C","age":17}]
{"address":"福建省厦门市思明区","stuID":1,"name":"小A","age":15}
4、如何让客户端判断接受的是什么对象?
因为JSON对象本质上就是键值对的类型 (MAP),就可以将要传递的对象打包为一个JSONObject对象
具体方法(发送端,打包)
- 创建一个JSONObject对象
- 使用
put(key,value)
的方法将信息存入 - 第一个信息就固定表示这个对象存储的类型
- 将这个对象转换为JSON格式的字符串
- 传递这个字符串即可
(接收端:打包
-
使用
JSONObject.parseObject
方法将字符串转换为JSONObject对象 -
使用JSONObject的成员方法,即可获得对应的value
-
getString(key)
:获得字符串型的对象 -
getJSONArray
:获得列表型的对象。具体转换方法JSONArray jsonAry = jsonObject.getJSONArray("list"); List<QQGroup> list = jsonAry.toJavaList(QQ.class);
-
补充知识点:XML语言(Extensible Markup Language)。
-
XML 指可扩展标记语言。是一种标记语言,是从标准通用标记语言(SGML)中简化修改出来的。它主要用到的有可扩展标记语言、可扩展样式语言(XSL)、XBRL和XPath等。
-
XML有以下特点:
- XML可以从HTML中分离数据
- XML可用于交换数据。基于XML可以在不兼容的系统之间交换数据,把数据转换为XML格式存储将大大减少交换数据时的复杂性,还可以使这些数据能被不同的程序读取。
- XML可应用于B2B中。目前XML正成为遍布网络的商业系统之间交换信息所使用的主要语言。例如在网络中交换金融信息。
- 利用XML可以共享数据。XML数据以纯文本格式存储,使不同系统、不同程序之间的数据共享变得更加简单。
- XML可以充分利用数据。就像操作数据库一样,XML的数据可以被各种各样的“阅读器”处理
- XML可以用于创建新的语言。WAP和WML语言都是由XML发展来的。
总之,XML使用一个简单而又灵活的标准格式,为基于Web的应用提供了一个描述数据和交换数据的有效手段。但是,XML并非是用来取代HTML的。HTML着重如何描述将文件显示在浏览器中,而XML与SGML相近,它着重描述如何将数据以结构化方式表示。
补充知识点:XML和JSON的区别
1、JSON是JavaScript Object Notation;XML是可扩展标记语言。
2、JSON是基于JavaScript语言;XML源自SGML。
3、JSON是一种表示对象的方式;XML是一种标记语言,使用标记结构来表示数据项。
4、JSON不提供对命名空间的任何支持;XML支持名称空间。
5、JSON支持数组;XML不支持数组。
6、XML的文件相对难以阅读和解释;与XML相比,JSON的文件非常易于阅读。
7、JSON不使用结束标记;XML有开始和结束标签。
8、JSON的安全性较低;XML比JSON更安全。
9、JSON不支持注释;XML支持注释。
10、JSON仅支持UTF-8编码;XML支持各种编码