Java
Jackmat
Future ByteDance full stack engineer
展开
-
Java数据结构与算法之(二分查找及改动版)
有,如果left或者right的数字很大时,它们相加的数超过了整型的取值范围,它们的二进制数字的首位会被解析成符号位,会导致数字出现负数的情况,这是我们可以使用移位运算符,(left+rigth)>>>1,这里的>>>是无符号右移,我们将二进制位往右移动时,无论正负,都在高位插入0。因为如果是left原创 2023-03-28 22:19:45 · 152 阅读 · 0 评论 -
Java中反射(获取class对象的三种方式、利用反射获取构造方法(newInstance)、成员变量(set、get)、成员方法(invoke)、反射的作用、两个小练习、动态代理)
以上我们都是通过获取class对象获取的,所以怎样能获得class对象呢?利用我们反射,我们可以直接改变文件中的内容来改变。动态代理:。练习一:。原创 2023-03-28 11:59:51 · 248 阅读 · 0 评论 -
Java中配置文件(Properties(store、load))
Properties具有Map结合的一切方法。原创 2023-03-28 10:19:33 · 192 阅读 · 0 评论 -
Java中IO流小练习
这里的index指的是正则表达式中的组号。原创 2023-03-27 18:20:25 · 127 阅读 · 0 评论 -
Java中网络编程小练习(包含控制台版聊天室)
我们只需要在服务端利用工具类UUID为我们生成唯一文件ID就可以了。注意:此时浏览器为客户端,我们的Java代码就执行服务端。接上题,我们想要解决文件名重复的问题。我们这里只需改变上面服务端的代码即可。练习二:(需要结束标记)原创 2023-03-27 18:19:53 · 118 阅读 · 0 评论 -
Java中网络编程(TCP传输、解决传输乱码问题、三次握手、四次挥手)
但是我们发现当我们想要发送中文会出现乱码现象(由于在UTF-8中,一个中文占据三个字节,而我们读取的时候是一个字节一个字节读取的,所以会出现乱码的情况,我们可以利用转换流来转化,进而使用缓冲流提高效率),那我们应该如何解决呢?原创 2023-03-26 16:14:43 · 739 阅读 · 0 评论 -
Java中网络编程(网络编程三要素、getByName、getHostName、getHostAddress、UDP发送数据和接收数据、简易聊天室、UDP的三种通信方式(单播、组播、广播))
获取ip地址和主机名的方法:(gerByName(可以是主机名或者ip地址)、getHostName()、getHostAddress())但是如果想要达到聊天室的效果应该怎么办呢?(我们可以设置一个程序可以多次运行)广播:(广播只需把单播的ip参数改为255.255.255.255)ipv6:(因为ipv4不够使用,所以ipv6出现了)UDP的三种通信方式:(单播、组播、广播)选择上面的第一个选项,点击OK就可以了。我们前面实现的一对一的发送方式实际上就是。,接下来我们来实现组播和广播。原创 2023-03-26 15:19:51 · 381 阅读 · 0 评论 -
Java中线程池(自定义线程池)
我们实际使用时,创建多大的线程池合适呢?(cpu密集型运算:项目中计算比较多;I/O密集运算:项目中读取文件或者读取数据库的操作比较多)。由于我们也无法知道cpu计算时间和等待时间,我们可以通过threa dump工具类来获取cpu计算时间+等待时间。此处的最大并行数指的是cpu的线程数,我们可以利用方法来查看Java可用的处理器数目。原创 2023-03-25 19:01:53 · 246 阅读 · 0 评论 -
Java中多线程小练习
注意此处我们想要获得两个奖池中的最大奖金,那么必然要获得两个奖池中各自的最大奖金,来进行比较,所以我们要获得线程的结果,所以此处我们使用实现多线程的第三种方法,实现Callable接口,在main方法中获得线程管理者的对象,再来获取数据。原创 2023-03-25 13:19:13 · 182 阅读 · 0 评论 -
Java中线程安全的问题(同步代码块、同步方法、Lock锁(lock、unlock)、死锁、生产者和消费者(wait、notify、notifyAll)、阻塞队列(put、take)、线程的6种状态)
而此时打印厨师做了一碗面和面条的字样处于锁的外面,因此它们将会抢占cpu的执行权,它们运行的概率是随机的。注意此处可能会出现打印多次 厨师做了一碗面和面条的字样,因为。注意此处锁对象我们可以传递当前类的字节码,因为字节码是唯一的。我们发现这样的锁全是自动的,那有没有办法可以手动设置锁呢?此时我们可以利用同步代码块将操作共享数据的代码锁起来。当锁镶套时,有可能出现死锁现象。那是因为线程执行时,有随机性。我们通过上面的代码发现,(造成线程安全问题)原创 2023-03-24 15:20:16 · 197 阅读 · 0 评论 -
Java中多线程(实现方式:继承Thread类、实现Runnable接口、利用Callable接口和Future接口、setPriority、setDaemon、yield、join)
细节二:如果我们要给线程设置名字,可以使用set方法进行设置,也可以利用构造方法进行设置,但由于我们创建的是Thread类的子类对象,因此我们需要自己手动使用supre关键字调用父类的有参构造。细节:当JVM虚拟机启动之后,会自动启动多条线程,其中有一条线程就是main线程,它的作用就是去调用main方法,并执行里面的代码,在以前,我们写的所有的代码,其实都是运行在main线程当中。细节一:如果没有设置线程名称,将会使用线程默认的名字(格式Thread-x,x为序号,从0开始),最低为1,最高为10)原创 2023-03-23 21:43:41 · 287 阅读 · 2 评论 -
Java中IO工具包Commons-io、Hutool
【代码】Java中IO工具包Commons-io、Hutool。原创 2023-03-18 18:46:44 · 144 阅读 · 0 评论 -
Java中打印流(printStream、printWriter)与压缩流(ZipInputStream(getNextEntry)、ZipOutputStream(putNextEntry))
字节打印流构造方法以及其成员方法。字符打印流构造方法以及其成员方法。原创 2023-03-17 22:27:12 · 218 阅读 · 0 评论 -
Java中序列化流(读取对象)(ObjectOutputStream:writeObject)、反序列化流(ObjectInputStream:readObject)
当我们利用反序列化流将数据写出文件中时,此时改变JavaBean的成员变量的数量时,在利用序列化流写入时,会出现序列化号不同的情况,从而代码会报错。利用反序列化流读取数据(注意读取时需要让JavaBean类实现Serializable接口)那么我们如何解决这种问题呢?利用序列化流写出数据。原创 2023-03-16 14:47:29 · 293 阅读 · 0 评论 -
Java中转换流(InputStream、OutputStream、Reader、Writer)
JDK11后可以使用FileReader来指定字符集进行读取。在JDK11后同样可以使用FileWrite来进行替换。原创 2023-03-16 13:24:32 · 258 阅读 · 0 评论 -
Java中缓冲流小练习
练习一:method1:method2:method3:method4:练习二:方法一:方法二:练习三:原创 2023-03-15 15:06:13 · 129 阅读 · 0 评论 -
Java中字节缓冲流(readLine)、字符缓冲流(newLine)
通过我们之前的学习,我们知道在基本流中的字符输入输出流中就有一个自带8192的缓冲区。如果需要续写,需要打开缓冲流中的字符缓冲流的续写开关。利用缓冲字符输入流循环读取数据。利用缓冲字符输出流写入数据。原创 2023-03-15 13:13:41 · 692 阅读 · 0 评论 -
Java中字节流与字符流小练习
那怎么样才能达到加密和解密的效果呢?(我们可以使用^符号)那么如果我们利用stream流如何来实现呢?细节二:文件中不要添加bom头。细节一:文件中的数据不要换行。原创 2023-03-14 11:15:51 · 140 阅读 · 0 评论 -
Java中字符流(FileReader(read、close)、FileWriter(write、close)、字符(输入、输出)流原理解析)
当我们创建了FileWriter对象时,会清空文件中的代码,但是此时,我们知道在读取数据时,会创建缓冲区,此时缓冲区中的数据还没有被清空,在下面循环读取打印数据时,还是可以打印出数据值,因为。在前面我们指导,字节输出流和字符输出流的本质区别是,字节输出流一次只能操作一个字节,如果让其写入汉字,将会出现乱码。当缓冲区装满了,或者使用了flush方法、close方法时,将会自动地将缓冲区中的数据写入目的地。question1:那如果文件中有超过8192字节的数据时,缓冲区会是什么场景?此时的数据来源于缓冲区。原创 2023-03-11 16:34:28 · 870 阅读 · 0 评论 -
Java中IO流之文件拷贝(利用FileInputStream、FileOutputStream)
第一次读取时,由于字节数组长度为2,所以读到两个字符,第二次读取,还是读到两个字符,第三次读取时,读到一个字符,字符数组会覆盖第二次读取到的cd中的c,因此打印数组会打印出ed,第四次读取,由于没有字符了,会读到-1,打印数组还是ed。之前的代码中我们都选择使用抛出异常,那么如果我们要使用try……finally来处理应该怎。我们发现这样释放资源的代码会冗余,那么我们怎么样才能解决呢。上面的文件拷贝只适用于文件大小比较小的时候,因为每循环一次只会读写一个字节。那么有什么方法可以一次读多个字节呢?原创 2023-03-10 21:27:48 · 282 阅读 · 0 评论 -
Java中IO流中字节流(FileInputStream(read、close)、FileOutputStream(write、close、换行写、续写))
时,使用FileOutputStream对象调用write方法时,会清空文本文件中的数据,达到重写的效果,那么我们怎么样能达到续写的目的呢?FileInputStream:操作本地文件的字节输入流,可以把本地文件中的数据读取到程序中来。FileOutputStream:操作本地文件的字节输出流,可以把程序中的数据写到本地文件中。如果不释放资源,Java会占用被写入的文件的资源,使其无法进行其他操作。②写数据(在路径的地方开始写数据)那是因为每循环一次,指针将会移动两位,将会跳过我们想要读取的数据。原创 2023-03-10 14:41:41 · 861 阅读 · 0 评论 -
J中File(isDirectory、isFile、exists、length、getAbsolutePath、getPath、getName、lastModified、createNewFile)
当代码执行完毕后,再掉用delete(src);,将最外层的src文件夹删除。原创 2023-03-09 13:07:22 · 127 阅读 · 0 评论 -
Java中异常(异常的处理方式(JVM默认的处理方式、自己处理(try……catch……finally)(灵魂四问)、抛出异常(throws、throw))、异常中的常见方法、小练习、自定义异常)
灵魂二问:会写多个catch与之对应(注意点:如果我们要捕获多个异常,这些异常如果存在父子关系的话,那么父类一定要写在下面;在JDK7之后,我们可以在catch中同时捕获多个异常,中间用 | 进行隔开,表示如果出现了A异常或B异常的话,采取同一种处理方案)灵魂一问:会把try里面所有的代码全部执行完毕,不会执行catch里面的代码(注意点:只有当出现了异常才会执行catch里面的代码)灵魂四问:不会执行了。运行时异常:在编译阶段是不需要处理的,是代码运行时出现的异常(代码出错而导致程序出现的问题)原创 2023-03-08 13:08:21 · 746 阅读 · 0 评论 -
Java中方法引用(引用静态方法、引用成员方法(引用其他类的成员方法、引用本类的成员方法、引用父类的成员方法)、引用构造方法、其他调用方式、小练习)
练习2:(第一个方法引用,因为抽象方法的形参是Student类的,所以决定了可以引用Student中的方法,而且形参中只有一个参数,默认被调用的方法是需要无参的成员方法,即getName())抽象方法的形参决定了可以引用哪些类中的方法,例如s是String类的,所以它只能调用String类中的方法,当形参中只有一个参数时,默认被调用的方法需要是无参的成员方法。由于所在的类是main方法所在的类,而类方法含有static关键字,静态方法中没有this关键字,我们只能创建含有main方法的类对象来调用。原创 2023-03-07 11:50:31 · 1344 阅读 · 0 评论 -
Java中stream流练习
1.2.3.原创 2023-03-06 12:41:36 · 111 阅读 · 0 评论 -
Java中stream流(终结方法:forEach、count、toArray、collect(收集到List、Set、Map))
toArray方法:collect方法(收集到List和Set集合中):collect方法(收集到Map集合中):Lambda表达式:原创 2023-03-05 23:00:52 · 395 阅读 · 0 评论 -
J中stream流(中间方法:filter、limit、skip、distinct(依赖hashCode和equals方法)、concat(合并Stream流)、map(转换数据类型、split))
filter:注意点1:中间方法,返回新的Stream流,原来的Stream流只能使用一次,建议使用链式编程。当一个数组中是引用数据类型的数组时,我们也可以使用Stream.of方法来获取Stream流。注意点2:修改Stream流中的数据,不会影响原来集合或者数组中的数据。1.遍历单列集合:(调用继承于Collection中的stream方法)3.遍历数组:(调用Arrays工具类中的stram方法)skip(将要调过元素的个数):获取跳过之后的元素。limit(将要获取元素的个数):获取前几个元素。原创 2023-03-05 16:08:12 · 161 阅读 · 0 评论 -
Java中不可变集合
因为List和Set是单列集合,在底层参数是一个可变参数,而Map集合是一个双列集合,而参数中可变参数只能有一个。我们怎样使Map集合成为不可变集合?(利用Map集合中的ofEntries方法)注意点:设置Map为不可变集合时,参数最多容纳10对键值对,为什么呢?我们可以将键和值看作是一对键值对,参数就可以传递一对键值对。3.利用Map集合中的copyOf方法。原创 2023-03-05 13:25:29 · 109 阅读 · 0 评论 -
Java中集合之工具类之Collections(方法addAll、shuffle等、点名器(基础版))
answer4:在answer3的基础上进行第二轮点名,我们知道我们循环结束后,集合中的元素已经被删除完,所以我们此时需要再定义一个集合,第一个集合每删除一个元素,我们就可以把这个元素添加到第二个元素中,是第二个元素包含了所有第一个集合初始的元素,然后再利用Collections中的addAll方法,将第二个集合的元素添加到第一个集合当中,进行第二次循环。因为,我们程序只写了一次循环,当每次重写启动程序的时候,我们就相当于在内存中重新创建了一个集合,所以还是会点到相同的同学。原创 2023-03-04 10:00:48 · 131 阅读 · 0 评论 -
Java中集合之可变参数
可变参数在本质上是一个数组。可变参数的小细节:1.原创 2023-03-03 21:10:46 · 395 阅读 · 0 评论 -
Java中集合之TreeMap(基于红黑树)
实现Comparable接口和创建集合时传递Comparator比较器对象,指定比较规则,可参考我的TreeSet文章,answer1:计算字符串中各字符出现的次数。原创 2023-03-03 20:45:09 · 140 阅读 · 0 评论 -
Java中集合之LinkedList(基于双向链表实现)、迭代器底层原理
迭代器底层原理:原创 2023-03-03 17:03:06 · 163 阅读 · 0 评论 -
Java中利用正则表达式爬虫(带条件的爬取、贪婪爬取、非贪婪爬取)
我们上次讲到,正则表达式有两个作用,一是进行字符串校验,二是爬取文本。贪婪爬取:(在爬取数据的时候尽可能的多获取数据)今天,我们来讲利用正则表达式爬取文本。原创 2023-03-03 10:27:33 · 651 阅读 · 0 评论 -
学生管理系统(Java版)(普通版(增删改查)、增强版(登录、注册、忘记密码))
增部分:(在增加前,我们要判断id的唯一性,因此我们可以遍历ArrayList数组,再调用String的equals方法,进行判断)删部分:(在删之前我们同样需要判断id的唯一性)在学生管理系统增强版中,我们首先是实现注册功能。学生管理系统分为四个部分:增删改查。原创 2023-03-02 15:03:36 · 469 阅读 · 2 评论 -
Java中集合之HashMap、LinkedHashMap
answer1:将学生的信息存储在HashMap中,当两个同学的姓名和年龄相同时,我们就视为是一个同学,因为在HashMap存储的是自定义类型Student类,所以我们要在Student类中重写HashCode方法和equals方法(因为此处我们想要比较的是两个对象的属性值,但原本的两个属性值相同的对象,hashCode值会不相同,但此处我们想要将它们视为一个对象,所以我们要重写Student类中的hashCode方法和equals方法,用于比较对象的属性值,此时哈希值就会相同)原创 2023-02-28 20:35:20 · 328 阅读 · 0 评论 -
J集合Map(方法put、remove、clear、containKey、containValue、isEmpty、size、Map遍历(键找值(get)、键值对(getKe)、Lambda表达式))
2.键值对(将键值对对象放在一个Set集合中,遍历Set集合,取出每一个Entry对象,通过Entry对象的getKey方法和getValue方法获得每一个键和值,将它们打印出来)使用Map集合的方法forEach,forEach是一个接口,传递接口的实现类对象,我们可以使用匿名内部类,然后再使用Lambda表达式进行简化。1.put(在添加数据的时候,如果键不存在,那么直接把键值对对象添加到Map集合当中;将键放在一个Set集合中,遍历Set集合,通过。通过键找到值,进行遍历,并将键和值打印出来)原创 2023-02-28 14:28:07 · 186 阅读 · 0 评论 -
J集合Set(HashSet(重写HashCode、equals比较对象的属性值)、LinkedHashSet、TreeSet(实现Comparable、创建对象时传递Comparator比较器))
哈希值:对象的整数表现形式(没有重写hashcode方法,不同的对象hashcode值不相同;重写了hashcode方法,不同的对象属性值相同,hashcode值相同)LinkedHashSet继承于HashSet,底层数据结构是哈希表和双向链表,因而我们存入数据和取出数据的顺序是一样的,即是有序的。因为在JDk8以后,新元素直接挂在老元素后面,所以无法确定其中的数据是第几个存入的,因而存和取的顺序不一样。因为在JDK8以后,HashSet是由数组+链表+红黑树组合而成的,不好规定数据的索引。原创 2023-02-27 14:32:02 · 391 阅读 · 0 评论 -
Java之数据结构(栈、队列、数组、链表、二叉树(任意结点的度<=2)、二叉查找树、平衡二叉树(左旋、右旋、前序遍历、中序遍历、后序遍历、层序遍历)、红黑树(红黑规则))
8.红黑树(是一颗二叉查找树,但是不是高度平衡的,条件:特有的红黑规则)(红黑树增删改查的处理性能很好)2.左右(当根节点左子树的右子树有节点插入)(先局部左旋,再整体右旋)4.右左(当根节点右子树的左子树有节点插入)(先局部右旋,再整体左旋)②中序遍历(获取到的数据从小到大排列)(当前节点在中间获取)①确定支点:从添加的节点开始,不断的往父节点找不平衡的节点。1.左左(当根节点左子树的左子树有节点插入)(一次右旋)3.右右(当根节点右子树的右子树有节点插入)(一次左旋)①前序遍历(当前节点在最前面获取)原创 2023-02-26 13:30:21 · 135 阅读 · 0 评论 -
Java中泛型(泛型类、泛型方法、泛型接口、泛型的通配符(? extends E、? super E)(限定类型的范围)(泛型不具备继承性,但是数据具备继承性))
泛型不具备继承性,但是数据具备继承性。原创 2023-02-25 19:31:13 · 186 阅读 · 0 评论 -
Java中集合之List(方法add、remove、set、get、遍历List方式(继承Collection的迭代器、增强for、forEach与Lambda以及独有的普通for循环和列表迭代器))
在调用方法的时候,如果方法出现了重载现象,优先调用,实参和形参类型一致的那个方法。List中的iterator对象中有add方法,可以在循环的过程中就添加元素。原创 2023-02-25 09:16:47 · 233 阅读 · 0 评论