1.Supplier 利用方法构造迭代对象
import java.util.function.Supplier;
public class supplier {
public static void main(String[] args) {
Supplier<String> vSupplier = new Supplier<String>() {
private int id = 0;
public String get() {
int var = this.id++;
return "v" + var;
}
};
for (int i = 0; i < 10; i++) {
String a = vSupplier.get();
System.out.println(a);
}
}
}
2.对象序列化与反序列化
1、变量被transient修饰,变量将不会被序列化
2、transient关键字只能修饰变量,而不能修饰方法和类。
3、被static关键字修饰的变量不参与序列化,一个静态static变量不管是否被transient修饰,均不能被序列化。
4、final变量值参与序列化,final transient同时修饰变量,final不会影响transient,一样不会参与序列化
import java.io.Serializable;
/*
序列化和反序列化的时候,会抛出NotSerializableException没有序列化异常
类通过实现 java.io.Serializable 接口以启用其序列化功能。未实现此接口的类将无法使其任何状态序列化或反序列化。
Serializable接口也叫标记型接口
要进行序列化和反序列化的类必须实现Serializable接口,就会给类添加一个标记
被static修饰的成员变量不能被序列化的,序列化的都是对象
静态优先于非静态加载到内存中(静态优先于对象进入到内存中)
*/
public class Person implements Serializable{
private static final long serialVersionUID = 1L;
private String name;
//private static int age;
//private transient int age;
public int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
import java.io.*;
import java.util.ArrayList;
/*
练习:序列化集合
对集合进序列化和反序列化
分析:
1.定义一个存储Person对象的ArrayList集合
2.往ArrayList集合中存储Person对象
3.创建一个序列化流ObjectOutputStream对象
4.使用ObjectOutputStream对象中的方法writeObject,对集合进行序列化
5.创建一个反序列化ObjectInputStream对象
6.使用ObjectInputStream对象中的方法readObject读取文件中保存的集合
7.把Object类型的集合转换为ArrayList类型
8.遍历ArrayList集合
9.释放资源
*/
public class Demo03Test {
public static void main(String[] args) throws IOException, ClassNotFoundException {
//1.定义一个存储Person对象的ArrayList集合
ArrayList<Person> list = new ArrayList<>();
//2.往ArrayList集合中存储Person对象
list.add(new Person("张三",18));
list.add(new Person("李四",19));
list.add(new Person("王五",20));
//3.创建一个序列化流ObjectOutputStream对象
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("10_IO\\list.txt"));
//4.使用ObjectOutputStream对象中的方法writeObject,对集合进行序列化
oos.writeObject(list);
//5.创建一个反序列化ObjectInputStream对象
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("10_IO\\list.txt"));
//6.使用ObjectInputStream对象中的方法readObject读取文件中保存的集合
Object o = ois.readObject();
//7.把Object类型的集合转换为ArrayList类型
ArrayList<Person> list2 = (ArrayList<Person>)o;
//8.遍历ArrayList集合
for (Person p : list2) {
System.out.println(p);
}
//9.释放资源
ois.close();
oos.close();
}
}
2.序列化实现深克隆
public class Outer implements Serializable{
private static final long serialVersionUID = 369285298572941L; //最好是显式声明ID
public Inner inner;
//Discription:[深度复制方法,需要对象及对象所有的对象属性都实现序列化]
public Outer myclone() {
Outer outer = null;
try { // 将该对象序列化成流,因为写在流里的是对象的一个拷贝,而原对象仍然存在于JVM里面。所以利用这个特性可以实现对象的深拷贝
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(this);
// 将流序列化成对象
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bais);
outer = (Outer) ois.readObject();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return outer;
}
}
public class Inner implements Serializable{
private static final long serialVersionUID = 872390113109L; //最好是显式声明ID
public String name = "";
public Inner(String name) {
this.name = name;
}
@Override
public String toString() {
return "Inner的name值为:" + name;
}
}
2.使用JSON实现序列化
原文链接:https://blog.csdn.net/MGL_1/article/details/89379936
常用注解
@JsonIgnore 注解用在属性上,当JSON序列化和反序列化时忽略该属性。
@JsonFormat 注解用在属性上,作用是把Date类型直接转化为想要的格式,如:[@JsonFormat(pattern ](/JsonFormat(pattern ) = “yyyy-MM-dd HH:mm:ss”)。
@JsonAlias(“name”) 注解用在属性上,只在反序列化时生效。
@JsonProperty 注解用在属性上,作用是把该属性的名称序列化为另外一个名称,如把fullName属性序列化为name,@JsonProperty(“name”)。当序列化和反序列化名称不相同时,可以在对应的get方法上加@JsonProperty(“fullName”)和set方法上加@JsonAlias(“NaMe”)注解。set方法在反序列化时被调用,get方法在序列化时被调用。
@JsonIgnoreProperties(ignoreUnknown = true) 该注解用在类上,代表进行反序列化时如果类中没有对应的属性,可以忽略,也可以写成@JsonIgnoreProperties({ “createTime”, “updateTime” }) 指定的字段不序列化和反序列化。
- 序列化和反序列化
2.1. 常用方法
//序列化常用方法
writeValue(File arg0, Object arg1) 把arg1转成json序列,并保存到arg0文件中。
writeValue(OutputStream arg0, Object arg1) 把arg1转成json序列,并保存到arg0输出流中。
writeValueAsBytes(Object arg0) 把arg0转成json序列,并把结果输出成字节数组。
writeValueAsString(Object arg0) 把arg0转成json序列,并把结果输出成字符串。
// 2.1.2 反序列化常用方法
readValue(URL src, Class<T> valueType) 从给定资源反序列化为给定Java对象。
readValue(String content, Class<T> valueType) 从给定的JSON内容字符串反序列化Java对象。
readValue(File src, Class<T> valueType) 从给定的文件反序列化为Java对象。
readValue(InputStream src, Class<T> valueType) 从给定的字节输入流反序列化为Java对象。
readValue(Reader src, Class<T> valueType) 从给定的字符流反序列化为Java对象。
2.2 实例
// 基本对象
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public static class User {
@JsonProperty(value = "NaMe")
private String name;
private int age;
@JsonAlias("home-address")
private String address;
@JsonIgnore
private Date createTime;
}
public static void main(String[] args) throws IOException {
// 原始字符串
String a = "{\"NaMe\":\"hello\", \"age\":2, \"home-address\":\"chengdu\"}";
ObjectMapper objectMapper = new ObjectMapper();
// 反序列化(JSON字符串转对象)
User label = objectMapper.readValue(a, User.class);
// 以下结果输出:User(name=hello, age=2, address=chengdu, createTime=null)
System.out.println(label);
// 对象序列化(对象转为JSON字符串)
final String string = objectMapper.writeValueAsString(label);
// 以下结果输出:{"age":2,"address":"chengdu","NaMe":"hello"}
System.out.println(string);
}
3.归并排序
public class mergeSort {
public static void merge(int[] a, int low, int mid, int high) {
int[] temp = new int[high-low+1];
int i= low;
int j = mid+1;
int k=0;
// 把较小的数先移到新数组中
while(i<=mid && j<=high){
if(a[i]<a[j]){
temp[k++] = a[i++];
}else{
temp[k++] = a[j++];
}
}
// 把左边剩余的数移入数组
while(i<=mid){
temp[k++] = a[i++];
}
// 把右边边剩余的数移入数组
while(j<=high){
temp[k++] = a[j++];
}
// 把新数组中的数覆盖nums数组
for(int x=0;x<temp.length;x++){
a[x+low] = temp[x];
}
}
public static int[] mergesort(int[] a, int low, int high){
int mid = (low+high)/2;
if(low<high){
mergesort(a,low,mid);
mergesort(a,mid+1,high);
//左右归并
merge(a,low,mid,high);
}
return a;
}
public static void main(String[] args) {
int[] a = new int[]{1,56,84,1,2,64,96,1,6,1,61,31,6,48,415};
mergesort(a,0,a.length);
for (int i = 0; i < a.length; i++) {
System.out.println(a[i]);
}
}
}
4.遍历Map
遍历Map时,不可假设输出的key是有序的!
对Map
来说,要遍历key
可以使用for each
循环遍历Map
实例的keySet()
方法返回的Set
集合,它包含不重复的key
的集合:
public class Main {
public static void main(String[] args) {
Map<String, Integer> map = new HashMap<>();
map.put("apple", 123);
map.put("pear", 456);
map.put("banana", 789);
for (String key : map.keySet()) {
Integer value = map.get(key);
System.out.println(key + " = " + value);
}
}
}
同时遍历key
和value
可以使用for each
循环遍历Map
对象的entrySet()
集合,它包含每一个key-value
映射:
public class Main {
public static void main(String[] args) {
Map<String, Integer> map = new HashMap<>();
map.put("apple", 123);
map.put("pear", 456);
map.put("banana", 789);
for (Map.Entry<String, Integer> entry : map.entrySet()) {
String key = entry.getKey();
Integer value = entry.getValue();
System.out.println(key + " = " + value);
}
}
}
4.computeIfAbsent
computeIfAbsent() 方法对 hashMap 中指定 key 的值进行重新计算,如果不存在这个 key,则添加到 hashMap 中。
computeIfAbsent() 方法的语法为:hashmap.computeIfAbsent(K key, Function remappingFunction)
注:hashmap 是 HashMap 类的一个对象。
返回值
如果 key 对应的 value 不存在,则使用获取 remappingFunction 重新计算后的值,并保存为该 key 的 value,否则返回 value。
import java.util.HashMap;
class Main {
public static void main(String[] args) {
HashMap<String, Integer> prices = new HashMap<>();
prices.put("Shoes", 200);
prices.put("Bag", 300);
System.out.println("HashMap: " + prices);
// 计算 Shirt 的值
int shirtPrice = prices.computeIfAbsent("Shirt", key -> 280);
System.out.println("Price of Shirt: " + shirtPrice);
// 添加280
int shirtPrice = prices.computeIfAbsent("Shoes", key -> 280);
System.out.println("Updated HashMap: " + prices);
// 还是200
}
}
4.合并Map
public static void main(String[] args) {
Map<String, String> map1 = new HashMap<String, String>();
map1.put("one", "一");
map1.put("two", "二");
map1.put("three", "三");
Map<String, String> map2 = new HashMap<String, String>();
map1.put("ten", "十");
map1.put("nine", "九");
map1.put("eight", "八");
// 合并
Map<String, String> combineResultMap = new HashMap<String, String>();
if(map1!=null&&map2!=null){
combineResultMap.putAll(map1);
combineResultMap.putAll(map2);
}
// 合并后打印出所有内容
for (Map.Entry<String, String> entry : combineResultMap.entrySet()) {
System.out.println(entry.getKey() + ":" + entry.getValue());
}
}
4.SortedMap TreeMap
SortedMap 是接口。
TreeMap 是类。
TreeMap类 实现了 SortedMap接口。
5.网络编程(BS)
参考访问地址 http://127.0.0.1:8080/11_Net/web/index.html
package com.itheima.demo04.BSTCP;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
/*
创建BS版本TCP服务器
*/
public class TCPServerThread {
public static void main(String[] args) throws IOException {
//创建一个服务器ServerSocket,和系统要指定的端口号
ServerSocket server = new ServerSocket(8080);
/*
浏览器解析服务器回写的html页面,页面中如果有图片,那么浏览器就会单独的开启一个线程,读取服务器的图片
我们就的让服务器一直处于监听状态,客户端请求一次,服务器就回写一次
*/
while(true){
//使用accept方法获取到请求的客户端对象(浏览器)
Socket socket = server.accept();
new Thread(new Runnable() {
@Override
public void run() {
try {
//使用Socket对象中的方法getInputStream,获取到网络字节输入流InputStream对象
InputStream is = socket.getInputStream();
//使用网络字节输入流InputStream对象中的方法read读取客户端的请求信息
/*byte[] bytes = new byte[1024];
int len = 0;
while((len = is.read(bytes))!=-1){
System.out.println(new String(bytes,0,len));
}*/
//把is网络字节输入流对象,转换为字符缓冲输入流
BufferedReader br = new BufferedReader(new InputStreamReader(is));
//把客户端请求信息的第一行读取出来 GET /11_Net/web/index.html HTTP/1.1
String line = br.readLine();
System.out.println(line);
//把读取的信息进行切割,只要中间部分 /11_Net/web/index.html
String[] arr = line.split(" ");
//把路径前边的/去掉,进行截取 11_Net/web/index.html
String htmlpath = arr[1].substring(1);
//创建一个本地字节输入流,构造方法中绑定要读取的html路径
FileInputStream fis = new FileInputStream(htmlpath);
//使用Socket中的方法getOutputStream获取网络字节输出流OutputStream对象
OutputStream os = socket.getOutputStream();
// 写入HTTP协议响应头,固定写法
os.write("HTTP/1.1 200 OK\r\n".getBytes());
os.write("Content-Type:text/html\r\n".getBytes());
// 必须要写入空行,否则浏览器不解析
os.write("\r\n".getBytes());
//一读一写复制文件,把服务读取的html文件回写到客户端
int len = 0;
byte[] bytes = new byte[1024];
while((len = fis.read(bytes))!=-1){
os.write(bytes,0,len);
}
//释放资源
fis.close();
socket.close();
}catch (IOException e){
e.printStackTrace();
}
}
}).start();
}
//server.close();
}
}
6.网络编程(TCP/IP)TCPServer
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Random;
public class TCPServer {
public static void main(String[] args) throws IOException {
//1.创建一个服务器ServerSocket对象,和系统要指定的端口号
ServerSocket server = new ServerSocket(8888);
//2.使用ServerSocket对象中的方法accept,获取到请求的客户端Socket对象
while(true){
Socket socket = server.accept();
/*
使用多线程技术,提高程序的效率
有一个客户端上传文件,就开启一个线程,完成文件的上传
*/
new Thread(new Runnable() {
//完成文件的上传
@Override
public void run() {
try {
//3.使用Socket对象中的方法getInputStream,获取到网络字节输入流InputStream对象
InputStream is = socket.getInputStream();
//4.判断d:\\upload文件夹是否存在,不存在则创建
File file = new File("d:\\upload");
if(!file.exists()){
file.mkdirs();
}
/*
自定义一个文件的命名规则:防止同名的文件被覆盖
规则:域名+毫秒值+随机数
*/
String fileName = "itcast"+System.currentTimeMillis()+new Random().nextInt(999999)+".jpg";
//5.创建一个本地字节输出流FileOutputStream对象,构造方法中绑定要输出的目的地
//FileOutputStream fos = new FileOutputStream(file+"\\1.jpg");
FileOutputStream fos = new FileOutputStream(file+"\\"+fileName);
//6.使用网络字节输入流InputStream对象中的方法read,读取客户端上传的文件
int len =0;
byte[] bytes = new byte[1024];
while((len = is.read(bytes))!=-1){
//7.使用本地字节输出流FileOutputStream对象中的方法write,把读取到的文件保存到服务器的硬盘上
fos.write(bytes,0,len);
}
//8.使用Socket对象中的方法getOutputStream,获取到网络字节输出流OutputStream对象
//9.使用网络字节输出流OutputStream对象中的方法write,给客户端回写"上传成功"
socket.getOutputStream().write("上传成功".getBytes());
//10.释放资源(FileOutputStream,Socket,ServerSocket)
fos.close();
socket.close();
}catch (IOException e){
System.out.println(e);
}
}
}).start();
}
//server.close();
}
}
6.网络编程(TCP/IP)TCPClient
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
public class TCPClient {
public static void main(String[] args) throws IOException {
//1.创建一个本地字节输入流FileInputStream对象,构造方法中绑定要读取的数据源
FileInputStream fis = new FileInputStream("c:\\1.jpg");
//2.创建一个客户端Socket对象,构造方法中绑定服务器的IP地址和端口号
Socket socket = new Socket("127.0.0.1",8888);
//3.使用Socket中的方法getOutputStream,获取网络字节输出流OutputStream对象
OutputStream os = socket.getOutputStream();
//4.使用本地字节输入流FileInputStream对象中的方法read,读取本地文件
int len = 0;
byte[] bytes = new byte[1024];
while((len = fis.read(bytes))!=-1){
//5.使用网络字节输出流OutputStream对象中的方法write,把读取到的文件上传到服务器
os.write(bytes,0,len);
}
/*
解决:上传完文件,给服务器写一个结束标记
void shutdownOutput() 禁用此套接字的输出流。
*/
socket.shutdownOutput();
//6.使用Socket中的方法getInputStream,获取网络字节输入流InputStream对象
InputStream is = socket.getInputStream();
//7.使用网络字节输入流InputStream对象中的方法read读取服务回写的数据
while((len = is.read(bytes))!=-1){
System.out.println(new String(bytes,0,len));
}
fis.close();
socket.close();
}
}
7.字符串中随机选择一个字符python
import random
str1='this_a_string_with_several_characters'
n=random.randint(0,len(str1))
print(str1[n])#返回一个bai字符du串随机位置zhi的字符
strs=['str1','str2','str3','str4','str5','str6']
n=random.randint(0,len(strs))
print(strs[n])#返回一个字符串数组随机位置的字符串
7.字符串乱序python
import random
a = [1,2,3,4,5]
for i in range(10):
random.shuffle(a)
print(a)
7.使用StringBuilder拼接字符串(加速)
public class StringTest {
public static void main(String[] args) {
String str1 = "hello ";
String str2 = "java";
String str3 = str1 + str2 + "!";
String str4 = new StringBuilder().append(str1).append(str2).append("!").toString();
}
// sb.toString() 转换成字符串
}
IDEA OutOfMemoryError: Java heap space
8.查看虚拟机内存占用
Runtime提供3个方法可以获取当前JVM最大可以使用内存、当前JVM已拥有最大内存和剩余未使用内存。这3个内存指的都是JVM堆内存。
Runtime.maxMemory();
Runtime.totalMemory();
Runtime.freeMemory();
java cmd下带包编译带包运行
java给程序的main()方法传参
Java 类名 参数 参数 参数 ... 注:1.参数为字符串,2.参数数量[0,n]