![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Java基础
文章平均质量分 57
彭于洋
这个作者很懒,什么都没留下…
展开
-
Java对象类型转换:向上转型和向下转型
向上转型父类引用指向子类对象称为向上转型其实就是把子类对象直接赋给父类引用,不用进行强制转换。使用向上转型可以调用父类类型中的所有成员,在进行编译时会进行静态绑定,对象与指定的类型进行方法绑定调用某个方法,究竟执行哪一段方法,要看这个引用指向的是父类还是子类对象,这个过程是在运行时决定的,因此称为 动态绑定。向下转型与向上转型相反,子类对象指向父类引用就是向下转型向下转型可以是调用子类类型中的所有成员,不过需要注意的是如果父类引用对象指向的是子类对象,那么在向下转型的过程的过程中原创 2021-09-27 23:30:51 · 921 阅读 · 2 评论 -
JVM垃圾处理方法
目录标记-清除算法不足之处:复制算法优缺点:复制算法的空间分配担保标记整理算法标记-清除算法这个算法是最基础的垃圾处理算法,算法分为 标记 清除 两个阶段:首先标记处所有需要回收的对象,在标记完成后统一回收所有被标记的对象,后续的所有算法都是对这种算法的改进不足之处:①效率不高:标记和清除都没有很高的效率②空间问题:标记清除后会产生大量的不连续的内存碎片,空间碎片会导致在程序运行时如果需要较大内存的对象的时候没有足够的连续内存,所以又得再一次...原创 2021-08-22 18:15:22 · 278 阅读 · 0 评论 -
常见的锁策略
乐观锁和悲观锁乐观锁:乐观地认为数据一般不会产生并发冲突,所以再在正式提交更新的时候才会对是否发生冲突进行检测,如果发生冲突,则让返回用户错误的信息,让用户决定如何去做悲观锁:悲观地认为每次拿数据的时候都会被别人修改,所以每次拿数据的时候都会上锁,别人想要拿到这个这个数据就必须等到锁释放。乐观锁只能适用于冲突较少的场景悲观锁由于需要竞争锁,所以性能不高读写锁多线程之间,如果只是涉及到读操作的话不会引起线程安全的问题,但数据的写入和读之间都需要进行互斥。如果都加锁,会产生极大的性能损耗原创 2021-08-19 19:05:48 · 118 阅读 · 0 评论 -
关于线程的一些操作
获取当前线程的引用对象Thread.currentThread();返回当前对象的引用休眠当前线程①Thread.sleep(long mills)②Thread.sleep(long mills,int nanos)原创 2021-08-19 18:12:55 · 99 阅读 · 0 评论 -
线程的生命周期
新建和就绪状态当使用new关键字创建了一个线程之后,该线程就处于新建状态,此时Java虚拟机就会给他分配内存,并且初始化成员变量的值。当对象调用了start()方法之后,这个程序就会处于就绪状态,它就有了自己的方法调用栈和程序计数器,处于这个状态的线程并不是立即开始运行,至于什么时候运行取决于调度器。...原创 2021-08-19 16:22:03 · 97 阅读 · 0 评论 -
start 和 run
启动线程时我们使用的时start()方法,而不能使用run()方法;调用start()方法时,系统会将run()方法作为线程执行体系来进行处理调用run()方法时,run()方法会直接运行,而在run()方法执行结束之前其他的线程无法并发执行也就是说,如果直接调运run()方法,系统会把线程对象当作一个普通对象,而不是线程对象此时的run()方法就是一个普通方法,不是线程的执行体系。...原创 2021-08-19 15:53:11 · 118 阅读 · 0 评论 -
进程和线程
定义:几乎所有的操作系统都支持同一时间执行多个任务,这个任务通常就是一个程序,当一个程序运行时,可能会有多个执行流,那我们就可以认为,程序就是就是一个进程,每个执行流就是一个线程。进程和线程之间的关系:线程是进程的组成部分,一个进程可以拥有多个线程,一个线程必须拥有它的父亲进程。 线程可以拥有自己的堆栈、自己的程序计数器和自己的局部变量,可以与其他线程共享进程所拥有的资源。通过相互之间的配合来完成进程所要完成的任务。 线程是独立运行的,它并不直到是否有其他线程的存在,线程 的执行是抢占式..原创 2021-08-19 15:36:26 · 97 阅读 · 0 评论 -
接口interface
接口的概念:如果说抽象类是多个类抽象出来的模板,那么接口就是更加抽象的“抽象类”,即规范,在接口中,不能包含普通方法,只能包含抽象方法。定义接口的时候,我们使用的是interface关键字,基本语法如下:{修饰符}interface 接口名 extends 接口1,接口2{常量;抽象方法;内部类;默认方法,类方法;....}接口的修饰符可以是public或者省略,省略的话默认default,包访问限制,即只有在相同的包里面才能进行访问 一个接口可以继承多个接口,但是接口只原创 2021-08-19 09:50:53 · 175 阅读 · 0 评论 -
abstract抽象类
在我们定义某一个类的时候,往往会为这些类定义一些方法,这些方法用于描述该类的行为,都有具体的方法体。在发生继承时,父类只直到子类应该继承哪些方法,但是并不直到子类是如何实现这些方法的(重写)。既然不知道子类时如何实现这些方法的,那么干脆就可以不用管,使用只有方法名,而没有实现方法的抽象方法。抽象方法和抽象类:必须用abstract修饰符来进行修饰,有抽象方法的类只能被定义为抽象类,抽象类里面可以没有抽象方法。 抽象方法必须没有方法体 抽象类不能被实例化 抽象类可以包含成员变量,方法(这里的原创 2021-08-16 11:40:41 · 241 阅读 · 0 评论 -
Java的访问控制符
Java提供了三个访问控制符:private、protect、public,还有一个不加任何任何访问控制符的访问控制级别 default,一共就是4个访问控制级别。java的访问控制级别由小到大如下所示:注意:default并没有对应的访问控制符,当没有访问控制符来修饰类或者类成员时,系统默认使用default修饰。四个访问控制级别的具体介绍如下:private(当前类访问)如果类里的一个成员(包括成员变量、方法和构造器等)使用private访问修饰符来修饰,则这个成员变量只能在当.原创 2021-08-16 09:30:54 · 875 阅读 · 0 评论 -
可以重写static方法和private方法吗
当然是不能的static方法 可以被继承,但是不能被重写首先static方法是编译时静态绑定的,而方法重写时基于运行时动态绑定的。static方法跟类的实例无关,只跟类有关虽然不能被重写,但是可以被继承 ,可以在子类中通过 父类类名.方法名 的形式进行访问,如果父类和子类中拥有相同名称和参数的静态方法,那么该子类其实是隐藏了从父类继承过来的静态方法,这是属于子类自己的方法,而不是重写。通俗的讲就是,这两个方法是两个没有关系的方法,具体调用哪个就要看是哪个对象的引用,不存在多态的性质.原创 2021-08-14 21:23:07 · 1938 阅读 · 0 评论 -
重载和重写的区别
重载:定义:编译时多态,即同一个类中具有多个名字相同的方法。这些方法具有不同的参数列表,不能根据返回值类型进行区分;就是:针对同一个类,方法名相同方法参数不同(个数和类型不受限制)至于其他部分(返回值类型,修饰符等)跟重载没有关系示例:public class Main { public static void test(){ System.out.println("无参数的test方法"); } public原创 2021-08-14 20:58:00 · 99 阅读 · 0 评论 -
二叉树的前序中序后序遍历
所谓遍历(Traversal)是指沿着某条搜索路线,依次对树中每个结点均做一次且仅做一次访问。访问结点所做的操作 依赖于具体的应用问题(比如:打印节点内容、节点内容加1)。 遍历是二叉树上最重要的操作之一,是二叉树上进 行其它运算之基础。在遍历二叉树时,如果没有进行某种约定,每个人都按照自己的方式遍历,得出的结果就比较混乱,如果按照某种 规则进行约定,则每个人对于同一棵树的遍历结果肯定是相同的。如果N代表根节点,L代表根节点的左子树,R代 表根节点的右子树,则根据遍历根节点的先后次序有以下遍历方式:原创 2021-08-12 10:14:14 · 250 阅读 · 0 评论 -
JDK、JRE、JVM
JDK(JavaDevelopmentKit):是Java开发工具包,是整个Java的核心,包括了Java运行环境JRE、Java工具和Java基础类库。JRE(Java Runtime Environment,Java运行环境),包含JVM标准实现及Java核心类库。 JRE中包含了Java virtual machine(JVM),runtime class libraries和Java application launcher,这些是运行Java程序的必要组件。通过它,J...原创 2021-08-10 23:08:05 · 103 阅读 · 0 评论 -
面向对象的三大特性 封装、继承、多态
封装:通常认为封装是把数据和操作数据的方法封装起来,它指的是将对象的状态信息隐藏在对象内部,不允许外部程序直接访问对象内部信息,而是通过该类提供的方法实现对内部信息的操作和访问。封装是面向对象编程语言对客观世界的模拟,在客观世界里,对象的状态信息都被隐藏在对象内部,外界无法直接做出修改。对一个类实现良好的封装,可以实现以下目的:①隐藏类的实现细节②让使用者只能使用预先提供的方法进行访问,从而可以在实现方法时加入一些逻辑,限制不合理访问③可以进行数据检查,有利于保证数据的完整性和可维护性原创 2021-08-10 22:53:27 · 204 阅读 · 0 评论 -
什么是面向对象?面向对象和面向过程的区别
面向对象的编程是以对象为中心,以消息为驱动。面向对象是一种基于面向过程的编程思想,是计算机向现实世界模型的自然延伸,说白了就是“万物皆对象”。在现实世界中任何一种物体都可以归为一类是事物,而每一个个体都是一类事物的实例,这就是类和实例。面向对象编程与面向过程编程的区别:①编程思路不同:面向过程以实现功能的函数开发为主,使用函数来实现功能面向过程要首先抽象出类,类的属性,类的方法,然后通过实例化对象来完成功能②封装性:二者都具有封装性,但是面向过程封装的是类,面向过程封原创 2021-08-10 21:20:08 · 1575 阅读 · 4 评论 -
电脑是怎么通过IP找到终端的
这个问题涉及到网络层和数据链路层,主要靠ARP协议来完成。1.什么是ARP?ARP协议就是根据IP地址获取mac地址(物理地址)的一个TCP/IP协议。通过广播方式获取mac地址。2.为什么要获取mac地址呢?mac地址通常是唯一的(虚拟机除外),每个硬件设备的mac地址在出场时就已经被设置好了,被用来识别数据链路层的相邻的节点。IP地址是逻辑地址,而mac是物理地址,医用ARP协议找到了mac地址就意味着找到了主机。3.IP和mac的关系:每一个主机和路由器都有一个ARP高速缓存表,原创 2021-08-05 01:24:09 · 1639 阅读 · 0 评论 -
“三次握手,四次挥手”
我们都知道TCP是面向对象连接的,三次握手是为了建立连接,而四次挥手是为了断开连接三次握手三次握手的过程:刚开始的时候,客户端和服务器都处于CLOSED状态,当要开始建立连接时,客户端主动打开连接,服务端被动打开连接,结束CLOSED状态,开始监听,进入LISTEN状态。一次握手客户端会随机初始化序号(client_isn),将此序号至于TCP首位的【序号】字段中,同时把SYN标志位置为1,表示SYN报文,接着将SYN报文发送给服务端,表示向服务端发起连接,该报文不包含应用层数.原创 2021-08-02 00:46:55 · 85 阅读 · 0 评论 -
ArrayList 和LinkedList的区别
“ArrayList底层数数组,查询快删除慢;LinkedList底层是链表,查询慢,删除快”重要的事情说三遍,上面这种说法是错误的!错的错的错的!对于ArrayList来说:①get(int index)方法的时间复杂度是O(1),因为是直接从底层数组根据下标获取的,和数组的长度无关。这是ArrayList的优点。②add(E e)方法会默认得将元素加到数组的末尾,一般情况下时间复杂度是O(1),但是可能会扩容如果扩容的话,并且不是第一次扩容,使用的Arrays.copyof(原创 2021-08-02 00:01:50 · 82 阅读 · 0 评论 -
整数和网络地址之间的转换
import java.util.Scanner;import java.util.Stack;/** * Pilot * 芜湖!起飞!!!!!!!!!!!! * PACKAGE:PACKAGE_NAME * PROJECT:20210713 * DATE:2021/7/13 * TIME:22:49 **/public class test { public static void main(String[] args) { Scanner .原创 2021-07-14 10:54:40 · 160 阅读 · 0 评论 -
java归并排序
原理归并排序就是建立在归并操作上的一种排序算法,采用分治思想。将有序的子序列合并,从而得到完全有序的序列。就是从子序列有序到总序列有序。合并两个有序数组合并[start,mid]和[mid+1,end]两个有序区间public static void Sort(int[]array,int start,int mid,int end){ int left=start; int right=mid+1; int i=0;//临时数组下标原创 2021-05-28 11:42:33 · 87 阅读 · 0 评论 -
Java快速排序
排序算法-快排我的理解就是:从待排序区间选择一个数,作为基准值(pivot);Partition: 遍历整个待排序区间,将比基准值小的(可以包含相等的)放到基准值的左边,将比基准值大的(可以包含相等的)放到基准值的右边;采用分治思想,对左右两个小区间按照同样的方式处理,直到小区间的长度 == 1,代表已经有序,或者小区间 的长度 == 0,代表没有数据。4.根据分治思想采用递归1.创建数组,调用quickSort方法public static void main(String[] arg原创 2021-05-27 18:10:13 · 66 阅读 · 0 评论 -
哈希表
一、哈希表的概念顺序结构以及平衡树中,元素关键码与其存储位置之间没有对应的关系,因此在查找一个元素时,必须要经过关键码的多次比较。顺序查找时间复杂度为O(N),平衡树中为树的高度,即O( log2n),搜索的效率取决于搜索过程中元素的比较次数。理想的搜索方法:可以不经过任何比较,一次直接从表中得到要搜索的元素。 如果构造一种存储结构,通过某种函数(hashFunc)使元素的存储位置与它的关键码之间能够建立一一映射的关系,那么在查找时通过该函数可以很快找到该元素。当向该结构中:1.插入元素根据待插入原创 2021-05-18 19:30:08 · 124 阅读 · 0 评论 -
二叉搜索树
二叉搜索树又称二叉排序树,它或者是一棵空树**,或者是具有以下性质的二叉树:若它的左子树不为空,则左子树上所有节点的值都小于根节点的值若它的右子树不为空,则右子树上所有节点的值都大于根节点的值它的左右子树也分别为二叉搜索树nt a [] = {5,3,4,1,7,8,2,6,0,9};二叉树的操作首先构造一个树结构public class BinaryTree { public Node root; static class Node { public i原创 2021-05-17 16:43:44 · 78 阅读 · 0 评论 -
排序
排序一级目录1.插入排序2.选择排序3.希尔排序归并排序冒泡排序堆排序排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。平时的上下文中,如果提到排序,通常指的是排升序(非降序)。通常意义上的排序,都是指的原地排序(in place sort)。一级目录1.插入排序原理:整个区间被分为有序区间无序区间每次选择无序区间的第一个元素,在有序区间内选择合适的位置插入public class DirectSort { public static vo原创 2021-05-14 23:37:35 · 137 阅读 · 0 评论 -
Java的堆
堆一、什么是堆堆就是用数组实现的二叉树,所以它没有使用父指针或者子指针。堆根据“堆属性”来排序,“堆属性”决定了树中节点的位置。1. 二叉树的顺序存储2.堆的概念堆逻辑上是一棵完全二叉树堆物理上是保存在数组中满足任意结点的值都大于其子树中结点的值,叫做大堆,或者大根堆,或者最大堆反之,则是小堆,或者小根堆,或者最小堆堆的作用就是找最值二、堆的操作array 代表存储堆的数组len代表数组中被视为堆数据的个数parent代表要调整位置的下标child代表 parent 左孩原创 2021-05-14 20:42:57 · 293 阅读 · 0 评论 -
反转一句英文中每个单词的字母顺序
1.先要以字符串形式存储这句话2.用spilt分割字符串,存储到字节数组当中3.将字节数组中的每一个元素反转,然后存储import java.util.Scanner;/** * 将一个英文文本的每个单词进行反转 * Guity */public class Test4 { public static void main(String[] args) { Scanner scanner=new Scanner(System.in); String s原创 2021-04-29 07:19:19 · 454 阅读 · 0 评论 -
输出一句英文话语中的单词数量
输出一句英文话语中的全部英文单词,因为要求的是单词的个数。所以第一步将所有其他符号都转成相同的符号,然后用spilt方法将字符串进行拆分,最后放入字节数组当中,字节数组的容量就是单词数量。public class Test { public static void main1(String[] args) { Scanner scanner=new Scanner(System.in); String str=scanner.nextLine();//输入字符串原创 2021-04-29 07:01:05 · 915 阅读 · 0 评论 -
Java 利用泛型创建扑克牌
创建一个关于card的包public class Card {//创建card类 public String suit;//属性花色suit public int num;//属性数字num public Card(String suit,int num){//构造函数 this.num=num; this.suit=suit; } public String toString(){ return String.form原创 2021-04-27 01:09:07 · 125 阅读 · 0 评论 -
Java声明和抛出异常
声明和抛出异常1.使用throws声明异常2.throw语句3.自定义异常注意事项1.使用throws声明异常在有些情况下,一个方法不能处理或者不知道怎么处理异常的时候,可以通过throws向上传递,由调用它的方法来处理,直到main()方法。public class ExceptionTest { public static void num(int x)throws ArithmeticException{ int y=100/x; } public sta原创 2021-04-25 20:56:03 · 760 阅读 · 0 评论 -
Java异常概述
Java异常概述1.java的异常处理机制2.java的异常类型3.捕获异常a.try和catch语句使用多个catch捕获可能产生的多个异常Exception异常类的应用b.finally语句所谓异常,是指程序运行过程中遇到的非致命错误,注意不是编译时的语法错误,这些事件的发生会阻碍程序的正常运行。1.java的异常处理机制Java中的异常可以是函数中的语句执行时引发的,也可以是程序员通过throw 语句手动抛出的,只要在Java程序中产生了异常,就会用一个对应类型的异常对象来封装异常,JRE就会试原创 2021-04-25 20:13:31 · 237 阅读 · 0 评论 -
图书馆代码练习
图书馆代码一、核心需求二、类的设计1.创建图书相关的类a.创建一个Book类,表示每一本书b.创建BookList类,保存书2.创建操作图书的类3.创建适用对象的类a.创建一个user抽象类b.创建子类Admina.创建子类Student4.主类三、具体实现每个对图书的操作一、核心需求1、简单的登录2、管理端整理书籍(该功能为可扩展功能)查阅书籍增加书籍删除书籍打印书籍列表退出3、用户端查询书籍借阅书籍归还书籍退出二、类的设计1.创建图书相关的类创建一个包package b原创 2021-04-23 20:24:45 · 548 阅读 · 0 评论 -
Java的抽象类与接口
抽象类与接口抽象类与方法接口的声明以及实现implements关键字多重继承接口的继承我们通常说四边形是四条边,三角形是三条边,这些都可以通过语言进行描述,但是对于图形却不能通过具体的语言进行描述,有几个边,长什么样子,没人能说清楚,像这样的类在Java中就叫做抽象类。抽象类与方法在解决实际问题时,一定是将父类定义为抽象类,需要使用对这个父类进行继承与多态处理。而在多态应用中,并不需要对父类对象,需要的只是子类对象,所以在Java中设置抽象类一定不可以实例化对象,但是它的子类可以进行实例化。定义抽象原创 2021-04-21 16:44:48 · 167 阅读 · 0 评论 -
Java的继承
继承extends语法规则proctected关键字更复杂的继承final关键字代码中创建的类,主要都是为了抽象现实中的事物;例如:public class Animal { public String name; public int age; public Animal(String name, int age) { this.name = name; this.age = age; } public void sleep(原创 2021-04-20 20:44:52 · 203 阅读 · 0 评论 -
Java的包
包(package)将类放到包中二级目录三级目录包是组织类的一种方式目的是为了保证类的唯一性,解决类名的冲突一个类总是属于一个包如果没有被定义,那么这个类是被放在一个默认的包中将类放到包中二级目录三级目录...原创 2021-04-20 19:51:25 · 82 阅读 · 0 评论 -
单链表的实现
无向单链表的实现定义一个类Node,表示链表的节点构造链表1.使用头插法插入节点2.使用尾插法插入节点3.任意位置插入二、基本方法的实现1.遍历节点进行打印2.从指定结点开始打印3.找第n-个节点位置4.求链表长度5.查找是否有关键字key6.删除关键字key7.找key的前置节点8.删除所有key9.反转链表A.B.10.求中间节点11.将所有小于x的值放于其余值之前12.删除所有重复节点13.判断是否为回文结构14.判断一个链表是否成环链表15.找到环链表的入环点16.输出倒数第k个节点定义一个类No原创 2021-04-18 22:48:22 · 254 阅读 · 0 评论 -
链表的概念和结构
链表的概念和结构1.单链表2.双向链表3.循环链表链表是一种物理存储结构上非连续的存储元素,数据元素的逻辑顺序是通过链表的引用链接依次实现的。1.单链表单链表的结点只有一个指向,即后继指针next指向下一个结点。2.双向链表双向链表的结点有两个指向,一个后继指针next指向下一个结点,还有一个前驱指针prev指向上一个结点。单链表和双向链表的区别:每个结点除了存储数据data外,还会会记录上一个结点和下一个结点的地址。3.循环链表循环链表的尾结点不指向空,而是指向头结点,类似一个环形原创 2021-04-18 21:59:33 · 493 阅读 · 0 评论 -
Java的关于对象的使用
对象类的目的是创建具有属性和方法的对象,这些对象可以操作自己的变量对自己进行“设置”,还可以调用类中的方法进行一定的行为。通过使用运算符“.”实现对自己的设置和调用方法/创建一个类叫sanguoDemopublic class sanguoDemo { String name; float high; float tall; String symbol;//每个sanguoDemo的属性 //定义一个togetherSpeak实例方法 public v原创 2021-04-12 16:43:58 · 287 阅读 · 0 评论 -
关于java的自动运算提升
1、基本数据类型之间的运算前提:这里只是讨论7种基础数据类型之间的运算不包括boolean型1·当容量小的数据类型与容量大的数据类型之间运算时,自动转换为容量大的数据类型基本数据类型的容量大小排行,注意这里的容量表示的是这个数据类型所能表示的数值范围的大小,不是所占空间的大小...原创 2021-04-12 15:26:06 · 111 阅读 · 0 评论 -
Java-关于类和对象
1、初步认知C语言是**面向过程**(注重过程,在整个过程中涉及的行为,就是方法)的,分析出求解问题的步骤,通过函数调用解决问题。Java是基于**面向对象**(注重的是对象,对象就是参与过程所涉及的主体,通过逻辑将一个个主体连接起来)的,将一件事情拆分成不同的对象,靠对象之间的交互完成的。类就是一类对象的统称,对象就是这一类的具体化实现。简而言之面向对象就是用代码来描述客观世界事物的一种方式。2、类和类的实例化类就是一类对象的统称,对象就是这一类的具体化实现。简单的例子:月饼模子(类) 月原创 2021-04-11 09:41:14 · 143 阅读 · 0 评论