
java基础
文章平均质量分 50
java基础
DZAXX
这个作者很懒,什么都没留下…
展开
-
(JAVA)-(网络编程)-TCP协议
注意:获取到的是字节流,如果传输中文,可能出现乱码问题,将字节流进行包装成高级流即可,详情可看我之前的IO流文章。2.监听客户端的链接:等待客户端的链接,连接成功返回客户端的Socket对象,没连接则一直等待。参数需要传递要服务端(接收端)的IP和端口,会去链接服务端,服务端连接不上代码会报错。2.服务器向客户端返回一个响应,表示收到客户端请求。3.客户端向服务端再次发出确认消息,连接成功建立。1.客户端向服务端发出连接请求,等待服务器确认。2.客户端创建Socket对象时,连接就建立。原创 2024-01-01 22:49:21 · 466 阅读 · 0 评论 -
(JAVA)-(网络编程)-UDP协议
细节:创建DatagramSocket对象时可以绑定端口号,如果用空参构造的话,就会从可用的端口号中随机选一个进行绑定。我们创建了一个bytes数组用来接收数据包,使用该数组的byte.length长度的字节来接收数据。在寄快递的过程中,我们首先得找快递公司,接着得打包好礼物,然后让快递公司发送包裹,最后付钱走人。需要注意:发送端要发送的ip地址要写广播地址:255.255.255.255。细节:在接收时候一定要绑定端口号,绑定的端口号要跟发送的端口保持一致。1.发送端要发送的ip地址要写组播地址。原创 2023-12-31 23:32:19 · 491 阅读 · 0 评论 -
(JAVA)-(网络编程)-InetAddress(ip)
InetAddress类就表示ip地址,他是一个接口,有两个实现类:Inet4Address和Inet6Address,分别表示IPv4和IPv6.创建对象:此类没有对外提供构造方法,创建ip对象要使用InetAddress类的静态方法getByName()。static InetAddress getByName(String host)//参数可以是IP地址,也可以是主机名称主机名称可以通过"我的电脑->右键空白处点击属性"可以查看。获取了ip对象之后就可以1.通过getHo原创 2023-12-30 23:06:38 · 634 阅读 · 0 评论 -
(JAVA)-(网络编程)-初始网络编程
就像我们使用的淘宝网页版,4399小游戏,都使用的BS架构。用户需要下载客户端,游戏需要的音频,画面文件都在安装包中,用户下载安装后就已经在用户本地了,当用户使用时就不需要把 文件从服务器中传输给客户端,只需要告诉该显示什么东西就可以了。有一个特殊ip:127.0.0.1,也可以是localhost,是回送ip地址,也称本机ip,永远只会寻找当前所在本机,朝这个ip发送消息,在经过网卡时候就会传送回来。画面烂,音质差,因为浏览器中要显示的所有图片,音频资源在本地是没有的,都需要从服务器中用网络传输过来。原创 2023-12-30 22:21:00 · 894 阅读 · 0 评论 -
(JAVA)-(多线程)-线程池
我们首先对Executors工具类进行跟进我们发现创建这个线程池的方法在底层调用了一个 ThreadPoolExecutor类去创建了对象,并且传递了一些参数进去,ThreadPoolExecutor其实就是线程池的类。我们先讲解线程池的运行流程线程池中分为核心线程和临时线程。临时线程倘若经过了一定时间没有处理,就会进行销毁当任务进行提交时,线程池便会创建线程。倘若提交的任务数超过了核心线程数,就会在阻塞队列中进行等待,直到核心线程正在进行的任务完成后再执行。原创 2023-12-29 13:10:58 · 1004 阅读 · 0 评论 -
(JAVA)-(多线程)-线程中的通信(生产者消费者模型)
notifyAll使所有原来在该对象上wait的线程统统退出wait的状态(即全部被唤醒,不再等待notify或notifyAll,但由于此时还没有获取到该对象锁,因此还不能继续往下执行),变成等待获取该对象上的锁,一旦该对象锁被释放(notifyAll线程退出调用了notifyAll的synchronized代码块的时候),他们就会去竞争。使用该方法当前线程进入阻塞状态,同时线程释放锁。下面举一个生产者消费者的例子:(生产者) 厨师是一个线程,能够生产拉面,(消费者)顾客是一个线程,能够吃拉面。原创 2023-12-22 23:46:03 · 424 阅读 · 0 评论 -
(JAVA)-(多线程)-线程的安全问题
让我们先来用一个常见的需求来进行思考:电影院三个窗口共同卖出100张票。我们很容易想到可以用三个线程来模拟三个窗口解决这个问题我们看看结果发现他会有重复的票,甚至有出现超出范围的票,这是因为可能在ticket在自增之后,cpu的执行权随时会被其他线程抢走,而多个线程共享一个ticket变量。为了避免产生这种线程安全问题,提供了三种解决方案。原创 2023-12-21 17:41:02 · 398 阅读 · 0 评论 -
(JAVA)-(多线程)-多线程的生命周期和成员方法
1.sleep方法暂停当前线程后,会进入阻塞状态,只有当睡眠时间到了,才会转入就绪状态;1.我们可以看到,当非守护线程结束后,守护线程没有立马结束,会运行一小段时间,因为在线程退出的一瞬间,守护线程会抢到一小会cpu执行权。jvm中线程的调度是抢占式调度,优先级越高,抢到cpu的概率越大,Java中的线程分为10档,最低是1,不设置默认是5.2.jvm虚拟机启动后会启动多条线程,其中有一条线程就是main线程,作用是调用main方法,并执行里面的代码。细节:当非守护线程结束了,守护线程也会陆续结束。原创 2023-12-21 14:56:39 · 858 阅读 · 0 评论 -
(JAVA)-(多线程)-创建多线程的方式
4.创建Future实现类(FutureTask)对象,将MyCallable对象参数传入。5.创建Thread对象,并将Future实现类对象传入Thread类的构造器中。run:仅仅是被封装被线程执行的代码,直接调用是普通方法,不会启动线程。4.创建Thread对象,并将实现类对象传入Thread类的构造器中。2.实现类去实现Runnable接口中的run抽象方法。5.通过Thread类的对象调用start方法。6.通过Thread类的对象调用start方法。1.创建一个实现Runnable接口的类。原创 2023-12-19 20:12:16 · 371 阅读 · 0 评论 -
(JAVA)-IDEA导第三方包
注意:第三方库中有些名字跟java包中重名,导包时候注意不要导错了。2.将jar包复制,上图中的第一个数字jar包是我们要选择的。5.右键jar包将文件与jar包关联。4.将复制的jar文件粘贴进去。3.模块下新建外包文件。1.下载好第三方的包。原创 2023-12-10 14:32:59 · 402 阅读 · 0 评论 -
(JAVA)-IO-压缩流
压缩包中的每个文件都是一个zipEntry对象,解压本质就是把每一个zipEntry对象按照层级拷贝到本地另一个文件夹中。压缩:把每一个文件|文件夹看成zipEntry对象放入压缩包中。当我们需要传输的文件过大时,就可以先将文件压缩再传输。解压缩流:输入流,读取压缩包中的文件。原创 2023-12-10 13:47:46 · 94 阅读 · 0 评论 -
(JAVA)-IO流-打印流
SYstem.out作用是获取一个打印输出流,由虚拟机创建,不过该输出流是指向控制台的。系统中的标准输出流是不允许关闭的,在系统中是唯一的,关闭无法再启动除非把虚拟机重启。跟字节打印流很像,不过字符流底层有缓冲区,想要自动刷新必须要手动开启。用文件或地址的方式创建字节打印流也会创建一个字节基本流。系统标准输出语句System.out.println。字节流底层没有缓存区,所以开不开自动刷新都一样。打印流是高级流,只能写不能读,只有输出流。只操作文件目的地,不操作数据源。System是系统的一个类。原创 2023-12-09 13:17:52 · 424 阅读 · 0 评论 -
(JAVA)-IO流-序列化流
当对象实现了Serializable接口接口,java会根据类中所有内容计算出一个long类型的版本号,当修改javabaan中的内容产生变化,版本号也会随之变化,跟文件中的版本号不一样。将一个student对象写到文件中,javabean类需要实现Serializable接口,它是一个标记性接口,内部没有方法,实现了这个接口就表示对象能被序列化。2.当我们不想把某个属性序列化到本地文件,可以在变量前面加上关键字 transient关键字。3.序列化流写到文件中的内容是不能修改的,修改就无法读取了。原创 2023-12-09 11:30:29 · 75 阅读 · 0 评论 -
(JAVA)-IO流-转换流
在Java IO流中提供了两个转换流:InputStreamReader 和 OutputStreamWriter,这两个类都属于字符流。假设我们想要将字节流以指定的编码方式转换成字符流,这时候就要用到转换流。JDK11之后FIleWriter方法也能指定编码规则进行读取数据。JDK11之后FIleRead方法也能指定编码规则进行读取数据。之前的文章中讲过,字符流就是字节流+特定的编码方式进行读取数据。构造方法,参数分别指定的是一个基本流和字符集编码规则。转换流是能将字符流和字节流进行转换的一种方式。原创 2023-12-08 21:40:28 · 71 阅读 · 0 评论 -
(JAVA)-缓冲流
读入时首先会将内存中缓冲区大小的数据读入缓冲区中,接着下次读取直接从缓冲区中读取数据,当缓冲区中数据读取完再从内存中读取数据存到缓冲区。写出时同样有个缓冲区进行类似操作,因为内存中读取速度比从硬盘中读取速度更快,达到加速效果。字符缓冲流跟普通的字符流区别不大,因为字符流就自带缓冲区,但是字符缓冲流中有两个特有的方法我们可以学习一下。缓冲流底层自带了8192的缓冲区提高性能,他在原有的流上进行了包装,加上了缓冲效果。第一个构造方法的形参是一个基本流,第二个构造方法的第二个参数是设置的缓冲区的大小。原创 2023-12-08 19:12:50 · 61 阅读 · 0 评论 -
(IAVA)-IO流-编解码,字符输入输出流
为了计算机能对不同文字进行存储,将会使用字符集表对文字进行编码。当前简体中文windows系统默认使用GBK字符集,用的utf-8编码规则。读到文件末尾了返回-1,有参的字符数组把读取,解码,强转合并了,把强转之后的字符放到数组中。1.按字节进行读取,遇到中文一次读取多个字节,读取后解码,返回一个整数。输出流:底层会把数据按照指定编码方式进行编码,变成字节再写到文件中。输入流:一次读多个字节,遇到中文时,一次读多个字节。编码使用的是字符串类的成员方法,解码是构造方法。2.读取后,会解码并转成十进制。原创 2023-12-06 10:52:55 · 100 阅读 · 0 评论 -
(JAVA)-IO流-字节输入输出流
一次读取一个字节,读出来的是Ascll上对应的数字,读到文件末尾了,read方法返回-1。操作文件类型来分:1.字节流: 能操作所有类型的文件 2.字符流:只能操作纯文本文件。一次读取字节数组长度的字节,将读取到的数据放在数组中返回值是本次读取到了几个字节的数据。流的方向来分:1.输出流:程序->文件 2.输入流:文件->程序。2.如果文件不存在会创建一个新的文件,但要保证父级路径是存在的。参数是整数,写到本地文件中的Ascll码对应的码值。3.文件已经存在,构造方法会清空文件。原创 2023-12-05 21:35:09 · 70 阅读 · 0 评论 -
(JAVA)-File
File对象就表示一个路径,可以是文件的路径,也可以是文件夹的路径。这个路径可以是存在的,也可以是不存在的。原创 2023-12-05 20:24:32 · 54 阅读 · 0 评论 -
(JAVA)-异常
1.当出现多个异常,可以用多个catch捕获,对比顺序依上至下,因此父类需要写在子类异常下面,JDK7之后可以使用|符号进行catch中异常对象合并。4.接收成功,则执行catch中对应的代码执行完毕,并执行try-catch体系下面的代码。thhrows写在方法定义处,表示声明一个异常,告诉调用者,使用本方法可能会有哪些异常。throw写在方法内,结束方法,手动抛出异常对象,交给调用者,方法中下面的代码不再执行。(1)把异常的名称,异常原因及异常出现的位置输出在了控制台。如上图,第一行的是异常的信息,原创 2023-12-04 19:52:07 · 392 阅读 · 0 评论 -
(JAVA)-Stream流
2.利用中间方法对流中数据进行操作。1.先得到一条流,并把数据放进去。3.Stream终结方法。原创 2023-11-29 21:02:17 · 50 阅读 · 0 评论 -
(JAVA)-Collections,不可变集合
4.Map中还有一个静态方法copyof,直接将集合当成方法传递进去就可以,如果原本就是不可变集合,将会返回不可变集合,如果原本是普通集合,将会返回一个不可变集合。在List,Set,Map接口中,都存在静态的of方法,可以获取一个不可变的集合。3.Map中有一个静态方法ofEntries,可以创建一个不可变集合。形参是一个可变参数,因此可以将Entriey对象变成一个数组传进去。2.最多只能传20个参数,因为一个函数不能有两个可变参数。当不想让别人修改集合中的内容的时候使用。map不可变集合特点。原创 2023-11-27 23:23:48 · 85 阅读 · 0 评论 -
(JAVA)-可变参数
方法的形参是可以发生变化的,底层原理就是一个数组。2.如果有其它参数,可变参数要写在最后。1.最多只能写一个可变参数。格式:属性类型...名字。原创 2023-11-27 22:22:12 · 57 阅读 · 0 评论 -
(JAVA)-双列集合Map
添加数据时,如果键不存在,那么直接把键值对对象添加到map集合当中返回NULL。方法传递的是一个函数式接口,可以用Lambda表达式简化。如果存在,那么会把原有的值给覆盖,同时把被覆盖的值返回。将entry对象放入set集合,接着遍历set集合。Map是双列集合的顶层接口,他的功能被子类继承。将键取出放入set集合再遍历集合找对应的值。底层:就是用entires。3.forEach方法。原创 2023-11-27 21:52:51 · 54 阅读 · 0 评论 -
(JAVA)-set集合
哈希值是根据hashcoad方法进行计算,默认使用地址值,通常会重写hashcoad方法,利用属性值计算哈希值。如果没有重写,不同对象计算出的值是不一样的,重写了属性相同的对象哈希值相等。小部分情况下,不同属性值或不同地址值计算出的哈希值也可能一样(哈希碰撞)底层仍然是哈希表,多了一个双链表存储顺序,保证存入取出的同序性。上面的是根据哈希值计算出数据在数组中应存入的位置。当系统排序不能满足要求,例如排序字符串时可以使用。底层是红黑树,增删改查性能都较好,可以进行排序。o表示红黑树中已经存在的对象。原创 2023-11-27 12:37:16 · 43 阅读 · 0 评论 -
(JAVA)-泛型
如果没有给集合指定类型,默认所有类型都是objest,在获取数据时,无法使用他的特有行为。当类中的某个变量数据类型不确定时,可以定义带有泛型的类,本类所有方法都能使用。修饰符 返回值类型 方法名(类型 变量名){}java是伪泛型,数据添加到集合里时还是会当成Object类型。指定泛型的具体类型,传递数据时可以添加该类子类类型。只有一个方法形参不确定时,可以定义带有泛型的方法。2.实现类延续泛型,创建对象时候再给出类型。因此泛型在JDK5引入,可以在。不写泛型,默认object类型。原创 2023-11-17 22:14:48 · 54 阅读 · 0 评论 -
(JAVA)-ArrayList,Linklist
1.利用空参创建集合,在底层创建一个集合为0的数组,名字叫elementDate,有一个变量叫size,表示当前有几个元素。4.一次添加多个元素,1.5倍还放不下,则以新创建数组的长度为准。2.添加第一个元素时,底层会创建一个长度为10的数组。addAll方法,一次添加多个数据。add方法,一次添加一个数据。底层数据结构是双链表,查询慢。3.存满时会扩容1.5倍。原创 2023-11-17 20:57:52 · 65 阅读 · 0 评论 -
(JAVA)-List集合方法和遍历
新增hasPrevious方法和previous方法,跟next和hasnext方法一致,不过指针从结尾往前遍历。在索引为index的位置插入元素E,其余元素依次后移。List是一个接口,继承于collection。ListIterator继承于Iterator。修改指定索引元素,返回被修改元素的索引。add方法,可以在迭代时添加元素。删除指定索引元素,并将其返回。有序,有索引,可重复。原创 2023-11-17 19:36:34 · 77 阅读 · 0 评论 -
(JAVA)-collection遍历
1.指针指向末尾还调用next方法会报NoSuchElementException错。JDK5之后出现,底层就是一个Iterator迭代器,可以简化迭代器代码。2.迭代器遍历完成,指针不会复位,想要遍历需要再获取一个迭代器对象。迭代器在java中的类是iterator,是集合专用的遍历方式。4.迭代器遍历时不能用集合方法进行增加删除。3.循环中只能用一次next方法。单列集合和数组才能用增强for。原创 2023-11-17 19:12:15 · 71 阅读 · 0 评论 -
(JAVA)-collection集合
底层是equals方法,所以需要javabean需要重写equals方法。collection是单列集合,是一个接口,单列集合的顶层父接口。原创 2023-11-17 17:06:41 · 59 阅读 · 0 评论 -
(JAVA)-Lambda表达式
有且仅有一个抽象方法的接口叫做函数式接口,接口上方可以注释@Functionalinterface注明。3.如果Lambda表达式的方法体只有一行,大括号,分号,return可以省略不写,需要同时省略。Lambda表达式只能用来简化函数式接口的匿名内部类的写法。2.如果只有一个参数,参数类型可以省略,同时()也可以省略。Lambda表达式可以用来简化匿名内部类的书写。1.参数类型可以省略不写。先来举个例子给大家看看。原创 2023-11-17 16:19:03 · 63 阅读 · 0 评论 -
(JAVA)-包装类
静态方法获取对象进行了优化,内部已经创建了数字[-128,127]的Integer对象,提前放进了数组中,当使用的是这个范围的数字,直接返回系统已经创建好的对象。用一个对象把基本类型数据包起来。不需要调用方法,直接赋值即可。原创 2023-11-11 09:04:56 · 51 阅读 · 0 评论 -
(JAVA) 常用API-正则表达式,爬虫,分组
java.until.regex.Matcher:文本匹配器,按照正则表达式的规则去读取字符串,大串中找符合规则的字串。java.until.regex.Patern:表示正则表达式。爬取的带数字8|11的java,只输出java+数字。爬取的带数字8|11的java,只输出java。能够用来校验字符串是否满足一定的规则。将符合规则的字符用newStr替代。爬取的不带数字8|11的java。贪婪爬取:在爬取尽可能多获得数据。)x可以忽略x的大小写。按照正则表达式规则切割字符串。也可以自动生成正则表达式。原创 2023-11-05 16:44:47 · 72 阅读 · 0 评论 -
(JAVA)常用API-Object
1.因为用了object类中用了protected修饰,所以在书写的时候要重写clone方法,重写的代码中调用父类的克隆方法将结果返回。一般情况下,我们想要的是属性值,所以可以重写父类object中的toString方法。Object是java的顶级父类,所有类都直接或间接的继承与他。当想判断对象中内部的属性值是否相同,需要重写equals方法。结果为包名+类名+地址的形式,跟直接打印对象结果是一样的。1.对象中如果是基本数据类型,存储的是真实的值。2.对象中如果是引用数据类型,存储的是地址值。原创 2023-11-05 14:27:26 · 47 阅读 · 0 评论 -
(JAVA)内部类
这个时候我们就可以使用匿名内部类,不用去写子类和实现类,起到简化代码的作用。1.内部类定义在方法里面就叫局部内部类,局部内部类类似于局部变量,例如不能用public修饰。参数this.a,this是inner对象的地址值,打印的是inner类的20。1.外部类中编写方法,对外提供内部类的对象.可以用父类接收或者直接使用。2.外部类名.内部类名=new外部类名().new内部类名()。外部类要访问内部类的成员,必须要创造内部类对象。在一个类里面创造的一个类,就是内部类。内部类可以访问内部类的成员,包括私有。原创 2023-10-27 20:46:05 · 69 阅读 · 1 评论 -
(JAVA)接口
接口和类是实现关系,关键字implements实现:public class 类名 implements 接口名{}接口是一种规则,是对行为的抽象,想要哪个类拥有一个行为,让类实现对应的接口就行。实现关系,可以单实现,也可以多实现,还可以在继承一个类的同时实现多接口。当一个方法的参数时接口,可以传递接口所有的实现类对象,称为接口多态。如果实现了多个接口,多接口存在同名默认方法,子类必须对该方法重写。如果实现类实现了最下面的子接口,就需要重写所有的抽象 方法。要么重写接口所有的抽象方法,要么是抽象类。原创 2023-10-23 22:20:22 · 110 阅读 · 0 评论 -
(JAVA)抽象类
子类方法 方法体不同时,为了将子类的共性方法格式统一化,强制子类重写方法使用抽象类。4.抽象类的子类要么重写抽象类中的所有抽象方法,要么是抽象类。public abstract 返回值 方法名(参数);2.抽象类中不一定有抽象方法,有抽象方法的类一点是抽象类。public abstract class 类名{}当父类不能确定具体的方法体时,定义为抽象方法。如果一个类中有抽象方法,必须定义成抽象类。1.抽象类不能实例化。原创 2023-10-23 21:34:49 · 51 阅读 · 0 评论 -
(JAVA) 包,final,权限修饰符,代码块
使用其他类时,需要全类名,而使用全类名太繁琐,引入导包的概念(import+包名.类名)static{}-随着类的加载而加载,只触发一次,可以给一些数据做初始化。如果是抽取其他代码的共性代码,不想让外部使用,一般用private修饰。方法是最终方法,不能被重写//一般是规则,不希望别人改变。写在成员位置的代码块,可以把构造方法的共性代码抽取出来。公司域名反写+包的作用,英文小写,见名知意。可以修饰成员变量,成员方法,构造方法,内部类。变量存储的地址值不变,对象的内部可以改变。变量存储的数据值不能发生改变。原创 2023-10-23 21:13:47 · 53 阅读 · 0 评论 -
(JAVA)面向对象三大特征-多态
删掉后,会报错,因为编译看左边,父类中没有变量name。运行的时候也看左边,输出的结果是”动物“当调用show方法时,输出结果是dog-show,调用的是子类的方法。因为虚方法表中子类方法将父类进行覆盖,这也就是说的运行看右边。看以上代码,打印的结果是“动物”,因为变量类型是父类,所以会到父类的存储空间调用name。,因为调用方法时对象找到的虚方法表中的方法被覆盖了。简单来说,多态相当于就是父类类型,多态指的是。变量调用:编译看左边,调用看左边。方法调用:编译看左边,调用看右边。原创 2023-10-22 15:25:51 · 60 阅读 · 1 评论 -
(JAVA)面向对象三大特征-继承
继承指一个对象直接使用另一对象的属性和方法,子类可以拥有父类的所有属性和方法,也可以扩展定义自己特有的属性,增加新方法和重新定义父类的方法。为了便于调用方法,java设立了虚方法表,每个类都有自己的虚方法表,将常用的方法放在里面,继承下去。1.方法的重写:当父类的方法不能满足子类的需求,需要进行方法重写。1.子类能继承父类的成员变量,私有的成员变量和非私有的成员变量都能继承。this:相当于一个形参,在调用方法时候调用,存的方法调用者的地址。2.方法重写的本质是将z虚方法表中的方法进行覆盖自己。原创 2023-10-20 16:59:29 · 76 阅读 · 1 评论 -
(JAVA)static关键字
static表示静态,是JAVA的一个修饰符,可以修饰成员变量(静态变量)和成员方法(静态方法)jvm调用,不用创建对象,类名就可以调用,因为main方法是静态的,所以测试类中的方法也是静态的。例如此项,非静态方法有一个隐藏的关键字this,由虚拟机在调用方法时候给参数赋值。该类的成员对象共享,用来描述对象共同的属性,给对象赋值时可以避免重复赋值。静态方法中没有this,所以不能访问非静态成员变量,静态方法。静态变量随着类的加载而加载,存储在堆中的静态区中。以前用于键盘录入数据,现在没用。原创 2023-10-18 20:23:14 · 76 阅读 · 1 评论