
Java学习笔记
文章平均质量分 65
就是木子呀
这个作者很懒,什么都没留下…
展开
-
Map简单介绍
Map 是 Java 中用于存储键值对的接口,它是一个抽象类,有多个实现类,如 HashMap、TreeMap、LinkedHashMap 等。例如,TreeMap 是基于红黑树实现的有序 Map,而 LinkedHashMap 是基于哈希表和双向链表实现的有序 Map。在 Map 接口中,还定义了一个内部接口 Entry,用于表示键值对。HashMap 是基于哈希表实现的 Map 接口的实现类。Map 接口提供了一系列基本操作方法,如获取大小、判断是否为空、根据键获取值、插入键值对、删除键值对等。原创 2023-08-07 10:57:36 · 115 阅读 · 0 评论 -
HashSet的详细介绍
哈希冲突指的是不同的元素通过哈希函数计算得到相同的哈希值,从而导致它们在哈希表中被映射到相同的数组索引位置。在哈希表中,通过哈希函数将元素映射到数组的索引位置。理想情况下,每个元素都应该通过哈希函数计算得到唯一的哈希值,并被映射到不同的数组索引上,这样可以达到快速的查找和插入操作。然而,在实际情况中,由于哈希函数的计算过程无法避免的会产生冲突。哈希函数的输出空间是有限的,而输入空间是无限的,这就意味着不同的元素可能会产生相同的哈希值。当不同的元素经过哈希函数计算后得到相同的哈希值时,就会发生哈希冲突。原创 2023-08-06 17:35:40 · 2429 阅读 · 0 评论 -
框架的前置学习-反射
JVM在加载一个类的时候,会把这个类的.class字节码文件放在方法区中,栈中放入main方法进行压栈,堆中new出对象c,但是无论使用什么方法获取字节码,一样的class字节码文件只会放一份在方法区中,得到的c变量都是指向方法区中的同一份.class文件。利用得到的字节码获取一个指定的方法,在java里面,由于存在方法的重载,所以区分一个方法是由方法名+方法参数类型,而不仅仅是方法名,所以使用getDeclaredMethod方法需要一个方法名和若干参数的class。原创 2023-08-05 13:56:39 · 169 阅读 · 0 评论 -
Junit单元测试
在类里面定义测试方法,方法名是test+测试的方法名字,返回值是空,参数也是空参数。一般使用断言来判定结果,Assert.assertEquels(期望值,真实值);初始化方法,用于申请资源,所有测试方法执行之前都会执行这个方法。释放资源方法,所有测试方法执行完毕之后都会执行这个方法。给测试方法加上@Test注解,导入Junit依赖环境。定义一个测试类,命名为被测试的类名+Test。Junit单元测试就是白盒测试的一种。原创 2023-08-04 17:59:18 · 166 阅读 · 0 评论 -
网络编程入门
需要注意的是,客户端与服务器的通信必须要使用Socket产生的流对象进行写数据,不能自己创建流对象;构造方法:Socket(String host,int port) 创建一个套接字并将其连接到指定的主机的指定的端口上,其中host是ip,port是端口。Java.net.Socket 实现了客户端套接字,套接字是两台计算机连接的端点,是包含了ip地址和端口号的网络单位。使用Socket对象中的方法getOutputStream() 得到这个Socket对象的网络输出流。原创 2023-08-04 17:20:57 · 322 阅读 · 0 评论 -
java中的序列化和反序列化
使用static关键字和transient关键字修饰的变量不可以被序列化,所以我们如果不想要某个变量被序列化,那么可以使用static或者transient修饰。特别注意的是,这里反序列化的时候,必须要保证序列化的类没有改变过,如果在序列化保存到文件中之后类被修改过了,那么需要重新序列化,否则反序列化会失败。objectInputStream 对象的反序列化流,把文件中保存的对象以流的形式读取出来使用。objectOutputStream 对象的序列化,以流的形式将对象写入文件。原创 2023-08-04 13:25:00 · 93 阅读 · 0 评论 -
java中的缓冲流
创建BufferedInputStream对象,传递FileInputStream对象作为参数,提高FileInputStream读取文件的效率。调用字符缓冲输出流中的flush,把内存缓冲区中的数据刷入文件(可以不使用flush,直接使用close)使用字符缓冲输入流中的read/readLine方法读取文本。调用字符缓冲输出流中的write,把数据写入到内存缓冲区中。创建字符缓冲输出流对象,在构造方法中传递字符输出流。创建字符缓冲输入流对象,构造方法中传递字符输入流。原创 2023-08-04 11:09:09 · 170 阅读 · 0 评论 -
io的异常处理以及properties
String getProperty(String key)通过key来获取对应的value。使用properties对象的store方法,把集合中的临时数据持久化的保存到硬盘中保存。利用properties对象的stringPropertyNames方法获取所有键。使用properties对象的load方法传入FileReader对象。创建字符或者字节输出流对象FileReader,绑定输出文件。利用properties对象的getProperty获取值。创建字符或者字节输出流对象,绑定输出文件。原创 2023-08-03 15:29:45 · 123 阅读 · 0 评论 -
java中的字符流
使用字节流读取中文的时候,如果使用的编码是GBK,则占用2个字节;如果使用UTF-8编码,则占用3个字节,意味着我们读取中文文档的时候如果每次读取1个字节,那么输出的将会是乱码,因为是不完整的中文。FileReader 文件字符输入流 ,继承自InputStreamReader类,InputStreamReader类又继承自Reader类,作用是将硬盘文件中的数据以字符的方式读入内存。Java.io.Reader 字符输入流,是字符输入流的最顶层的父类,定义了一些共性方法,是一个抽象类。原创 2023-08-03 13:00:20 · 121 阅读 · 0 评论 -
java中的字节流
这里的while循环必须要用一个变量来接受读取出来的数据,否则就只能像下面这样写,但是这样写不能正确读出值,因为while循环里的read读取一次之后文件的读取指针就指向下一个字节了,比如12这个字符串,while读取了1,输出语句里面输出的却是2,文件在保存的时候,文件的末尾会有一个结束标记,这个结束标记是不可见的,当指针指向这个结束标记的时候,read方法会返回-1,接着while这里读出的就是-1,导致最后输出的只有1.作用:把内存中的数据写入到硬盘的文件中。作用:把硬盘中的文件读取到内存中使用。原创 2023-08-02 23:23:30 · 153 阅读 · 0 评论 -
File类的学习
public File[] listFiles() 返回一个File类型的数组,里面包含了目录中所有的子文件和目录。public String[] list() 返回一个String类型的数组,里面包含了目录中所有的子文件和目录。public boolean exists() 此File表示的文件或者目录是否真实存在。public String getName() :返回此File表示的文件或目录的名称。public long length() :返回此File表示的文件的长度。原创 2023-08-02 19:07:23 · 374 阅读 · 0 评论 -
等待唤醒机制和线程池
线程池就是一个容纳多个线程的容器,其中的线程可以反复使用,省去了频繁创建线程的时间,减少了不必要的资源消耗。当程序第一次启动的时候,创建多个线程保存到一个集合中,当我们需要使用的时候,再从集合中remove出来使用,使用remove是因为remove之后线程池中就移除了这个线程,而remove的返回值就是我们remove的线程。如果并发的线程数量很多,并且每个线程都是执行一个很短的时间就结束了,这样频繁的创建线程和销毁线程就会大大降低系统的效率,因为创建线程和销毁线程很消耗时间。原创 2023-08-01 18:47:27 · 157 阅读 · 0 评论 -
线程状态
【代码】线程状态。原创 2023-08-01 17:14:55 · 112 阅读 · 0 评论 -
线程安全
main方法中开启三个线程之后,哪个线程抢到了cpu执行权,哪个就先执行run方法,这个时候加入线程1抢到了执行权,那么线程1就会进入到synchronized代码块之前,然后先检查代码块是否有锁对象,如果有,就会获取锁对象,如果没有,就会阻塞等待拿到锁对象,之后执行代码块。同步锁是一个任意的对象,但是要保证几个线程使用的对象是同一个,为了保证是同一个对象并且不占用更多的内存,我们可以使用this对象,this是调用当前run方法的对象。锁对象的作用是同时只让一个线程执行同步代码块里的代码。原创 2023-08-01 16:20:30 · 117 阅读 · 0 评论 -
线程的学习
先获取当前正在执行的线程,再使用线程的方法getName()也可以拿到名称,static Thread currentThread()可以获取到正在执行的线程。在多线程的程序中,一个程序可以分为多个线程,一个线程占用一片栈内存,每新开一个线程,就是JVM新开了一片栈内存给我们执行程序,执行完毕之后回收。在单线程的时候,一个程序就是在一个栈里面执行方法,所有的方法不断地在栈内存中压栈出栈,执行的速度慢。首先设置构造函数,一个无参构造,一个有参构造,有参构造里面调用父类的有参构造。设置一个实现类的实例对象。原创 2023-07-31 21:59:06 · 470 阅读 · 0 评论 -
多线程基础
进程:指的是一个内存中运行的应用程序,每个进程都有一个独立的运行空间,一个应用程序可以独立运行多个进程,进程也是程序的一次执行过程,是系统运行程序的基本单位;如果测试之后发现并不是交替执行,这可能是你的电脑执行速度的原因,你可以把run方法里面的循环执行次数增大,比如增大到100或者200,这样你就能看到交替执行了。结果是两个线程并发的执行,其中一个是main方法,另一个是我们自定义的线程,多次启动一个线程是非法的,线程结束后也不能重新启动。如果是同等优先级的,就随机执行。线程:线程是进程的一个执行单元。原创 2023-07-31 18:12:17 · 229 阅读 · 0 评论 -
异常的使用
throw关键字抛出指定的异常对象,我们就必须要处理这个异常对象,如果throw关键字后面new的是RuntimeException或者RuntimeException的子类对象,我们可以不处理,交给JVM处理。可以写多个catch捕获多个异常,而仅仅写一个try和一个finally,但是需要注意的是,如果catch里面捕获的异常存在子父类的关系,那么子类必须捕获在父类之前,因为如果把父类写在前面,那么子类异常就不可能被捕获到。java提供的异常类不满足我们的使用,我们需要自己定义一些异常类。原创 2023-07-31 15:22:36 · 88 阅读 · 0 评论 -
集合中的数据结构
java集合中的数据结构原创 2023-07-29 20:12:55 · 412 阅读 · 0 评论 -
Iterator迭代器的使用
迭代器其实一开始指向的是集合的-1位,使用hasNext判断是否存在下一位,有则返回true,没有则返回false,利用next方法取出下一位数据。迭代是对collection集合的通用获取方式。在取元素之前先对集合进行判断是否还有元素,如果有就取出来,一直到集合中的元素被取完。Iterator是一个接口,我们不能直接使用,我们可以使用它的实现类。而它的实现方法在collection接口当中,叫做Iterator。Collection获取集合的迭代器,利用Iterator接收(多态)原创 2023-07-29 19:41:01 · 323 阅读 · 0 评论 -
collection集合的使用
boolean contains(E e) 判断集合中是否包含某个元素。将集合转为object数组。boolean remove(E e) 删除集合中的某个元素。boolean add(E e) 向集合中添加元素。boolean isEmpty() 判断集合是否为空。void clear() 清空集合中的所有元素。int size() 计算集合的大小。原创 2023-07-29 16:37:39 · 196 阅读 · 0 评论 -
集合的概述
其中Vector、ArrayList、LinkedList实现了List接口,LinkedHashSet实现了HashSet接口,TreeSet、HashSet实现了Set接口。基本的集合有六种,分别是Vector、ArrayList、LinkedList、TreeSet、HashSet、LinkedHashSet。我们学习集合,首先从集合的共同接口开始学习起,即从上往下学,因为学习了共同的接口,下面的实现类都是基于上面的共同接口实现的。List和Set又实现了Collection接口。原创 2023-07-29 15:59:40 · 80 阅读 · 0 评论 -
包装类的使用
比如String str=300+“”;基本数据类型转为String。任意数据类型+“”;原创 2023-07-29 15:22:27 · 74 阅读 · 0 评论 -
StringBuilder使用原理
在String类的使用中,字符串是一个常量,它们的值在被创建之后就不可改变,字符串实现的底层是一个被final修饰的字节数组,不可以被改变,是一个常量,private final byte[] value;比如String str=“a”+“b”+c=“abc"的实现过程,就是用了五个字符串,分别是"a”, “b”, “c”, “ab”, “abc”“a”+“b”+“c”=“abc” ,StringBuilder的在内存中始终是一个数组,占用空间少,效率高,初始容量是16,如果超过了16,会自动扩容。原创 2023-07-29 14:50:45 · 110 阅读 · 0 评论 -
Object类的使用
Object类当中有toString方法,我们需要对toString方法进行重写,否则使用继承自Object类的toString方法之后打印的是对象的地址,重写之后,可以打印自定义的信息。为了防止s1.equals(s2)的时候s1是null产生空指针异常,我们可以使用Object类的equals方法,这是允许使用空指针的存在的。可以传递任意参数与当前调用这个equals方法的对象进行比较,如果是基本类型,那么比较的是值,如果是引用类型,那么比较的是地址。原创 2023-07-28 19:10:13 · 70 阅读 · 0 评论 -
final的使用以及权限修饰符
final跟abstract不可以同时使用,因为二者是冲突的。final表示不可变,abstrac表示必须要重写、必须要变。权限修饰符包括四种,按权限大小排序分别如下;final表示最终的、不可改变的。原创 2023-07-28 17:54:02 · 171 阅读 · 0 评论 -
多态的学习
多态指的是父类引用指向子类对象或者接口引用指向实现类的对象。父类名称 对象名=new 子类名字();接口名称 对象名=new 实现类名();原创 2023-07-28 14:10:44 · 76 阅读 · 0 评论 -
Interface接口的使用
接口中可以创建一个默认方法,默认方法是可以直接在接口中实现的,不需要在实现类中实现,这样就防止接口更新之后实现类全都要修改的问题。接口中的变量必须赋值,因为接口中的变量默认都是静态常量,不赋值就会自动带上一个默认值,这样我们定义这个变量我们却没有用上这个变量,这是没有意义的。一个实现类可以实现多个接口,但是实现类中必须重写多个接口中的所有抽象方法,如果没有全部实现,那么这个实现类本身就要是一个抽象类才可以。接口中全都是抽象方法,不存在普通的方法,也不存在构造方法,所以需要实现抽象方法才可以实例化。原创 2023-07-28 13:03:52 · 69 阅读 · 0 评论 -
abstract抽象方法以及发红包案例
抽象方法的定义就是在普通的方法前面加上一个abstract关键字修饰,然后去掉大括号,最后分号结束。也就是说暂时不需要具体的实现,只需要定义。另外,抽象方法必须定义在抽象类里面,抽象类的定义就是在类名字的前面加上一个abstract关键字修饰。抽象应该是一个类里面的某个方法不能具体的说出它的实现方法的,还可以再分的,我们叫它抽象方法,抽象方法一般有多个实现。比如一个图形类,它的计算面积的方法是一个抽象方法,因为你不知道这个图形是什么图形,也就不知道具体的面积计算方法是什么,所以这个方法是抽象方法。原创 2023-07-27 20:26:07 · 60 阅读 · 0 评论 -
Extends继承的使用
我们可以使用super关键字在子类中访问子类的父类数据,比如成员变量和方法等,在本类中可以使用之前说过的this关键字访问本类的关键字,this指向调用当前这个方法的实例对象,super指向调用当前这个方法的实例对象的父类。继承当中,子类可以访问父类的所有变量和方法,也可以使用自己新加的变量和方法,当访问一个变量或者方法的时候,先在子类中查找,如果没有找到,然后才去父类查找,如果父类也不存在,则会编译错误。继承指的是子类可以继承父类的所有东西,包括成员变量和方法,使用extends关键字进行继承。原创 2023-07-27 18:06:51 · 123 阅读 · 0 评论 -
Math数学工具类的使用
【代码】Math数学工具类的使用。原创 2023-07-27 13:02:49 · 75 阅读 · 0 评论 -
Arrays数组工具类的学习
【代码】Arrays数组工具类的学习。原创 2023-07-27 12:43:16 · 76 阅读 · 0 评论 -
static关键字学习
static关键字的共享数据。原创 2023-07-27 12:18:22 · 53 阅读 · 0 评论 -
String类的使用
程序当中所有的双引号字符串,其实都是String类的对象,只是不需要new。原创 2023-07-26 23:25:55 · 55 阅读 · 0 评论 -
ArrayList集合的使用
ArrayList是基于数组的一个更高级的数组实现,我们不需要给他一个长度,他会自己改变长度,默认长度为10,当数组满了之后,插入第是一个数据时会触发扩容,扩容的长度是原来的一半,达到15的长度,当插入第16个数据的时候,又会触发扩容到20个长度。ArrayList扩容的原理是计算出新的长度,然后创建一个新的数组实例,并且把原来的数组的数据拷贝进去,然后再将新加入的数据加入到扩容后的数组。数组是不可变长度的,一旦被创建,长度就不可以被改变。使用包装类代替基本数据类型作为泛型。原创 2023-07-25 14:12:06 · 48 阅读 · 0 评论 -
Random的使用
/这里的随机数范围就是[0,5)int num=r.nextInt(5)+1;//这里的随机数范围是[1,5)如果需要从1开始,我们需要在生成的随机数基础上加一。Random是随机数生成类。一个简单的猜数字的小游戏。原创 2023-07-25 12:33:49 · 209 阅读 · 0 评论 -
Scanner的使用
new Person(). //只new一个对象,而不接收它在堆中的地址,导致了就可以使用一次,因为不知道对象的地址,所以再次使用的时候找不到对象。其实Scanner获取到键盘的输入数据全都是字符串,只不过sc.nextInt()将获取到的字符串转化为了int类型。默认使用java.lang包下的内容,所以使用java.lang包下的内容的时候不需要导包。适合只使用一次的情况,比如返回值是一个对象的情况,这时候就可以new一个对象。Scanner类的功能:可以实现用键盘输入数据到程序中。原创 2023-07-25 11:30:25 · 64 阅读 · 0 评论 -
类和对象的使用
属性的封装是指在类的属性前面加一个private修饰符,根据这个类创建的对象就不再可以根据对象.属性的方式访问类的属性,只有在类的内部才可以访问得到,从而将属性封装在了类的内部,我们只需要用public修饰类里面的方法,对象就可以调用类的方法来间接访问到我们的属性,而在这个方法里面我们就可以设置一系列的筛选条件,比如age属性的setAge方法,我们要求setAge方法在设置age的时候只要age>18的情况。Java中多继承的功能是通过接口来间接实现的。对象是类的一个实例,具备类的所有属性和行为。原创 2023-07-23 19:55:36 · 58 阅读 · 0 评论 -
局部变量和全局变量的差异
这跟java是基于c语言的编写关系很大,我们都知道,c语言的变量在创建完了之后,我们必须要赋值才可以使用,否则会出现错误,也正是因为如此,我们在java中使用变量的时候,也必须赋初值使用。内存的位置不一样,全局变量在堆内存中,局部变量在栈内存中,调用一个方法的时候,这个方法就会被压入栈,这个时候,方法中的局部变量才被创建,也就是被创建到堆内存中,当方法执行完毕,被弹出栈的时候,局部变量就会被销毁,回收内存。生命周期不一样,全局变量随着对象的在堆内存的创建而诞生,随着对象的被垃圾回收而消失;原创 2023-07-23 18:45:38 · 231 阅读 · 0 评论 -
数组的使用
引用数据类型包括:类(class)、接口类型(interface)、数组类型(list)、枚举类型、注解类型,字符串型(String,String的衍生类,如StringBUilder等)。该数据类型在创建的时候,会先在堆内存中分配一块空间,存储对象的具体信息,然后在栈中存储该对象的地址信息;静态初始化的时候,其实也有默认值,只不过数组在赋值为默认值之后,又被我们自己定义的数据给替代了。4、一旦引用被初始化,就不能改变引用的关系(指针则可以随时改变所指的对象)。直接打印数组的名字得到的是数组位置的哈希值。原创 2023-07-23 16:37:36 · 49 阅读 · 0 评论 -
方法的基本使用和方法重载
九种数据类型:byte、int 、short、Long、char、String、boolean、float、Double注意事项:方法应该在类中,却不能在方法中;方法的定义的前后顺序不影响方法定义之后一定要调用,不然不会执行,要想在main方法中调用,必须使用static关键字。原创 2023-07-23 12:38:58 · 52 阅读 · 0 评论