后端整理(集合框架、IO流、多线程)

1. 集合框架

Java集合类主要有两个根接口Collection和Map派生出来
在这里插入图片描述
Collection派生两个子接口

  1. List
    List代表了有序可重复集合,可以直接根据元素的索引进行访问
  2. Set
    Set代表无序不可重复集合,只能根据元素本身进行访问
    在这里插入图片描述
    Map接口派生
    Map代表的是存储key-value对的集合,可根据元素的key来访问value
    在这里插入图片描述

1.1 List

List集合特点:有索引,可重复,有序
扩容机制

  1. 初始值为10
  2. 如果数组的长度小于需要的最小容量则自动扩容
  3. 扩容到原来的1.5倍

ArrayList
底层通过数组实现,查询快,增删慢,线程不安全
访问数据的时间复杂度是O(1)
LinkedList
底层通过双向 链表实现,查询慢,增删快,线程不安全
访问数据的时间复杂度是O(n)
Vector
List接口的古老实现类。线程安全,执行效率低
扩容机制不同于ArrayList,由1.5倍改成1倍

1.2 Set

1.2.1 HashSet

其底层HashMap,也就是数组+链表+红黑树(JDK8)的结构
HashSet集合特点:无序,不可重复,无索引
扩容机制
HashSet底层也是数组,初始容量为16,当使用了超过0.75,即16*0.75=12时,就会扩大容量为原来的两倍
什么情况下为转为红黑树
当链表长度 >= 8,数组长度 >= 64时,会转为红黑树
LinkedHashSet
继承于HashSet,底层是LinkedHashMap,是一个有序去重集合,线程不安全
有序因为它根据hashCode决定元素的存储位置,同时使用链表来维护元素的次序

1.2.2 TreeSet

TreeSet是SortedSet接口的实现类,底层是红黑树,元素有序
排序方式
自然排序(实现Comparable接口)和 定制排序(Comparator)

1.3 Map

Map集合特点

  1. 键值对(key-value)映射关系
  2. 是单向的一对一关系,即一个键对应一个值
  3. 键不可重复,值可重复
  4. 无序

1.3.1 HashMap

HashMap的底层在jdk7及以前,是数组+链表;jdk8及以后,是数组+链表+红黑树
如何判断重复
先比较hashcode,若相同则使用equals比较插入的值,若值不同,则插入,若值不同,则不插入

2 IO流

IO流的体系
在这里插入图片描述
IO流的四大类

  • 字节输入流: 以内存为基准,把磁盘文件/网络中的数据以字节的形式读入到内存中去
  • 字节输出流: 以内存为基准,把内存中的数据以字节的形式写出到磁盘文件或网络中去
  • 字符输入流: 以内存为基准,来自磁盘文件/网络中的数据以字符的形式读入内存中
  • 字符输出流: 以内存为基准,把内存中的数据以字符的形式写出到磁盘文件或网络中去

2.1 IO流实现文件的上传下载

2.1.1 文件上传

文章引用IO流–文件上传实现(侵删)
文件上传,我们就需要的一个服务器和客户端,两者需要进行通信,两者通信的要素是服务器的IP地址和对应的端口号才能建立连接

  1. 首先开启服务器,并开启一个端口号给客户端进行连接通信
 serverSocket = new ServerSocket(port);
  1. 服务器通过监听端口来进行确定是否有客户端进行访问
socket = serverSocket.accept();
  1. 服务器准备完成,可以与客户端进行通信,首先客户端创立连接
 socket = new Socket(InetAddress.getByName(IP), port);
  1. 连接成功,然后通过IO流进行文件传输,先读取文件,再将文件转为IO流输出(读取是本地读取,输出是输出给服务端)
 //2.然后向服务器发送消息,需要一个输出流os = socket.getOutputStream();//3.读取本地的文件并输出,需要一个输入流is = new FileInputStream("123.txt");
  1. 客户端需要通过一个缓冲区来让文件实现完整的上传和输出,通过一个字节数组,保证整个文件不会因为字符数量的大小导致文件上传失败
   //4.读取文件中的内容并输出,读取文件的内容需要一个字节流,用字节数组来接收byte[] buffer = new byte[1024];//这个字节数组是属于IO流中的缓冲区,int length ;while ((length=is.read(buffer) )!= -1){os.write(buffer,0,length);}
  1. 到这一步,客户端的任务完成了大半,然后就是服务器端的接受操作,与客户端也是大同小异,通过文件字节输入流和文件字节输出流对连接中的数据进行读取和输出
      //1.先创建一个端口号供客户端去连接,其实应该先有一个服务器端口号,那客户端才能连上(怎么创建一个端口号?)serverSocket = new ServerSocket(8099);//2.服务器监听端口号,看端口号是否有客户端连接socket = serverSocket.accept();//3.创建一个输入流和一个输出流,输入流用于接收客户端传来的数据,输出流用于输出is = socket.getInputStream();//在建立起的连接中获取信息os = new FileOutputStream("receive.txt");//这里输出的用的是文件流int len ;byte[] bytes = new byte[1024];while ((len = is.read(bytes)) != -1){os.write(bytes,0,len);}

完整代码实现
客户端

/**客户端*/
public class TcpClient {public static void main(String[] args) {Socket socket = null;OutputStream os = null;FileInputStream is = null;try {//1.客户端要连接服务器,需要创建一个连接,创建连接需要服务器的IP号和对应的端口号socket = new Socket(InetAddress.getByName("127.0.0.1"), 8099);//2.然后向服务器发送消息,需要一个输出流os = socket.getOutputStream();//3.读取本地的文件并输出,需要一个输入流is = new FileInputStream("123.txt");//4.读取文件中的内容并输出,读取文件的内容需要一个字节流,用字节数组来接收byte[] buffer = new byte[1024];//这个字节数组是属于IO流中的缓冲区,int length ;while ((length=is.read(buffer) )!= -1){os.write(buffer,0,length);}} catch (IOException e) {e.printStackTrace();}finally {//5.关闭连接if (is != null){try {is.close();} catch (IOException e) {e.printStackTrace();}}if (os != null){try {os.close();} catch (IOException e) {e.printStackTrace();}}if (socket != null){try {socket.close();} catch (IOException e) {e.printStackTrace();}}}}
}

服务器

/**服务器*/
public class TcpServer {public static void main(String[] args) {ServerSocket serverSocket = null;Socket socket = null;InputStream is = null;FileOutputStream os =null;try {//1.先创建一个端口号供客户端去连接,其实应该先有一个服务器端口号,那客户端才能连上(怎么创建一个端口号?)serverSocket = new ServerSocket(8099);//2.服务器监听端口号,看端口号是否有客户端连接socket = serverSocket.accept();//3.创建一个输入流和一个输出流,输入流用于接收客户端传来的数据,输出流用于输出is = socket.getInputStream();//在建立起的连接中获取信息os = new FileOutputStream("receive.txt");//这里输出的用的是文件流int len ;byte[] bytes = new byte[1024];while ((len = is.read(bytes)) != -1){os.write(bytes,0,len);}} catch (IOException e) {e.printStackTrace();}finally {if (os != null){try {os.close();} catch (IOException e) {e.printStackTrace();}}if (is != null){try {is.close();} catch (IOException e) {e.printStackTrace();}}if (socket != null){try {socket.close();} catch (IOException e) {e.printStackTrace();}}if (serverSocket != null){try {serverSocket.close();} catch (IOException e) {e.printStackTrace();}}}}
}

2.1.2 文件下载

文章引用利用io流下载文件(侵删)

public void download(HttpServletRequest request, HttpServletResponse response) {InputStream fis=null;OutputStream toClient=null;try {//获取下载的路径File file=new File("C:\\Users\\kinggao1\\Desktop\\工作周总结.docx");//获取文件名String filename=file.getName();//取得文件的后缀名String ext=filename.substring(filename.lastIndexOf(".")+1).toUpperCase();//以流的形式下载文件fis=new BufferedInputStream(new FileInputStream(file));System.out.println("文件大小:"+fis.available());//创建一个和文件一样大小的缓存区byte[] buffer=new byte[fis.available()];//读取流fis.read(buffer);//清空首部空白行response.reset();//设置文件下载后的指定文件名response.addHeader("Content-Disposition", "attachment;filename=" + new String(filename.getBytes("gb2312"),"ISO8859-1"));response.addHeader("Content-Length", "" + file.length());//response.getOutputStream() 获得字节流,通过该字节流的write(byte[] bytes)可以向response缓冲区中写入字节,再由Tomcat服务器将字节内容组成Http响应返回给浏览器。toClient = new BufferedOutputStream(response.getOutputStream());response.setContentType("application/octet-stream");//将buffer 个字节从指定的 byte 数组写入此输出流。toClient.write(buffer);//刷新此缓冲的输出流。这迫使所有缓冲的输出字节被写出到底层输出流中。 把缓存区的数据全部写出toClient.flush();} catch (IOException e) {e.printStackTrace();} finally {try {//关闭流fis.close();//关闭缓冲输出流toClient.close();} catch (IOException e) {e.printStackTrace();}}}

2.2 IO流实现文件上传时限制文件大小

获取文件IO流的大小

long fileLenght = getFileLenght(file);

再和给定大小判断
如果超出就跑出自定义异常

3 线程

3.1 4种线程的创建方法

  1. 继承Thread方法,实现run方法
  2. 实现Callable接口,重写call方法
  3. 实现Runnable接口,重写run方法
  4. 线程池构建线程

3.2 线程的状态

在这里插入图片描述

3.3 自定义线程池的核心参数

  1. 核心线程数
  2. 最大线程数
  3. 最大存活时间
  4. 最大存活时间单位
  5. 阻塞队列
  6. 线程工厂
  7. 拒绝策略

拒绝策略有四种:

  • 抛出异常
  • 把处理返回给调用者,谁调用谁处理
  • 直接拒绝
  • 清理掉最早的线程,再加入新建的线程

3.4 锁

文章参考于阿里面试失败后,一气之下我图解了Java中18把锁

3.4.1 悲观锁

悲观锁相当与生活中悲观的人,什么事都会忘坏的方向思考
具体来说,就是一个共享数据加了悲观锁,那么线程每次想要操作数据时,都会考虑数据可能也会被其他线程操作,所以每次操作前都会上锁,这样别的线程想要操作这个数据但是没有锁只能够阻塞了
在这里插入图片描述

Java中,synchronized就是一种典型的悲观锁

3.4.2 乐观锁

与悲观锁相反,乐观锁相当于生活中的一个乐观的人,什么事情都会往好的方向进行思考
所以,乐观锁在操作数据时不会给共享数据上锁,但是会在更新的时候判断在此期间是否会有其他线程对数据进行了更新
在这里插入图片描述

乐观锁可以使用<font color="pink"版本号机制和CAS算法实现,在Java语言中 java.util.concurrent.atomic 包下的原子类就是使用CAS乐观锁实现的

两种锁的使用场景
乐观锁适用于冲突小(可以理解为读多写少)的场景,因为不用上锁,释放锁,省去了锁的开销,从而提升了吞吐量
悲观锁适用于写多读少的场景,冲突比较严重,线程竞争比较激烈,使用乐观锁就是导致线程不断的进行重试,这样还可能降低了性能

3.4.3 互斥锁

互斥锁是独占锁的一种常规实现,是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排他性
在这里插入图片描述

互斥锁一次只能一个线程拥有互斥锁,其他线程只有等待。

3.4.4 自旋锁

自旋锁是指线程在没有获得锁资源时不是直接挂起,而是执行一个忙循环,这个忙循环就是所谓的自旋
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/76739.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据结构 二叉树(C语言实现)

绪论 雄关漫道真如铁&#xff0c;而今迈步从头越。 本章将开始学习二叉树&#xff08;全文共一万两千字&#xff09;&#xff0c;二叉树相较于前面的数据结构来说难度会有许多的攀升&#xff0c;但只要跟着本篇博客深入的学习也可以基本的掌握基础二叉树。 话不多说安全带系好&…

在windows下安装ruby使用gem

在windows下安装ruby使用gem 1.下载安装ruby环境2.使用gem3.gem换源 1.下载安装ruby环境 ruby下载地址 选择合适的版本进行下载和安装&#xff1a; 在安装的时候&#xff0c;请勾选Add Ruby executables to your PATH这个选项&#xff0c;添加环境变量&#xff1a; 安装Ruby成…

二进制安装K8S(单Master集群架构)

目录 一&#xff1a;操作系统初始化配置 1、项目拓扑图 2、服务器 3、初始化操作 二&#xff1a; 部署 etcd 集群 1、etcd 介绍 2、准备签发证书环境 3、master01 节点上操作 &#xff08;1&#xff09;生成Etcd证书 &#xff08;2&#xff09;创建用于存放 etcd 配置文…

.Net6 Web Core API --- Autofac -- AOP

目录 一、AOP 封装 二、类拦截 案例 三、接口拦截器 案例 AOP拦截器 可开启 类拦截器 和 接口拦截器 类拦截器 --- 只有方法标注 virtual 标识才会启动 接口拦截器 --- 所有实现接口的方法都会启动 一、AOP 封装 // 在 Program.cs 配置 builder.AddAOPExt();//自定义 A…

企业电子招标采购系统源码Spring Boot + Mybatis + Redis + Layui + 前后端分离 构建企业电子招采平台之立项流程图 tbms

&#xfeff; 项目说明 随着公司的快速发展&#xff0c;企业人员和经营规模不断壮大&#xff0c;公司对内部招采管理的提升提出了更高的要求。在企业里建立一个公平、公开、公正的采购环境&#xff0c;最大限度控制采购成本至关重要。符合国家电子招投标法律法规及相关规范&am…

Spring IOC

◆ 传统Javaweb开发的困惑 ◆ IoC、DI和AOP思想提出 ◆ Spring框架的诞生 Spring | Home IOC控制反转&#xff1a;BeanFactory 快速入门 package com.xiaolin.service.Impl;import com.xiaolin.dao.UserDao; import com.xiaolin.service.UserService;public class UserServic…

论文浅尝 | 预训练Transformer用于跨领域知识图谱补全

笔记整理&#xff1a;汪俊杰&#xff0c;浙江大学硕士&#xff0c;研究方向为知识图谱 链接&#xff1a;https://arxiv.org/pdf/2303.15682.pdf 动机 传统的直推式(tranductive)或者归纳式(inductive)的知识图谱补全(KGC)模型都关注于域内(in-domain)数据&#xff0c;而比较少关…

Java版本spring cloud + spring boot企业电子招投标系统源代码 tbms

​ 功能模块&#xff1a; 待办消息&#xff0c;招标公告&#xff0c;中标公告&#xff0c;信息发布 描述&#xff1a; 全过程数字化采购管理&#xff0c;打造从供应商管理到采购招投标、采购合同、采购执行的全过程数字化管理。通供应商门户具备内外协同的能力&#xff0c;为…

【机器学习】Overfitting and Regularization

Overfitting and Regularization 1. 过拟合添加正则化2. 具有正则化的损失函数2.1 正则化线性回归的损失函数2.2 正则化逻辑回归的损失函数 3. 具有正则化的梯度下降3.1 使用正则化计算梯度&#xff08;线性回归 / 逻辑回归&#xff09;3.2 正则化线性回归的梯度函数3.3 正则化…

PyTorch中加载模型权重 A匹配B|A不匹配B

在做深度学习项目时&#xff0c;从头训练一个模型是需要大量时间和算力的&#xff0c;我们通常采用加载预训练权重的方法&#xff0c;而我们往往面临以下几种情况&#xff1a; 未修改网络&#xff0c;A与B一致 很简单&#xff0c;直接.load_state_dict() net ANet(num_cla…

小鱼深度产品测评之:阿里云容器服务器ASK,一款不需购买节点,即可直接部署容器应用。

容器服务器ASK测评 1、引言2、帮助文档3、集群3.1集群列表3.1.1 详情3.1.1.1概览 tab3.1.1.2基本信息 tab3.1.1.4集群资源 tab3.1.1.5 集群日志 tab3.1.1.6 集群任务 tab 3.1.2 应用管理3.1.2.1 详情3.1.2.2 详情3.1.2.3 伸缩3.1.2.4 监控 3.1.3 查看日志3.1.3.1 集群日志3.1.3…

嵌入式开发学习(STC51-3-点亮led)

内容 点亮第一个led&#xff1b; led闪烁&#xff1b; led流水灯&#xff1b; led简介 led即发光二极管&#xff0c;它具有单向导电性&#xff0c;通过5mA左右电流即可发光&#xff0c;电流越大&#xff0c;其亮度越强&#xff0c;但若电流过大&#xff0c;会烧毁二极管&…

【云原生】k8s组件架构介绍与K8s最新版部署

个人主页&#xff1a;征服bug-CSDN博客 kubernetes专栏&#xff1a;kubernetes_征服bug的博客-CSDN博客 目录 1 集群组件 1.1 控制平面组件&#xff08;Control Plane Components&#xff09; 1.2 Node 组件 1.3 插件 (Addons) 2 集群架构详细 3 集群搭建[重点] 3.1 mi…

快速压缩PDF文件的方法:这两种方法一定要学会!

随着PDF文件的增加&#xff0c;文件大小也会逐渐增大&#xff0c;给共享和存储带来了一定的挑战。为了解决这个问题&#xff0c;本文将介绍几个简单而有效的方法&#xff0c;即压缩PDF文件&#xff0c;以减小文件大小&#xff0c;提高共享和存储的效率。 使用在线压缩工具 在…

Dockerfile定制Tomcat镜像

Dockerfile中的打包命令 FROM &#xff1a; 以某个基础镜像作为此镜像的基础 RUN &#xff1a; RUN后面跟着linux常用命令&#xff0c;如RUN echo xxx >> xxx,注意&#xff0c;RUN 不能用于执行命令&#xff0c;因为每个RUN都是独立运行的&#xff0c;RUN 的cd对镜像中的…

我的128创作纪念日

机缘 写CSDN博客的时候&#xff0c;应该纯属一个巧合&#xff0c;还记得当初是和一个班上的同学一起记录学习笔记&#xff0c;最初是在博客园的平台上记录笔记&#xff0c;可以在以后复习时使用&#xff0c;后来我的同学开始推荐使用CSDN平台&#xff0c;于是我们两就转战CSDN…

第十二届金博奖启动,促进大小企业优势互联

8月3日&#xff0c;由博士科技联合深圳证券交易所、广东博士创新发展促进会共同举办的“走进深交所之国家级专精特新‘小巨人’企业融资路演暨第二十届金博奖启动仪式”成功举办。 华南理工大学教授&#xff0c;俄罗斯工程院外籍院士&#xff0c;广东博士创新发展促进会会长、国…

回归预测 | MATLAB实现基于SVM-RFE-BP支持向量机递归特征消除特征选择算法结合BP神经网络的多输入单输出回归预测

回归预测 | MATLAB实现基于SVM-RFE-BP支持向量机递归特征消除特征选择算法结合BP神经网络的多输入单输出回归预测 目录 回归预测 | MATLAB实现基于SVM-RFE-BP支持向量机递归特征消除特征选择算法结合BP神经网络的多输入单输出回归预测预测效果基本介绍研究内容程序设计参考资料…

Last-Mile Embodied Visual Navigation 论文阅读

论文阅读 题目&#xff1a;Last-Mile Embodied Visual Navigation 作者&#xff1a;JustinWasserman, Karmesh Yadav 来源&#xff1a;CoRL 时间&#xff1a;2023 代码地址&#xff1a;https://jbwasse2.github.io/portfolio/SLING Abstract 现实的长期任务&#xff08;例如…

9.物联网操作系统之软件定时器

一。软件定时器概念及应用 1.软件定时器定义 就是软件实现定时器。 2.FreeRTOS软件定时器介绍 如上图所示&#xff0c;Times的左边为设置定时器时间&#xff0c;设置方式可以为任务设置或者中断设置&#xff1b;Times的右边为定时器的定时相应&#xff0c;使用CalBack相应。 …