自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(126)
  • 收藏
  • 关注

原创 网络编程(总结)

网络编程(总结)1.1概述地球村:你在西安,你一个美国的朋友!信件:计算机网络:计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统。网络编程的目的:无线电台…传播信息,数据交换。通信想要达到这个效果需要什么:如何准确的定位网络上的一台主机 192.168.16.124 :端口,定位到这个计算机上的某个资源找到这个主机,如何传输数据呢?

2021-03-22 22:14:48 284

原创 多线程-总结(九)

多线程-总结(九)回顾总结线程创建的3种方法import java.util.concurrent.Callable;import java.util.concurrent.ExecutionException;import java.util.concurrent.FutureTask;//回顾总结线程的创建public class ThreadNew { public static void main(String[] args) { new MyThread1

2021-03-19 21:05:49 193

原创 多线程-使用线程池(八)

多线程-使用线程池(八)使用线程池JDK5.0起提供了线程池相关API:ExecutorService和ExecutorsExecutorService:真正的线程池接口。常见子类,ThreadPoolExecutorvoid execute(Runnable command):执行任务/命令,没有返回值,一般用来执行RunnableFuturesubmit(Callable task):执行任务,有返回值,一般用来执行Callablevoid shutdown():关闭连接池Ex

2021-03-19 21:05:16 221

原创 多线程-线程协作(七)

多线程-线程协作(七)生产者消费者模式(不是一个模式,而是一个问题)应用场景:你(消费者),肯德基店(缓存区),炸鸡员(生产者)你去肯德基店买炸鸡,肯德基店下单,炸鸡员就炸鸡,但是如果肯德基店如果已经有炸好的鸡,你就可以直接买走,你就不需要等待,炸鸡员就不用炸鸡,,但是如果肯德基店没有炸好的鸡,就要通知炸鸡员炸鸡,你就要等待。你和炸鸡员就类似两个线程,肯德基店就类似于缓存区,你和炸鸡员就跟肯德基店就会有线程通信。线程通信-分析这是一个线程同步的问题,生成者和消费者共享一个资源,并且

2021-03-19 20:22:20 197

原创 多线程-死锁、Lock(六)

多线程-死锁、Lock(六)死锁:多个线程互相抱着对方需要的资源,然后形成僵持。//死锁:多个线程互相抱着对方需要的资源,然后形成僵持public class DeadLock { public static void main(String[] args) { Makeup g1=new Makeup(0,"灰姑凉"); Makeup g2=new Makeup(1,"白雪公主"); g1.start(); g2.star

2021-03-19 20:17:53 105

原创 多线程-线程同步(五)

多线程-线程同步(五)多线程的形成条件:队列+锁(为了安全)线程同步安全,我们先来看下线程的不安全线程不安全的例子一://不安全的买票//线程不安全,有负数public class UnsafeBuyTicket { public static void main(String[] args) { BuyTicket station=new BuyTicket(); new Thread(station,"苦逼的我").start();

2021-03-18 22:42:44 102

原创 多线程-线程停止、休眠、礼让、观测、优先级、守护(四)

多线程-线程停止、休眠、礼让、观测、优先级、守护(四)线程的五大状态线程停止建议使用线程正常停止建议使用标志位–>设置一个标志位不要使用stop或者destory等过时或者JDK不建议使用的方法//测试stoppublic class TestStop implements Runnable { //1.设置一个标识位 private boolean flag=true; @Override public void run() {

2021-03-18 20:24:58 105

原创 多线程-静态代理、Lambda表达式(三)

多线程-静态代理、Lambda表达式(三)用一个结婚的例子,来实现静态代理对比Thread你:真实对象婚庆公司:代理你,帮你处理结婚的事结婚:都实现结婚接口即可//静态代理模式总结//真实对象和代理对象都要实现同一个接口//代理对象要代理真实角色//好处: //代理对象可以做真实对象做不了的事情 //真实对象专注做自己的事情public class StaticProxy { public static void main(String[] args)

2021-03-18 20:22:36 121

原创 多线程-线程创建(二)

多线程-线程创建(二)线程创建实现方式二:实现runnable接口,重写run方法,执行线程需要丢入runnable接口实现类,调用start方法.//创建线程方式2:实现runnable接口,重写run方法,执行线程需要丢入runnable接口实现类,调用start方法public class TestThread3 implements Runnable { @Override public void run() { //run方法线程体

2021-03-17 21:46:37 85

原创 多线程-线程创建(一)

多线程-线程创建(一)程序:是指令和数据的有序集合,其本身没有任何运行的含义,是一个惊态的概念。进程(Process):是执行程序的一次执行过程,它是一个动态的概念,是系统资源分配的单位。通常在一个进行可以包含诺干个线程,当然一个进行中至少有一个线程,不然没有存在的意义,线程是CPU调度和执行的单位。线程(Thread):线程就是独立的执行路径在程序运行时,即使自己没有创建线程,后台也会有多个线程,如主线程,gc线程;main()称之为主线程,为系统的入口,用于执行整个程序在一个进

2021-03-17 17:15:54 198

原创 IO流-FileUtils的使用(十一)

IO流-FileUtils的使用(十一)FileUtils类中常用的方法:cleanDirectory :清空目录,但不删除目录contentEquals :比较两个文件的内容是否相同copyDirectory :将一个目录内容拷贝到另一个目录。可以通过FileFilter过滤需要拷贝的文件copyFile :将一个文件拷贝到一个新的地址copyFileToDirectory :将一个文件拷贝到某个目录下。copyInputStreamToFile ;将一个输入流的内容拷贝到某个文件。

2021-03-17 10:53:00 2797

原创 IO流-ApacheIO包(十)

IO流-ApacheIO包(十)Apache IO包JDk提供的文件相关的类,但是功能非常的基础,进行复杂操作时需要做大量编程工作。在实际开发中,往往需要你动手编写相关的代码,尤其在遍历目录文件时,非常用到递归,非常繁琐。Apache-commons工具包包提供了IOUtils/FileUtils,可以让我们非常方便的对文件和目录进行操作,本文就是让大家对IOUtils/FileUtils有一个全面的认识。下载与添加commons-io包下载地址: commons-io包下载地址

2021-03-16 21:34:17 252

原创 IO流-随机访问流、File类在IO的作用(九)

IO流-随机访问流、File类在IO的作用(九)RandomAccessFile可以实现两个作用:实现对一个文件做读和写的操作。可以访问文件的任意位置,不像其他流只能按照先后顺序读取。在开发某些客户端软件时,经常用到这个功能强大的可以"任意操作文件内容"的类,比如:软件的使用次数和使用日期,可以通过本类访问文件中保存次数和日期的地方进行比对和修改。java很少开发客户端软件,所以在java开发中这个类用的相对比较少。核心的三个方法:具体的代码实现:import java.

2021-03-16 20:01:14 132

原创 IO流-数据流、对象流(八)

IO流-数据流、对象流(八)数据流数据流将“基本数据类型与字符串类型”只作为数据源。从而允许程序以与机器无关的方式从底层输入输出流中操作java基本数据类型与字符串类型DataInputStream和DataOutputStream提供了可以存取与机器无关的所有java基础类型数据(如:int、double、String等)的方法。数据输出流import java.io.BufferedOutputStream;import java.io.DataOutputStream;impor

2021-03-16 19:59:50 216

原创 IO流-字符输出流、字节数组流(七)

IO流-字符输出流、字节数组流(七)字符输出流在java的IO流中专门提供了用于字符输出的流对象PrintWirter.该对象具有自动刷新缓冲字符输出流,特点是可以按行写出字符,并且可通过println();方法试下你自动换行。import java.io.BufferedReader;import java.io.FileInputStream;import java.io.InputStreamReader;import java.io.PrintWriter;public clas

2021-03-16 19:57:36 230

原创 IO流-转换流(六)

IO流-转换流(六)转换流InputStreamReader/OutputStreamWriter用来实现将字节流转换成字符流。比如:​ System.in是字节流对象,代表键盘的输入,如果我们想按行接收用户时的输入时,就必须用到缓冲字符流BufferedReader特有的方法readLine();但是经过观察会发现在创建BufferedReader特有的构造方法的参数必须是一个Reader对象,这时候我们的转换流InputStreamReader就派上了用场。​ 而System.out也是

2021-03-15 22:29:12 152

原创 IO流-常用流对象(五)

IO流-常用流对象(五)文件字符流前面介绍的文件字节流可以处理所有的文件,如果我们处理的是文本文件,也可以使用文件字符流,它以字符为单位进行操作。文件字符输入流import java.io.FileReader;public class FileReaderDemo { public static void main(String[] args) { FileReader frd=null; try { //创建文件字符输入

2021-03-15 21:09:07 191

原创 IO流-常用流对象(四)

IO流-常用流对象(四)文件字节流FileInputStream通过字节的方式读取文件,适合读取所有类型的文件(图像、视频、文本文件等)。java也提供了FileReader专门读取文本文件。FileOutputStream通过字节 方式写到数据文件中,适合所有类型的文件。java也提供了FileWriter专门写入文本文件。文件字节输入流import java.io.FileInputStream;public class FileStreamDemo { public st

2021-03-15 21:04:47 195

原创 IO流-File的使用(三)

IO流-File的使用(三)File类的作用:File类是java提供的针对磁盘中的文件或目录转换对象的包装类。一个File对象而可以代表一个文件或目录,File对象可以实现获取问价和目录属性等功能,可以实现对文件目录的创建,删除等功能。File类操作目录与文件的常用方法File针对文件操作的方法createNewFile()//创建新文件delete()//直接从磁盘上删除exists()//查询磁盘中的文件是否存在getAbsolutePath()//获取绝对路径getNam

2021-03-15 20:53:28 95

原创 IO流-入门案例(二)

IO流-入门案例(二)第一个简单的IO流程序当程序需要读取数据源的数据时,就会通过IO流对象开启一个通向数据源的流,通过这个IO流对象的相关方法可以顺利读取数据源中的数据。在D盘建立一个a.txt文件,存储abc三个字符具体的实现代码:import java.io.File;import java.io.FileInputStream;public class FirstDemo { public static void main(String[] args) {

2021-03-14 21:47:27 72

原创 IO流的介绍(一)

IO流的介绍(一)什么是IO流对任何程序设计语言而言,输入输出(Input/Output)系统都是非常核心的功能。输入(Input):就是将外部的数据读取到程序当中(以程序为基准,核心含义是“读”);如读取硬盘的文件到程序;读取网络上某个位置内容到程序;读取数据库系统的数据到程序;读取某些硬件系统到程序。输出(Output):在处理数据时,需要将数据写到外部(以程序为基准,核心含义是“写”);如将数据写到硬盘中;将数据写到数据库系统中;将数据写到某些硬件系统中。java.io包为我

2021-03-14 21:06:25 2034 1

原创 容器-Collections工具类(二十一)

容器-Collections工具类(二十一)Collections是一个工具类,它提供了对Set、List、Map进行排序,填充、查找元素的辅助方法,该类中所有的方法都为静态方法。常用方法:对List类型容器进行排序处理import java.util.ArrayList;import java.util.Collections;import java.util.List;public class CollectionsSortTest { public stati

2021-03-14 17:07:47 112

原创 容器-Iterator迭代器(二十)

容器-Iterator迭代器(二十)迭代器:就是为了实现List接口和Set接口的遍历有一个统一的规则。Collection接口继承了Iterator接口,在该接口中包含一个名为iterator的抽象方法,所有实现了Collection接口的实现类对该方法做了具体实现。iterator方法会返回一个Iterator接口类型的迭代器对象,在该对象中包含了三个方法用于实现对单例容器的迭代处理。Iterator对象的工作原理:迭代器的3个方法:boolean hasNext();//判断游

2021-03-14 16:40:59 142

原创 容器-TreeMap容器类(十九)

容器-TreeMap容器类(十九)TreeMap容器类:TreeMap和HashMap同样实现了Map接口,所以,对于API的用法来说是没有任何区别的。HasMap效率高于TreeMap,TreeMap是可以对键进行排序的一种容器,在需要对键排序时,可选用TreeMap.TreeMap底层是基于红黑树实现的。在使用TreeMap时需要给定排序规则:元素自身实现比较规则通过比较器实现规则元素自身实现比较规则创建Users类,给定比较规则import java.util.Objec

2021-03-14 11:53:02 316

原创 容器-HashMap添加元素、数组扩容的底层分析源码(十八)

容器-HashMap添加元素、数组扩容的底层分析源码(十八)我们用map.put(),使用Ctrl+鼠标左键进入源代码,在put()方法中使用Ctrl+Alt选择HashMap接口实现类进入源代码,进行添加元素的分析。进入put()的源代码/** * Implements Map.put and related methods * * @param hash hash for key * @param key the key * @param

2021-03-14 11:16:22 133

原创 容器-HashMap计算Hash值底层源码分析(十七)

容器-HashMap计算Hash值底层源码分析(十七)计算Hash值获得Key对象的hashcode首先调用key对象的hashcode()的方法,获得key的hashcode的值根据hashcode计算出hash值(要求在[0,数组长度-1]区间)hashcode是一个整数,我们需要转化成[0,数组长度-1]的范围,我们要求转换后的hash值尽量均匀的分布在[0,数组长度-1]这个区间,减少“hash冲突”一种极端简单的算法是:hash值=hashcode/hashc

2021-03-13 22:38:13 225

原创 容器-HashMap的底层源码分析(十六)

容器-HashMap的底层源码分析(十六)HashMap 底层是采用了哈希表,这是一个非常重要的数据结构,对于我们以后理解很多技术都非常有帮助。数据结构中由数组和链表来实现对数据的存储,他们各有特点:数组:占用空间连续,寻址容易,查询速度快。但是,增加和删除效率非常低。链表:占用空间不连续,寻址困难,查询速度慢,但是增加和删除效率非常高。我们能不能结合数组和链表的优点呢?答:可以,采用哈希表,哈希表的本质就是“数组+链表”HashMapde的继承结构和主要的成员变量pub

2021-03-13 22:35:48 95

原创 容器-Map接口、HashMap(十五)

容器-Map接口、HashMap(十五)Map接口:定义了双例集合对的存储特征,它并不是Collection接口的子接口。双例集合的存储特征以key与value结构为单位进行存储,体现的是数学中的y=f(x)概念。Map和Collection的区别:Collection中的容器,元素是孤立存在的(理解为单身),向集合中存储元素采用一个元素的方式存储。Map中的容器,元素是成对存在的(理解为现代社会的夫妻),每个元素由键和值两部分组成,通过键可以找对所对应的值Collection中的容器称

2021-03-13 17:13:01 157

原创 容器-单例集合使用案例(十四)

容器-单例集合使用案例(十四)需求:产生1-10之间的随机数([1,10]并区间),将重复的10个随机数放到容器中。使用List类型容器实现import java.util.ArrayList;import java.util.List;public class ListDemo { public static void main(String[] args) { List<Integer> list=new ArrayList<>();

2021-03-13 15:05:24 112

原创 容器-TreeSet容器类(十三)

容器-TreeSet容器类(十三)TreeSet是一个可以对元素进行排序的容器。底层实际是用TreeMap实现的。内部维持了一个简化版的TreeMap,通过Key来存储Set的元素。TreeSet内部需要对存储的元素进行比较,因此需要对存储的元素进行排序比较,因此,我们需要给定排序的规则。排序规则的实现方式:通过元素自身实现比较的方式通过比较器指定比较规则TreeSet的使用,和HashSet实现的方法一样的,因为他们都实现了Set接口。import java.util.Set;

2021-03-13 11:05:30 139

原创 容器-Set接口、HashSet(十二)

容器-Set接口、HashSet(十二)set接口:继承自Collection,Set接口中没有新增的方法,方法和Cellection保持一致。我们在前面通过List学习的方法,在Set中仍然适用。特点:无序,不可重复,无序指Set中的元素没有索引,我们只能遍历查找,不可重复指不予许加入重复的元素。Set常用的实现类有:HashSet、TreeSet等,我们一般使用HashSetHash算法原理:就是通过一个散列公式,对一个数取模运算,剩下来的余数对应的放在一个数组的索引下,如果余数

2021-03-12 21:38:55 124

原创 容器-ListedList删除指定位置元素的源码分析(十一)

容器-ListedList删除指定位置元素的源码分析(十一)根据索引删除元素import java.util.LinkedList;import java.util.List;public class LinkedListTest { public static void main(String[] args) { List<String> list= new LinkedList<>(); //添加元素 list

2021-03-12 19:35:18 215

原创 容器-LinkedList获取元素的源码分析(十)

容器-LinkedList获取元素的源码分析(十)LinkedList获取元素 //获取元素 for (int i=0;i<list.size();i++){ System.out.println(list.get(i)); }真正获取元素的方法是list.get(i);Ctrl+鼠标左键点击get, E get(int index);在用Ctrl+Alt选择get方法的LinkedList接口实现类/**

2021-03-12 16:49:59 314

原创 容器-LinkedList指定位置添加元素的源码分析(九)

容器-LinkedList指定位置添加元素的源码分析(九)LinkedList指定索引位置添加元素public static void main(String[] args) { List<String> list= new LinkedList<>(); //添加元素 list.add("a"); list.add("b"); list.add("c"); list.add(

2021-03-12 16:46:59 1346

原创 容器-ListedList头尾添加元素源码分析(八)

容器-ListedList头尾添加元素源码分析(八)先进入addFirst的源代码System.out.println("------------LinkedList----------"); LinkedList<String> linkedList=new LinkedList<>(); //返回列表的第一个元素(每次的元素,都加在向第一个元素的前面),就是c+b+a linkedList.addFirst("a");

2021-03-12 16:44:09 174

原创 容器-LinkedList源码分析、添加元素(七)

容器-LinkedList源码分析、添加元素(七)我们Ctrl+鼠标左键点击LinkedList对象,看源码。public class LinkedListTest { public static void main(String[] args) { List<String> list= new LinkedList<>(); //添加元素 list.add("a"); list.add("b");

2021-03-12 16:42:22 102

原创 容器-LinkedList容器类(六)

容器-LinkedList容器类(六)LinkedList底层用双向链表。特点:(只要是链表,不管是单向链表、双链表、双向循环链表)都是查询效率低,增删效率高,线程不安全。因为链表是没有索引的,只有节点,比如单向链表是头节点存着下一个节点的地址,一删掉,不用去移动元素,所以增删效率高。数组的特点:查询效率高,增删效率低,因为数组有索引,你只要根据索引一查就能查到,而你要删除一个元素则后面所有的元素都要往前移,所以增删效率低。LinkedList的使用:LinkedList实现了list接口

2021-03-11 22:32:59 136

原创 容器-Stack栈容器(五)

容器-Stack栈容器(五)stack栈容器,是Vector的一个子类,他的标准是:出栈的顺序是后进先出(LIFO:Last In First Out)的栈。通过五个方法对Vector进行扩展。关于栈容器的五个方法:public class StackTest { public static void main(String[] args) { //实例化栈容器 Stack<String> stack=new Stack<&

2021-03-11 21:00:24 326 1

原创 容器-Vector容器类(四)

容器类-Vector容器类(四)Vector底层也是用数组实现的,相关的方法都增加了同步检查,线程安全,效率低Vector容器类和ArrayList容器类的区别就是在线程,ArrayList是线程不安全的,效率高Vector的添加元素,因为都是继承List接口,所以Vector类和ArrayList类的方法都是差不多的,要想了解更多的方法,直接参照Array-list类。public class VectorTest { public static void main(String[

2021-03-11 17:15:17 150

原创 容器-ArrayList底层源码分析(三)

容器-ArrayList底层源码分析(三)ArrayList底层是用数组实现存储的用Ctrl+鼠标右键 点击ArrayList看源码 List<String> a1=new ArrayList<>();//用Ctrl+鼠标右键 点击ArrayList看源码了解ArrayList的继承结构和成员变量,也就是初始化变量。 /** * Constructs an empty list with an initial capacity of ten.

2021-03-11 16:01:04 81

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除