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;}@Overridepublic 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; //最好是显式声明IDpublic 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; //最好是显式声明IDpublic String name = "";public Inner(String name) {this.name = name;}@Overridepublic 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;@JsonIgnoreprivate 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);// 添加280int 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() {@Overridepublic 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.1String line = br.readLine();System.out.println(line);//把读取的信息进行切割,只要中间部分 /11_Net/web/index.htmlString[] arr = line.split(" ");//把路径前边的/去掉,进行截取 11_Net/web/index.htmlString 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() {//完成文件的上传@Overridepublic 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 randomstr1='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 randoma = [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]
