- 博客(37)
- 收藏
- 关注
原创 I/O流的相关内容
方法其实跟字节流的方法实现差不多但是这里提示一下:字符是由多个字节组成的,所以字符流只能读取字符数据,如果读取字节数据就会发生乱码,但是字节流即能读取字符文件,又能读取字节文件,这就是两者的区别所在,换句话讲就是字符流是建立在字节流的基础上的。这里我们有两个方法,我们来解释一下两者的区别,第一个方法mkdir()创建的是一级目录,而mkdir()创建的是多级目录。I/O流:其实是Input/Ouput的缩写形式,I/O流是非常实用的技术,用来处理数据的传输,如读写/写入文件的操作,网络通讯等。
2023-12-17 21:23:27
165
1
原创 线程终止,线程的相关方法,线程状态图以及线程的同步机制。
这里有俩个非常常用的方法一个是yield:线程的礼让,一个是join:线程插队,线程的礼让:让出cpu,给其他线程先运行,但是会根据cpu的运行状态来确定,如果cpu的资源很丰富则不会礼让成功,所以线程礼让是不确定的,它不一定会成功,线程插队:线程插队跟线程礼让不同,它比较霸道,一旦插队成功是必须先执行完该线程,才会将cpu让出来给其他线程使用。(同步机制的互斥锁大多设置为自己的类即类名.class),该锁是必然有效的,因为类只能有一个,可以根据自己的喜好,自行添加锁。
2023-12-17 02:20:08
209
原创 南京邮电大学数据库实验二
4. 用alter table命令修改movies关系模式,增加引用完整性约束cpc,要求movies表中的producerC必须是在MovieExec表中已有的制片人。提示:check约束,数据库版本5.7以及5.7以下的会有check的定义但是check语句是无效的,即不能对添加的数据进行判断,需要使用触发器来进行处理,5.7版本以上,就可以使用check语句。提示:这里的fields by ',' 这里单引号内的符号是看你文件中是按什么来分割数据的,根据实际情况来自己修改符号。
2023-12-16 23:09:10
1754
1
原创 线程的介绍
程序就是我们编写的代码就叫程序,当我们程序运行的时候则称为进程,在我们现实生活中哪些用到了进程,就比如说我们qq,微信,百度网盘等等软件的使用,当它们在运行的时候,操作系统就会自动的给它们分配内存空间,那线程是什么,线程是由进程创建出来的,是进程的一个实体,一个进程可以拥有多个线程,线程分为两种一个是单线程,还有一个多线程。//这里就是一个模拟的一个run()方法,首先判断传入的对象是否为null,不为null的话就会直接调用传入对象的run()方法。//start0()会调用run()方法。
2023-12-16 18:58:22
65
原创 泛型的相关内容
当我们没有定义泛型时默认E为Object类型,而且泛型最好不要与静态属性定义在一块,因为二者是冲突的,没有确定E类型的时候是无法进行初始化的,泛型的定义不是一定要用E来表示也可以是其他的比如T,S,P等等,泛型的定义必须是引用类型,基本数据类型无法定义泛型。泛型的使用范围很广,可以定义属性,返回类型,数组(泛型定义的数组,不能进行初始化,因为类型不确定,所以无法开辟空间),接口等等,泛型一旦被定义一个固定的引用类型,即可传入本类或者其子类的类型。首先我们来了解一下什么是泛型,泛型的作用又是什么。
2023-12-16 01:50:38
209
原创 Set接口下的实现类HashSet,和Map接口下的HashMap的相关内容
这就是我们必须转换的原因。前面的调用跟前面的时完全相同的,不同点就是在这,它首先对你的hash值进行一个判断,看是否存放在同一个索引位置,如果相同则进行equals()进行比较看是否数组中已存在相同的元素,即比较俩者是否为同一个对象,相同的话前面的add方法中的return则返回的是false。这就是我们HashSet的一大特点,接下来我们来了解一下HashSet的底层机理,HashSet的底层其实调用的是HashMap,HashMap的底层则是(数组+链表+红黑树)。
2023-12-14 23:31:52
410
原创 实现List接口的常用三类
ArrayList底层是可变数组,而LinkedList底层是双向链表,二者的性质不同,LinkedList对增删操作的效率比较高,ArrayList对查改的效率比较高,两者都是线程不安全的,但是在以后的编程中对数据的查改操作更多,所以ArrayList是比较实用的,根据不同情况来选择不同的方式。跟我们的预期是一样的。这里我们选用的是ArrayList的无参构造器,ArrayList也有有参构造器但是机理是差不多的,待会分析,我们先来看一下无参构造器的扩容机理。
2023-12-13 23:44:02
246
原创 集合的基本内容以及迭代器的介绍
我们发现在Degbug增强for的时候发现进入了这个方法上,但是发现又有点眼熟,这不就是迭代器嘛,其实我们增强for的元素遍历就是调用的迭代器,换句话说增强for的本质就是迭代器,所以能有增强for方法的,一定能用迭代器遍历,这就是本次的全部内容,接下来的文章会比较繁琐,因为HashMap,HashSet,Hashtable等等这些类的内容以及源码;这里我们就解决了上述问题,当然大家也是可以重新得到一个新的迭代器来进行遍历。我们会看到增强for跟迭代器的效果是一样的。
2023-12-10 22:46:05
292
原创 Arrarys类的相关细节与知识点
排序过后的会不会正确这里我就先不演示了,感兴趣的朋友可以去尝试一下,copyof()方法顾名思义就是将旧数组完完全全的复制给新数组,fill()这个方法其实就是将数组中的元素按照数组的长度全部替换成指定元素,equals()这个方法我们之前也是聊过的,就是比较的方法,在这里就是数组之间的比较,两个数组完全一样则返回true,不同则返回false(这里的顺序也是必须是一致的,顺序不一致也是返回false),接下来我们重点讲一下Sort()方法的细节和使用。即return n1 - n2。
2023-12-06 23:33:54
169
原创 StringBuffer类和StringBuilder类的相关知识点
但是这俩个我们推荐使用哪个呢,在正常情况下呢我们推荐使用StringBuilder来进行对我们字符串的修改,因为它的效率会比较高,但是StringBuilder是线程不安全的,在特殊的情况下还是得有StringBuffer,StringBudder它是线程安全的。这里才是我们真正将数据存放进builder中的操作,我们上面知道刚创建的时候char[]的时候是直接是将长度扩展到16,但是如果长度超过16又是如何处理的呢,我们来看一下原理。
2023-12-05 23:08:43
188
原创 对String类的深入理解
字符串的初始化方式有两种一种是直接赋值 : String 变量名 = ".....",还有一种是调用构造器进行初始化:String 变量名 = new String("....")待会我们会解释一下这俩个方法的差异,首先我们来了解一下String类的一些基本概念,首先String类它是final的,简单来讲它是无法修改的,但是你在对它重新赋值的时候你会发现,它的值确实被修改了,待会我们会分析它被修改的原因。你在执行String name1 = “孙悟空”;
2023-12-04 23:39:33
130
原创 包装类的相关内容
这里有个小细节得注意一下,Integer默认的数字范围是-128 - 127,超出该范围的话底层就会new Integer();jdk5之前是需要我们进行手动装箱和手动拆箱的,jdk8之后我们就不需要进行手动装箱和拆箱,它代码底层会调用相关方法:我们来看一下代码如何进行自动装箱和拆箱。针对八种基本数据类型相应的引用类型—包装类,包装类就相当于将基本数据类型进行一个装箱的操作,包装类实际上是个类里面有很多定义好的方法,更加方便对数据的处理。大家也可以尝试的去Debug一下追源码,对我们的理解是非常有好处的。
2023-12-03 23:28:49
239
原创 java异常处理
这里我们发现程序给我们抛出来一个算数异常 / by zero,但是你们会发现我们不添加throws这个关键字,它也会给我们抛出这样一个异常,那是因为我们java异常处理机制,在你不做任何处理的情况下默认是throws,最后我们还有一个自定义的异常处理,throw new 自己定义的异常类名 要么继承Exception(属于编译异常)要么继承RuntimeException(属于运行异常)通常都是继承RuntimeException。我们发现不管是否捕获到异常我们的finally中的语句始终会被运行。
2023-12-03 00:23:42
156
原创 enum枚举法
枚举法严格意义上来讲的话,它存放的对象是固定的对象,它只支持读取,不支持修改,当我们需要创建季节这个对象时,我们就要知道,季节它是固定的它只有四个值分别为春、夏、秋、冬,如果我没有传统的创建对象的方法它可以new很多个值,它是支持修改的,因为这样的缘故,所以创建了enum关键字,枚举法有两种形式一个是自定义枚举。在用enum关键字开发一个枚举类的时候它会默认的继承Enum类。如果你试图在main方法中创建新的对象的话,你会发现代码是报错的,并且你如果想修改定义好的这四个对象的时候也是会报错的。
2023-11-26 22:30:22
115
原创 匿名内部类(内部类的重点)
这是匿名内部类的第一种形式,根据匿名内部类是一个对象的形式调用,你会发现在new IA()后面有一个.eat()的方法,就相当于把前面一个整体当成一个对象。匿名内部类也只能使用一次,因为在栈中没有对应的名称指向它,所以它在堆中使用一次就会被回收。匿名内部类的本质还是一个类,根据名称也可得出该类没有类名,匿名内部类同样还是一个对象,所以这也是triger的运行类型会是class inclass$1的原因。匿名内部类它是定义在外部类的局部位置比如说定义在方法内。该形式就是将匿名内部类直接当作实际参数进行传递。
2023-11-26 01:23:08
195
原创 内部类(局部内部类)
这段代码就能体现局部内部类的一些特征,后面还有静态内部类,成员内部类,还有匿名内部类(匿名内部类最主要)后面会单独写一篇关于匿名内部类的实例分析代码,源码中大部分都是匿名内部类的身影,想看懂源码匿名内部类必须学好。内部类可以分为两大类:1.局部内部类 2.匿名内部类(特别重要!)内部类都定义在外部类的成员方法上,有成员内部类和静态内部类两种。如果外部类成员变量名和局部内部类成员变量名重名时按照就近原则访问变量,如果想访问外部类的变量,则可以使用(类名.this.变量名)3.它仅仅作用在代码块或者方法中。
2023-11-24 22:50:09
32
原创 接口实现统一管理的代码实例
这里就可以看出我们的代码看起来就非常的有条理性,这里我们并没有真正的连接数据库,只是用打印文字的方式来做一个示范,希望大家对接口的作用有一个进一步的了解。
2023-11-23 22:35:42
188
原创 接口(interface)
接口的实质其实就是抽象类,在jdk7.0之前接口类中只能有抽象方法,不能有实体方法,在jdk8.0之后接口就能有默认的方法,静态方法。注意:接口是不能被实体化的,并且接口中的所有方法都是public,如果尝试用其他修饰符来修饰方法则会报错,抽象类实现接口时则可以不实现接口的方法,接口的作用其实也不止于此,它还有个很重要的作用:可以提高代码的可读性,统一管理方法名,使代码更加清晰,下一个文章我们可以用一个实例来解说。
2023-11-22 22:53:48
249
1
原创 抽象模板(实例)
该代码就将公共的代码放在了父类中,不一样的方法在子类中进行重写,你会发现只有activity这个方法在两个子类中的表述不一样这也是我们模块的突破点,就可以在抽象类中将这个方法设置为抽象方法,然后进行重写,这样就能达到我们简化代码的目的。
2023-11-21 23:06:13
715
原创 抽象类的实例展示
抽象类的引出是处于当我们设计父类时不知道类中的方法如何实现需要子类继承重写该方法,比如父类是个animal类,动物有很多种,它们有共同的特征比如吃喝睡,但是他们的这些行为都不相同,这就需要将父类设置为抽象类eat drink这些方法也设置为抽象方法,注意抽象类不能和final, private,static这三个一块使用,因为这三个和继承重写相冲突,抽象方法不能有方法体否则会报错,子类必须重写父类的抽象类方法否则也会报错。
2023-11-20 23:28:57
123
1
原创 final关键字的作用
3.类:当被final修饰之后,该类则不能被其他类继承,当类设置为final时类内部不希望被继承的方法就没有必要设置为private,因为类都为final就说明类中的所有方法都无法被继承。1.变量:当被final修饰之后,变量必须进行初始化才能使用,并且初始化之后该变量的值不能被修改,你试图去修改的话就会报错。5.当使用final修饰引用类型时,该引用变量指向的对象不能再改变,但是对象的内容还是可以修改的。final在英文中的意思为最后最终的意思,它可以用来修饰变量,方法和类名。
2023-11-20 22:47:32
172
1
原创 单例模式(懒汉式和饿汉式)
当我们在编写代码时,我们规定一个类中只能创建一个实例对象时,就像说老婆只能有一个这样的特殊情况时,这样我们就可以运用单例模式来创建对象,单例模式有俩种分明是懒汉式和饿汉式,当我们只能创建一个对象时,我们的构造器就要设置为private,让其他类不能访问该类的构造器,所以我们需要先在内部进行构造一个对象,再用一个public修饰的方法来接受创建的对象。下面懒汉式和饿汉式的俩个具体实例和一些必要的解释。但是懒汉式和饿汉式的f1()的方法可以被多次调用付给其他的对象但是其他对象所指向的地址肯定是同一个地址。
2023-11-20 00:05:39
324
1
原创 抽象类(abstract)
2.共享代码和行为:抽象类可以包含非抽象的方法和实例变量,这些方法和变量可以被子类继承和使用。1.定义类层次结构:抽象类可以作为类层次结构中的顶层类,定义通用的属性和方法,子类可以继承并实现具体的功能。3.约束子类的行为:抽象类可以定义抽象方法,要求子类必须实现这些方法,从而约束子类的行为。5.子类实现:继承抽象类的子类必须实现抽象类中的所有抽象方法,否则子类也必须声明为抽象类。4.抽象方法:抽象类可以包含抽象方法,抽象方法没有实际的实现,只有方法签名,即方法名和参数列表。关键字创建抽象类的对象。
2023-11-18 23:46:25
282
1
原创 static的相关内容
静态方法可以直接通过类名来调用,而无需创建类的实例对象。1.静态变量:被 static 修饰的变量称为静态变量,也叫类变量。3.静态代码块:使用 static 修饰的代码块称为静态代码块。静态代码块在类被加载的时候执行,并且只会执行一次。static这个为非访问修饰符中的一个:被它修饰的变量、方法、代码块,称为静态变量、静态方法、静态代码块。静态代码块和属性的优先级高于普通代码块的优先级。静态方法和变量是无法被继承的,因为它不是通过实例对象进行访问,是通过类加载而生成的。2.子类的静态方法和代码块。
2023-11-16 22:37:32
149
1
原创 访问修饰符的访问权限范围
修饰符一共有四种1.public 2.private 3.默认 4.protected。protected:可以被同一包内的类以及其他包中的子类访问。可以根据自己的需要来设定相关的访问权限。修饰符可以修饰类、属性、方法、构造器。public :可以被任何类访问。private:只能在本类中访问。默认:可以被同一包内的类访问。
2023-11-16 22:00:10
634
1
原创 继承的相关内容
这里的a不能访问B类的work方法,用大白话来解释就是a的编译类型为A,因为A内部没有work这个方法所以系统它找不到这个方法所以无法访问,但是你在执行say这个方法时因为运行类型是B,所以还是从子类中先查找该方法,如果子类没有重写该方法则执行父类的say方法,这里如果执行say方法则输出 ############,如果你想访问到子类方法,当然这里你可以直接改为B b = new B();1.类和类之间是可以有继承关系的,被继承的成为基类或者父类,继承的类称之为子类,子类可以使用父类可继承的方法,属性。
2023-11-15 23:47:01
147
原创 构造器的作用
4.方法重载:通过在一个类中定义多个构造器,可以使用不同的参数组合来初始化对象。这允许调用方根据需要选择最适合的构造器,以便实例化对象。2.对象的初始化:构造器用于初始化对象的初始状态。它可以根据需要为对象的成员变量设置初始值,以确保对象在创建后处于一个可用的合理状态。3.参数传递:构造器可以接收参数,这些参数可用于初始化对象的成员变量。通过在构造器中定义参数,可以轻松地对对象进行个性化的初始化。关键字实例化对象时被调用。它负责分配内存空间,并初始化对象的成员变量。1.对象的创建:构造器在使用。
2023-11-15 22:53:38
322
原创 递归算法:典型例题 汉诺塔
1.问题可以分解为规模更小的相同子问题:递归算法通过将一个问题分解为规模更小但类似的子问题来解决。每个子问题的解决方法与原始问题的解决方法相同,但应用于更小的输入。3.递推关系:递归算法通过递归地调用自身来解决问题。这通常包含一个递推关系,即将原始问题划分为多个子问题,并通过对子问题调用自身来解决。2.基本情况:递归算法需要定义一个或多个基本情况,也称为边界条件。当满足基本情况时,递归结束,避免无限循环。
2023-11-14 23:04:59
75
1
原创 方法的重载和重写的区别
5.我们定义的所有类都是继承Object类所以我们也可以通过在自己定义的类中来重写Object类中的方法。4.返回类型可以是子类类型:子类中的重写方法可以返回父类方法声明的返回类型的子类类型。子类中的重写方法必须和父类中的被重写方法具有相同的方法签名。3.访问修饰符不能更严格:子类中的重写方法的访问修饰符不能比父类中被重写方法的访问修饰符更严格。3.方法的访问修饰符可以不同,但是对于方法重载来说,并不需要方法的访问修饰符相同。4.方法重载和方法的返回类型无关,所以不能仅仅依靠返回类型的不同来进行方法重载。
2023-11-14 22:57:19
368
1
原创 == 和 equals之间的区别
这里可以通过快捷键ctrl + B来查看Object,Srting,Integer,Double类的jdk源码,查找到各自的equals方法,通过equals方法的重写,Srting,Integer,Double等类的equals比较的是两者的值是否相等。equals方法在Object类内它也是判断来者的地址是否相等,但是在String,Integer,Double等类当中会重写equals方法。因为Object为所有类的基类,String,Integer,Double等类都是继承object。
2023-11-13 17:53:40
119
原创 java.util中的Scanner类
类可以用于从各种来源(如标准输入、文件、字符串等)读取不同类型的数据。它提供了各种方法来解析和提取输入的数据,并将其转换为相应的数据类型。对象会执行一些清理工作,包括关闭底层的输入流和释放相关的资源。这样可以释放占用的资源,同时也可以确保程序正确地关闭。例:Scanner 变量名 = new Scanner(System.in);这个用来读取用户输入的数据并赋值给name,age;int num = 变量名.nextInt();作为输入源,表示从标准输入中读取数据。变量名.close();
2023-11-13 17:14:17
601
原创 if语句 swich语句
if在编程语言中实现的是一个判断的作用,只有在判断条件为true时才会执行对应的代码块,if是依次判断先判断if(判断条件)如果为false再进行下一步判断else if(判断条件)这里判断结果还是为false的话就会直接进入else的代码块,不需要进行判断(ps:else if可以有多个)。case后面都添加了一个值,当表达式的值和其中的某一个值匹配时就会执行对应的代码块。最后如果case并没有值和表达式的值匹配时就会执行default内的代码块。ps:break语句不要忘记加,不然出不来理想的结果。
2023-11-13 16:45:07
54
原创 for循环的一个小案例:九九乘法表
内层for循环控制每一行的个数,所以要保证最后一行为9个第二层的判断条件为j < i + 1;输出语句中加上\t为了让输出的结果更加的美观。这里用到了for循环的嵌套使用,第一个for循环控制具体的行数,根据代码得出有1到9行。
2023-11-12 21:38:34
60
原创 Java for循环,while循环,do..while循环
判断是否满足循环条件基本上是用< , > , == ,如果条件有俩个及以上可以使用&&,||,|来进行多条件的判断;do...while循环有一个特点就是不管满不满足循环条件它都会进行一次循环,它是先执行代码块再进行条件判断。这里的初始化值一般可以为基本数据类型int double等,也可以是一个自己构建的一个方法;代码块(添加更新语句,否则会无限循环下去)for(初始化初值;更新语句基本上都是变量++,变量--。while(判断是否满足循环条件){}while(判断是否满足循环条件)
2023-11-12 21:21:57
31
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人