1.Supplier 利用方法构造迭代对象

  1. import java.util.function.Supplier;
  2. public class supplier {
  3. public static void main(String[] args) {
  4. Supplier<String> vSupplier = new Supplier<String>() {
  5. private int id = 0;
  6. public String get() {
  7. int var = this.id++;
  8. return "v" + var;
  9. }
  10. };
  11. for (int i = 0; i < 10; i++) {
  12. String a = vSupplier.get();
  13. System.out.println(a);
  14. }
  15. }
  16. }

2.对象序列化与反序列化

1、变量被transient修饰,变量将不会被序列化
2、transient关键字只能修饰变量,而不能修饰方法和类。
3、被static关键字修饰的变量不参与序列化,一个静态static变量不管是否被transient修饰,均不能被序列化。
4、final变量值参与序列化,final transient同时修饰变量,final不会影响transient,一样不会参与序列化

  1. import java.io.Serializable;
  2. /*
  3. 序列化和反序列化的时候,会抛出NotSerializableException没有序列化异常
  4. 类通过实现 java.io.Serializable 接口以启用其序列化功能。未实现此接口的类将无法使其任何状态序列化或反序列化。
  5. Serializable接口也叫标记型接口
  6. 要进行序列化和反序列化的类必须实现Serializable接口,就会给类添加一个标记
  7. 被static修饰的成员变量不能被序列化的,序列化的都是对象
  8. 静态优先于非静态加载到内存中(静态优先于对象进入到内存中)
  9. */
  10. public class Person implements Serializable{
  11. private static final long serialVersionUID = 1L;
  12. private String name;
  13. //private static int age;
  14. //private transient int age;
  15. public int age;
  16. public Person(String name, int age) {
  17. this.name = name;
  18. this.age = age;
  19. }
  20. @Override
  21. public String toString() {
  22. return "Person{" +
  23. "name='" + name + '\'' +
  24. ", age=" + age +
  25. '}';
  26. }
  27. public String getName() {
  28. return name;
  29. }
  30. public int getAge() {
  31. return age;
  32. }
  33. }
  1. import java.io.*;
  2. import java.util.ArrayList;
  3. /*
  4. 练习:序列化集合
  5. 对集合进序列化和反序列化
  6. 分析:
  7. 1.定义一个存储Person对象的ArrayList集合
  8. 2.往ArrayList集合中存储Person对象
  9. 3.创建一个序列化流ObjectOutputStream对象
  10. 4.使用ObjectOutputStream对象中的方法writeObject,对集合进行序列化
  11. 5.创建一个反序列化ObjectInputStream对象
  12. 6.使用ObjectInputStream对象中的方法readObject读取文件中保存的集合
  13. 7.把Object类型的集合转换为ArrayList类型
  14. 8.遍历ArrayList集合
  15. 9.释放资源
  16. */
  17. public class Demo03Test {
  18. public static void main(String[] args) throws IOException, ClassNotFoundException {
  19. //1.定义一个存储Person对象的ArrayList集合
  20. ArrayList<Person> list = new ArrayList<>();
  21. //2.往ArrayList集合中存储Person对象
  22. list.add(new Person("张三",18));
  23. list.add(new Person("李四",19));
  24. list.add(new Person("王五",20));
  25. //3.创建一个序列化流ObjectOutputStream对象
  26. ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("10_IO\\list.txt"));
  27. //4.使用ObjectOutputStream对象中的方法writeObject,对集合进行序列化
  28. oos.writeObject(list);
  29. //5.创建一个反序列化ObjectInputStream对象
  30. ObjectInputStream ois = new ObjectInputStream(new FileInputStream("10_IO\\list.txt"));
  31. //6.使用ObjectInputStream对象中的方法readObject读取文件中保存的集合
  32. Object o = ois.readObject();
  33. //7.把Object类型的集合转换为ArrayList类型
  34. ArrayList<Person> list2 = (ArrayList<Person>)o;
  35. //8.遍历ArrayList集合
  36. for (Person p : list2) {
  37. System.out.println(p);
  38. }
  39. //9.释放资源
  40. ois.close();
  41. oos.close();
  42. }
  43. }

2.序列化实现深克隆

  1. public class Outer implements Serializable{
  2. private static final long serialVersionUID = 369285298572941L; //最好是显式声明ID
  3. public Inner inner;
  4.  //Discription:[深度复制方法,需要对象及对象所有的对象属性都实现序列化]
  5. public Outer myclone() {
  6. Outer outer = null;
  7. try { // 将该对象序列化成流,因为写在流里的是对象的一个拷贝,而原对象仍然存在于JVM里面。所以利用这个特性可以实现对象的深拷贝
  8. ByteArrayOutputStream baos = new ByteArrayOutputStream();
  9. ObjectOutputStream oos = new ObjectOutputStream(baos);
  10. oos.writeObject(this);
  11.       // 将流序列化成对象
  12. ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
  13. ObjectInputStream ois = new ObjectInputStream(bais);
  14. outer = (Outer) ois.readObject();
  15. } catch (IOException e) {
  16. e.printStackTrace();
  17. } catch (ClassNotFoundException e) {
  18. e.printStackTrace();
  19. }
  20. return outer;
  21. }
  22. }
  1. public class Inner implements Serializable{
  2. private static final long serialVersionUID = 872390113109L; //最好是显式声明ID
  3. public String name = "";
  4. public Inner(String name) {
  5. this.name = name;
  6. }
  7. @Override
  8. public String toString() {
  9. return "Inner的name值为:" + name;
  10. }
  11. }

2.使用JSON实现序列化

原文链接:https://blog.csdn.net/MGL_1/article/details/89379936

jackson学习之一:基本信息

  1. 常用注解
    @JsonIgnore 注解用在属性上,当JSON序列化和反序列化时忽略该属性。
    @JsonFormat 注解用在属性上,作用是把Date类型直接转化为想要的格式,

    1. 如:[@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” }) 指定的字段不序列化和反序列化。

  1. 序列化和反序列化
    2.1. 常用方法
  1. //序列化常用方法
  2. writeValue(File arg0, Object arg1) arg1转成json序列,并保存到arg0文件中。
  3. writeValue(OutputStream arg0, Object arg1) arg1转成json序列,并保存到arg0输出流中。
  4. writeValueAsBytes(Object arg0) arg0转成json序列,并把结果输出成字节数组。
  5. writeValueAsString(Object arg0) arg0转成json序列,并把结果输出成字符串。
  1. // 2.1.2 反序列化常用方法
  2. readValue(URL src, Class<T> valueType) 从给定资源反序列化为给定Java对象。
  3. readValue(String content, Class<T> valueType) 从给定的JSON内容字符串反序列化Java对象。
  4. readValue(File src, Class<T> valueType) 从给定的文件反序列化为Java对象。
  5. readValue(InputStream src, Class<T> valueType) 从给定的字节输入流反序列化为Java对象。
  6. readValue(Reader src, Class<T> valueType) 从给定的字符流反序列化为Java对象。

2.2 实例

  1. // 基本对象
  2. @Data
  3. @JsonIgnoreProperties(ignoreUnknown = true)
  4. public static class User {
  5. @JsonProperty(value = "NaMe")
  6. private String name;
  7. private int age;
  8. @JsonAlias("home-address")
  9. private String address;
  10. @JsonIgnore
  11. private Date createTime;
  12. }
  13. public static void main(String[] args) throws IOException {
  14. // 原始字符串
  15. String a = "{\"NaMe\":\"hello\", \"age\":2, \"home-address\":\"chengdu\"}";
  16. ObjectMapper objectMapper = new ObjectMapper();
  17. // 反序列化(JSON字符串转对象)
  18. User label = objectMapper.readValue(a, User.class);
  19. // 以下结果输出:User(name=hello, age=2, address=chengdu, createTime=null)
  20. System.out.println(label);
  21. // 对象序列化(对象转为JSON字符串)
  22. final String string = objectMapper.writeValueAsString(label);
  23. // 以下结果输出:{"age":2,"address":"chengdu","NaMe":"hello"}
  24. System.out.println(string);
  25. }

3.归并排序

  1. public class mergeSort {
  2. public static void merge(int[] a, int low, int mid, int high) {
  3. int[] temp = new int[high-low+1];
  4. int i= low;
  5. int j = mid+1;
  6. int k=0;
  7. // 把较小的数先移到新数组中
  8. while(i<=mid && j<=high){
  9. if(a[i]<a[j]){
  10. temp[k++] = a[i++];
  11. }else{
  12. temp[k++] = a[j++];
  13. }
  14. }
  15. // 把左边剩余的数移入数组
  16. while(i<=mid){
  17. temp[k++] = a[i++];
  18. }
  19. // 把右边边剩余的数移入数组
  20. while(j<=high){
  21. temp[k++] = a[j++];
  22. }
  23. // 把新数组中的数覆盖nums数组
  24. for(int x=0;x<temp.length;x++){
  25. a[x+low] = temp[x];
  26. }
  27. }
  28. public static int[] mergesort(int[] a, int low, int high){
  29. int mid = (low+high)/2;
  30. if(low<high){
  31. mergesort(a,low,mid);
  32. mergesort(a,mid+1,high);
  33. //左右归并
  34. merge(a,low,mid,high);
  35. }
  36. return a;
  37. }
  38. public static void main(String[] args) {
  39. int[] a = new int[]{1,56,84,1,2,64,96,1,6,1,61,31,6,48,415};
  40. mergesort(a,0,a.length);
  41. for (int i = 0; i < a.length; i++) {
  42. System.out.println(a[i]);
  43. }
  44. }
  45. }

4.遍历Map

遍历Map时,不可假设输出的key是有序的!

Map来说,要遍历key可以使用for each循环遍历Map实例的keySet()方法返回的Set集合,它包含不重复的key的集合:

  1. public class Main {
  2. public static void main(String[] args) {
  3. Map<String, Integer> map = new HashMap<>();
  4. map.put("apple", 123);
  5. map.put("pear", 456);
  6. map.put("banana", 789);
  7. for (String key : map.keySet()) {
  8. Integer value = map.get(key);
  9. System.out.println(key + " = " + value);
  10. }
  11. }
  12. }

同时遍历keyvalue可以使用for each循环遍历Map对象的entrySet()集合,它包含每一个key-value映射:

  1. public class Main {
  2. public static void main(String[] args) {
  3. Map<String, Integer> map = new HashMap<>();
  4. map.put("apple", 123);
  5. map.put("pear", 456);
  6. map.put("banana", 789);
  7. for (Map.Entry<String, Integer> entry : map.entrySet()) {
  8. String key = entry.getKey();
  9. Integer value = entry.getValue();
  10. System.out.println(key + " = " + value);
  11. }
  12. }
  13. }

4.computeIfAbsent

computeIfAbsent() 方法对 hashMap 中指定 key 的值进行重新计算,如果不存在这个 key,则添加到 hashMap 中。
computeIfAbsent() 方法的语法为:
hashmap.computeIfAbsent(K key, Function remappingFunction)
注:hashmap 是 HashMap 类的一个对象。
返回值
如果 key 对应的 value 不存在,则使用获取 remappingFunction 重新计算后的值,并保存为该 key 的 value,否则返回 value。

  1. import java.util.HashMap;
  2. class Main {
  3. public static void main(String[] args) {
  4. HashMap<String, Integer> prices = new HashMap<>();
  5. prices.put("Shoes", 200);
  6. prices.put("Bag", 300);
  7. System.out.println("HashMap: " + prices);
  8. // 计算 Shirt 的值
  9. int shirtPrice = prices.computeIfAbsent("Shirt", key -> 280);
  10. System.out.println("Price of Shirt: " + shirtPrice);
  11. // 添加280
  12. int shirtPrice = prices.computeIfAbsent("Shoes", key -> 280);
  13. System.out.println("Updated HashMap: " + prices);
  14. // 还是200
  15. }
  16. }

4.合并Map

  1. public static void main(String[] args) {
  2. Map<String, String> map1 = new HashMap<String, String>();
  3. map1.put("one", "一");
  4. map1.put("two", "二");
  5. map1.put("three", "三");
  6. Map<String, String> map2 = new HashMap<String, String>();
  7. map1.put("ten", "十");
  8. map1.put("nine", "九");
  9. map1.put("eight", "八");
  10. // 合并
  11. Map<String, String> combineResultMap = new HashMap<String, String>();
  12. if(map1!=null&&map2!=null){
  13. combineResultMap.putAll(map1);
  14. combineResultMap.putAll(map2);
  15. }
  16. // 合并后打印出所有内容
  17. for (Map.Entry<String, String> entry : combineResultMap.entrySet()) {
  18. System.out.println(entry.getKey() + ":" + entry.getValue());
  19. }
  20. }

4.SortedMap TreeMap

SortedMap 是接口。
TreeMap 是类。
TreeMap类 实现了 SortedMap接口。

5.网络编程(BS)

参考访问地址 http://127.0.0.1:8080/11_Net/web/index.html

  1. package com.itheima.demo04.BSTCP;
  2. import java.io.*;
  3. import java.net.ServerSocket;
  4. import java.net.Socket;
  5. /*
  6. 创建BS版本TCP服务器
  7. */
  8. public class TCPServerThread {
  9. public static void main(String[] args) throws IOException {
  10. //创建一个服务器ServerSocket,和系统要指定的端口号
  11. ServerSocket server = new ServerSocket(8080);
  12. /*
  13. 浏览器解析服务器回写的html页面,页面中如果有图片,那么浏览器就会单独的开启一个线程,读取服务器的图片
  14. 我们就的让服务器一直处于监听状态,客户端请求一次,服务器就回写一次
  15. */
  16. while(true){
  17. //使用accept方法获取到请求的客户端对象(浏览器)
  18. Socket socket = server.accept();
  19. new Thread(new Runnable() {
  20. @Override
  21. public void run() {
  22. try {
  23. //使用Socket对象中的方法getInputStream,获取到网络字节输入流InputStream对象
  24. InputStream is = socket.getInputStream();
  25. //使用网络字节输入流InputStream对象中的方法read读取客户端的请求信息
  26. /*byte[] bytes = new byte[1024];
  27. int len = 0;
  28. while((len = is.read(bytes))!=-1){
  29. System.out.println(new String(bytes,0,len));
  30. }*/
  31. //把is网络字节输入流对象,转换为字符缓冲输入流
  32. BufferedReader br = new BufferedReader(new InputStreamReader(is));
  33. //把客户端请求信息的第一行读取出来 GET /11_Net/web/index.html HTTP/1.1
  34. String line = br.readLine();
  35. System.out.println(line);
  36. //把读取的信息进行切割,只要中间部分 /11_Net/web/index.html
  37. String[] arr = line.split(" ");
  38. //把路径前边的/去掉,进行截取 11_Net/web/index.html
  39. String htmlpath = arr[1].substring(1);
  40. //创建一个本地字节输入流,构造方法中绑定要读取的html路径
  41. FileInputStream fis = new FileInputStream(htmlpath);
  42. //使用Socket中的方法getOutputStream获取网络字节输出流OutputStream对象
  43. OutputStream os = socket.getOutputStream();
  44. // 写入HTTP协议响应头,固定写法
  45. os.write("HTTP/1.1 200 OK\r\n".getBytes());
  46. os.write("Content-Type:text/html\r\n".getBytes());
  47. // 必须要写入空行,否则浏览器不解析
  48. os.write("\r\n".getBytes());
  49. //一读一写复制文件,把服务读取的html文件回写到客户端
  50. int len = 0;
  51. byte[] bytes = new byte[1024];
  52. while((len = fis.read(bytes))!=-1){
  53. os.write(bytes,0,len);
  54. }
  55. //释放资源
  56. fis.close();
  57. socket.close();
  58. }catch (IOException e){
  59. e.printStackTrace();
  60. }
  61. }
  62. }).start();
  63. }
  64. //server.close();
  65. }
  66. }

6.网络编程(TCP/IP)TCPServer

  1. import java.io.File;
  2. import java.io.FileOutputStream;
  3. import java.io.IOException;
  4. import java.io.InputStream;
  5. import java.net.ServerSocket;
  6. import java.net.Socket;
  7. import java.util.Random;
  8. public class TCPServer {
  9. public static void main(String[] args) throws IOException {
  10. //1.创建一个服务器ServerSocket对象,和系统要指定的端口号
  11. ServerSocket server = new ServerSocket(8888);
  12. //2.使用ServerSocket对象中的方法accept,获取到请求的客户端Socket对象
  13. while(true){
  14. Socket socket = server.accept();
  15. /*
  16. 使用多线程技术,提高程序的效率
  17. 有一个客户端上传文件,就开启一个线程,完成文件的上传
  18. */
  19. new Thread(new Runnable() {
  20. //完成文件的上传
  21. @Override
  22. public void run() {
  23. try {
  24. //3.使用Socket对象中的方法getInputStream,获取到网络字节输入流InputStream对象
  25. InputStream is = socket.getInputStream();
  26. //4.判断d:\\upload文件夹是否存在,不存在则创建
  27. File file = new File("d:\\upload");
  28. if(!file.exists()){
  29. file.mkdirs();
  30. }
  31. /*
  32. 自定义一个文件的命名规则:防止同名的文件被覆盖
  33. 规则:域名+毫秒值+随机数
  34. */
  35. String fileName = "itcast"+System.currentTimeMillis()+new Random().nextInt(999999)+".jpg";
  36. //5.创建一个本地字节输出流FileOutputStream对象,构造方法中绑定要输出的目的地
  37. //FileOutputStream fos = new FileOutputStream(file+"\\1.jpg");
  38. FileOutputStream fos = new FileOutputStream(file+"\\"+fileName);
  39. //6.使用网络字节输入流InputStream对象中的方法read,读取客户端上传的文件
  40. int len =0;
  41. byte[] bytes = new byte[1024];
  42. while((len = is.read(bytes))!=-1){
  43. //7.使用本地字节输出流FileOutputStream对象中的方法write,把读取到的文件保存到服务器的硬盘上
  44. fos.write(bytes,0,len);
  45. }
  46. //8.使用Socket对象中的方法getOutputStream,获取到网络字节输出流OutputStream对象
  47. //9.使用网络字节输出流OutputStream对象中的方法write,给客户端回写"上传成功"
  48. socket.getOutputStream().write("上传成功".getBytes());
  49. //10.释放资源(FileOutputStream,Socket,ServerSocket)
  50. fos.close();
  51. socket.close();
  52. }catch (IOException e){
  53. System.out.println(e);
  54. }
  55. }
  56. }).start();
  57. }
  58. //server.close();
  59. }
  60. }

6.网络编程(TCP/IP)TCPClient

  1. import java.io.FileInputStream;
  2. import java.io.IOException;
  3. import java.io.InputStream;
  4. import java.io.OutputStream;
  5. import java.net.Socket;
  6. public class TCPClient {
  7. public static void main(String[] args) throws IOException {
  8. //1.创建一个本地字节输入流FileInputStream对象,构造方法中绑定要读取的数据源
  9. FileInputStream fis = new FileInputStream("c:\\1.jpg");
  10. //2.创建一个客户端Socket对象,构造方法中绑定服务器的IP地址和端口号
  11. Socket socket = new Socket("127.0.0.1",8888);
  12. //3.使用Socket中的方法getOutputStream,获取网络字节输出流OutputStream对象
  13. OutputStream os = socket.getOutputStream();
  14. //4.使用本地字节输入流FileInputStream对象中的方法read,读取本地文件
  15. int len = 0;
  16. byte[] bytes = new byte[1024];
  17. while((len = fis.read(bytes))!=-1){
  18. //5.使用网络字节输出流OutputStream对象中的方法write,把读取到的文件上传到服务器
  19. os.write(bytes,0,len);
  20. }
  21. /*
  22. 解决:上传完文件,给服务器写一个结束标记
  23. void shutdownOutput() 禁用此套接字的输出流。
  24. */
  25. socket.shutdownOutput();
  26. //6.使用Socket中的方法getInputStream,获取网络字节输入流InputStream对象
  27. InputStream is = socket.getInputStream();
  28. //7.使用网络字节输入流InputStream对象中的方法read读取服务回写的数据
  29. while((len = is.read(bytes))!=-1){
  30. System.out.println(new String(bytes,0,len));
  31. }
  32. fis.close();
  33. socket.close();
  34. }
  35. }

7.字符串中随机选择一个字符python

  1. import random
  2. str1='this_a_string_with_several_characters'
  3. n=random.randint(0,len(str1))
  4. print(str1[n])#返回一个bai字符du串随机位置zhi的字符
  5. strs=['str1','str2','str3','str4','str5','str6']
  6. n=random.randint(0,len(strs))
  7. print(strs[n])#返回一个字符串数组随机位置的字符串

7.字符串乱序python

  1. import random
  2. a = [1,2,3,4,5]
  3. for i in range(10):
  4. random.shuffle(a)
  5. print(a)

7.使用StringBuilder拼接字符串(加速)

  1. public class StringTest {
  2. public static void main(String[] args) {
  3. String str1 = "hello ";
  4. String str2 = "java";
  5. String str3 = str1 + str2 + "!";
  6. String str4 = new StringBuilder().append(str1).append(str2).append("!").toString();
  7. }
  8. // sb.toString() 转换成字符串
  9. }

IDEA OutOfMemoryError: Java heap space

8.查看虚拟机内存占用

  1. Runtime提供3个方法可以获取当前JVM最大可以使用内存、当前JVM已拥有最大内存和剩余未使用内存。这3个内存指的都是JVM堆内存。
  2. Runtime.maxMemory();
  3. Runtime.totalMemory();
  4. Runtime.freeMemory();

java cmd下带包编译带包运行

按住Ctrl点我

java给程序的main()方法传参

Java 类名 参数 参数 参数 ...      注:1.参数为字符串,2.参数数量[0,n]