自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(52)
  • 问答 (1)
  • 收藏
  • 关注

原创 使用eclipse查看字节码文件(javap -c)

一、运行eclipse自带的终端如果还没有配置过的可以看我下面链接的文章:https://blog.csdn.net/weixin_44741522/article/details/1136497501.设置类如下所示2.切换到该项目的src目录下3.通过javap指令反编译其中我们通过帮助指令发现 -c 可以进行反汇编4.执行javap的-c指令可以得到编译器生成的字节码...

2021-02-04 19:11:47 1163

原创 用命令行(终端)来运行.java文件的方法(eclipse)

用eclipse自带终端1.首先我们如下图所示操作,选择others2.找到如下图所示我们所需要的Terminal,点击打开3.完成上述的操作后我们就可以得到如下所示的图并且点击上面红色箭头!!!如果点击这个没有反应(我就是这种情况),我们继续往下看4.如上图操作,我们点击外部工具配置,出现如下图所示:名称我们可以随便起,其中注意位置我们需要选择cmd的文件位置,工作目录即选eclipse的默认工作空间即可5.点击公共common视图...

2021-02-04 16:15:56 3055 3

转载 JAVA设计模式之工厂模式(简单工厂模式+工厂方法模式+抽象工厂模式)

转载自博客:http://blog.csdn.net/jason0539在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的。但是在一些情况下, new操作符直接生成对象会带来一些问题。举例来说, 许多类型对象的创造需要一系列的步骤: 你可能需要计算或取得对象的初始设置; 选择生成哪个子对象实例; 或在生成你需要的对象之前必须先生成一些辅助功能的对象。 在这些情况,新对象的建立就是一个 “过程”,不仅是一个操作,像一部大机器中的一个齿轮传动。模式的问题:

2020-11-18 21:18:29 245

原创 HashMap 底层实现原理是什么?JDK8 做了哪些优化?

第02讲:HashMap 底层实现原理是什么?JDK8 做了哪些优化?HashMap 是使用频率最高的类型之一,同时也是面试经常被问到的问题之一,这是因为 HashMap 的知识点有很多,同时它又属于 Java 基础知识的一部分,因此在面试中经常被问到。本课时的面试题是,HashMap 底层是如何实现的?在 JDK 1.8 中它都做了哪些优化?典型回答在 JDK 1.7 中 HashMap 是以数组加链表的形式组成的,JDK 1.8 之后新增了红黑树的组成结构,当链表大于 8 并且容量大于 64 时

2020-11-11 16:24:54 217

原创 String 的特点是什么?它有哪些重要的方法?

第01讲:String 的特点是什么?它有哪些重要的方法?String 是如何实现的?它有哪些重要的方法?典型回答以主流的 JDK 版本 1.8 来说,String 内部实际存储结构为 char 数组,源码如下:public final class String implements java.io.Serializable, Comparable<String>, CharSequence { // 用于存储字符串的值 private final char

2020-11-11 15:58:13 279

原创 牛客java错题整理

牛客Java错题8.61.java如何返回request范围内存在的对象request.getAttribute()方法返回request范围内存在的对象,而request.getParameter()方法是获取http提交过来的数据。getAttribute是返回对象,getParameter是返回字符串。2.下列不属于算法结构的是算法包括0个或多个输入,1个或多个输出,中间有穷个处理过程。而存储结构是属于数据结构,不属于算法结构。3.在Java图形用户界面编程中,如果需要提示信息,一般用什么

2020-08-13 13:10:40 2225

原创 JAVA中的反射机制

反射是框架设计的灵魂(使用的前提条件:必须先得到代表的字节码的Class,Class类用于表示.class文件(字节码))一、反射的概念主要是指程序可以访问,检测和修改它本身状态或行为的一种能力,并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义。反射就是把java类中的各种成分映射成一个个的Java对象。例如:一个类有:成员变量、方法、构造方法、包等等信息,利用反射技术可以对一个类进行解剖,把个个组成部分映射成一个个对象。(其实:一个类中这些成员方法、构造方法、在加入类中都

2020-08-12 15:57:23 142

原创 数据结构之——树(二)

二叉树的二叉链表实现对二叉树的操作由二叉树结点类和二叉树类共同。采用二叉链表的二叉树结点类和二叉树类设计如下。1.二叉链表结点类声明二叉树的二叉链表结点类BinaryNode< T >如下,T指定结点的元素类型。package Tree;public class BinaryNode<T> { //二叉树的二叉链表结点类,T指定结点的元素类型 public T data; //数据域,存储数据元素 public BinaryNode<T> left,r

2020-08-10 20:34:49 480

原创 数据结构之——树(一)

树定义树(Tree)是由n个结点组成的有限集合(树中的元素通常称为结点)。n=0的树称为空树;n>0的树T由以下两个条件约定构成:(1)有一个特殊的结点称为根(Root)结点,它只有后继结点,没有前驱结点。(2)除根节点之外其他结点分为m(-1<m<n)个互不相交的集合T0、T1…Tm-1,其中每个集合也具有树结构,称为根的子树。树是递归定义的。结点是树的基本单位,若干个结点组成一棵子树,若干互不相交的子树组成一棵树。树中每个结点都是该树中某一棵子树的根。因此,树是由结点组成的、结

2020-08-10 17:28:18 627

原创 JAVA异常处理机制(一)

首先通过一道牛客网的JAVA题引入:下面让我们回顾一下相关知识。一、JAVA异常异常指不期而至的各种状况,如:文件找不到、网络连接失败、非法参数等。异常是一个事件,它发生在程序运行期间,干扰了正常的指令流程。Java通 过API中Throwable类的众多子类描述各种不同的异常。因而,Java异常都是对象,是Throwable子类的实例,描述了出现在一段编码中的 错误条件。当条件生成时,错误将引发异常。Java异常类层次结构图:在 Java 中,所有的异常都有一个共同的祖先 Throwable

2020-08-09 16:08:19 213 1

原创 Java线程状态切换

首先我们还是以一个牛客网上错题例子来引入:下面来看下线程间的状态转换:1.新建(new):新创建了一个线程对象。2.可运行(runnable):线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获取cpu的使用权。3.运行(running):可运行状态(runnable)的线程获得了cpu时间片(timeslice),执行程序代码。4.阻塞(block):阻塞状态是指线程因为某种原因放弃了cpu使用权,也即让出了cp

2020-08-09 13:07:46 207

原创 JAVA集合框架之——HashMap

HashMap也是我们使用非常多的Collection,它是基于哈希表的 Map 接口的实现,以key-value的形式存在。在HashMap中,key-value总是会当做一个整体来处理,系统会根据hash算法来来计算key-value的存储位置,我们总是可以通过key快速地存、取value。下面就来分析HashMap的存取。一、定义HashMap实现了Map接口,继承AbstractMap。其中Map接口定义了键映射到值的规则,而AbstractMap类提供 Map 接口的骨干实现,以最大限度地减少

2020-08-08 19:56:17 147

原创 单例模式

JAVA设计模式之单例模式下面我们来介绍一下23种设计模式之单例模式:概念:java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍三种:懒汉式单例、饿汉式单例、登记式单例(可以忽略)。单例模式有以下特点:  1、单例类只能有一个实例。  2、单例类必须自己创建自己的唯一实例。  3、单例类必须给所有其他对象提供这一实例。  单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。在计算机系统中,线程池、缓存、日志对象、对话框、打印机、显卡的驱动程序对象

2020-08-07 23:05:37 121

原创 JVM内存回收之——复制算法与标记-整理算法

我们在上一篇博客中介绍了标记——清除算法,这篇博客中介绍的两种算法就是在标记——清除算法的基础上演化而来。下面让我们具体来看看这两种算法,分别做了哪些优化呢?复制算法我们首先一起来看一下复制算法的做法,复制算法将内存划分为两个区间,在任意时间点,所有动态分配的对象都只能分配在其中一个区间(称为活动区间),而另外一个区间(称为空闲区间)则是空闲的。当有效内存空间耗尽时,JVM将暂停程序运行,开启复制算法GC线程。接下来GC线程会将活动区间内的存活对象,全部复制到空闲区间,且严格按照内存地址依次排列,与此

2020-08-06 11:12:03 1545

原创 JVM内存回收之——标记-清除算法

标记——清除算法标记-清除算法也叫Mark-Sweep算法,分为“标记”和“清除”两个阶段:首先标记出所有需要回收的对象,标记完成后统一回收所有被标记的对象。因为我们在程序(程序也就是指我们运行在JVM上的JAVA程序)运行期间如果想进行垃圾回收,就必须让GC线程与程序当中的线程互相配合,才能在不影响程序运行的前提下,顺利的将垃圾进行回收。为了达到这个目的,标记/清除算法就应运而生了。它的做法是当堆中的有效内存空间(available memory)被耗尽的时候,就会停止整个程序(也被成为stop th

2020-08-06 10:20:27 495

原创 原码、反码、补码的总结和理解

原码、反码、补码结束了上一篇各种进制的转换,我们来谈谈另一个话题:原码、反码、补码。我们已经知道计算机中,所有数据最终都是使用二进制数表达。我们也已经学会如何将一个10进制数如何转换为二进制数。不过,我们仍然没有学习一个负数如何用二进制表达。比如,假设有一 int 类型的数,值为5,那么,我们知道它在计算机中表示为:00000000 00000000 00000000 000001015转换成二制是101,不过int类型的数占用4字节(32位),所以前面填了一堆0。现在想知道,-5在计算机

2020-08-05 13:08:36 217 1

原创 进制的转换

例题引入首先我们由牛客网上一道Java专项练习题引入:那我们先来看一下八进制的13如何转十进制:八进制的14转为十进制:八进制的204转为十进制:所以可得:11 x12=132由此可知该题选A。那么正确的做法应该是怎么样的呢?首先我们可以假设这个式子现在是x进制对A选项来说,我们可以得出如下的公式:最后解得x=8或者x=-1(不符合题意直接去掉)即我们计算出该条式子采用的是八进制。下面让我们来系统学习一下各机制之间是如何转换的。1.十进制与二进制之间的相互转换(1)十进

2020-08-05 10:12:20 455 1

原创 Java类加载机制的理解

最近在刷牛客上的Java笔试题遇到过不少关于类加载的题目,发现完全就像一个未知领域一样,下面就让我们来一起看看类加载到底是个什么东西。一、什么是类的加载在介绍类的加载机制之前,先来看看,类的加载机制在整个java程序运行期间处于一个什么环节,下面使用一张图来表示:从上图可以看,java文件通过编译器变成了.class文件,接下来类加载器又将这些.class文件加载到JVM中。其中类装载器的作用其实就是类的加载。今天我们要讨论的就是这个环节。有了这个印象之后我们再来看类的加载的概念:其实可以一句话来

2020-08-01 10:15:50 212 1

原创 数据结构之——数组

数组数组是顺序存储的随机存取结构,是其他数据结构实现顺序存储的基础。一维数组的逻辑结构是线性表,多维数组是线性表的拓展。下面就让我们以二维数组为例,说明多维数组的逻辑结构、遍历和存储结构。1.二维数组的逻辑结构二维数组是一维数组的扩展,二维数组是“元素为一维数组”的一维数组。一个m行n列的二维数组,既可以看成由m个一维数组(行)所组成的线性表,也可以看成n个一维数组(列)所组成的线性表其中,每个元素aij(-1<i<m,-1<j<n)同时属于两个线性表:第i行的线性表和第j

2020-07-31 12:06:43 2237

原创 合并两个有序链表

最近在巩固链表知识的时候去LeetCode上刷了些题,首先选了一道难度标注简单的链表题。废话不多说我们直接来看题目:将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。代码原始模板如下:最开始想到的就是暴力解法,就是将两个链表数据都取出放到整数数组中来,然后升序排序,然后依次插入到一个新链表中。不过后面想到另外一个不用新建链表的办法就是增加一个哑结点,即ListNode dummy=new ListNode(0),接着我们可用一个指针p来指向哑结点。首先

2020-07-30 19:11:53 289

原创 数据结构之——队列

队列抽象数据类型队列(queue)是一种特殊的线性表,其插入和删除操作分别在线性表的两端进行。向队列中插入元素的过程称为入队,删除元素的过程称为出队。允许入队的一端叫做队尾,允许出队的一端叫做队头。没有元素的队列称为空队列。由于插入和删除分别在队尾和队头进行,最先入队的总是最先出队。因此队列的特点是“先进先出”。队列的基本操作有创建队列、判断队列是否为空、入队和出队。队列和栈一样,不支持对指定位置的插入和删除。声明队列接口Queue< T >如下package Queue;publi

2020-07-29 18:34:33 368

原创 数据结构之——栈

栈抽象数据类型栈(Stack)是一种特殊的线性表,其插入和删除只允许在线性表的一端进行。允许操作的一端称为栈顶(Top),不允许操作的一端称为栈底(Bottom)。栈中插入元素的操作称为入栈(Push),删除元素的操作称为出栈(Pop)。没有元素的栈称为空栈。由于栈的插入和删除只能在栈顶进行,每次入栈元素即成为栈顶元素,每次出栈元素总是最后一个入栈元素,因此栈的特点就是先进后出。栈的基本操作包括创建栈、判断栈是否为空、入栈、出栈和取出栈顶元素等。栈不支持对指定位置的插入、删除等操作。现在声明栈接口如下,

2020-07-28 23:31:05 453 1

原创 关于哑结点的使用

哑结点哑节点是在处理与链表相关的操作时,设置在链表头之前的指向链表头的节点,用于简化与链表头相关的操作。这是我在LeetCode上刷题学到了这个知识,因为LeetCode上的题的测试用例都是在头结点就已经存储数据,所以我们需要一个哑结点,放在头结点的前面。哑结点的声明:ListNode dummy = new ListNode(0);dummy.next = head;//head是链表的头节点,dummy就是指向链表头部的哑节点。通过这样完美解决一旦头结点被删除无法返回元素的问题。...

2020-07-27 19:18:02 922 1

原创 线性表(2)——单链表

概念:单链表是由一个个结点链接而成的,而结点是存储一个数据元素的存储单元。一个结点至少包括以下两个部分:结点(数据域,地址域),其中数据域用于存储数据元素,地址域存储前驱或者后续元素的地址。以下定义单链表结点类和单链表类描述单链表。首先声明单链表结点类Node的泛型类如下,成员变量data表示结点的数据域,存储数据元素,数据类型是T;next表示结点的地址域,存储后继结点的引用信息。package dataStructure;public class Node<T> { public

2020-07-27 17:19:28 567

原创 线性表(1)——顺序表

线性表的顺序存储结构称为顺序表,它使用一维数组依次存放线性表的数据元素。顺序表是一种随机存取结构。下面我们来看一下顺序表类的设计与实现。声明顺序类SeqList< T >如下,有两个具有保护权限的成员变量element和n,element数组存放数据元素,元素类型为T;n表示顺序表元素个数,0=<n<element.length。package dataStructure;//顺序表类,实现ADTList<T>声明的方法,T表示数据元素public clas

2020-07-27 10:30:55 842 1

原创 Java——抽象类与接口

抽象类与接口是java语言中对抽象概念进行定义的两种机制,正是由于他们的存在才赋予java强大的面向对象的能力。他们两者之间对抽象概念的支持有很大的相似,甚至可以互换,但是也有区别。一、抽象类我们都知道在面向对象的领域一切都是对象,同时所有的对象都是通过类来描述的,但是并不是所有的类都是来描述对象的。如果一个类没有足够的信息来描述一个具体的对象,而需要其他具体的类来支撑它,那么这样的类我们称它为抽象类。比如new Animal(),我们都知道这个是产生一个动物Animal对象,但是这个Animal具体长

2020-07-21 19:23:09 148

原创 排序算法(2)——快速排序

快速排序由于排序效率在同为O(N*logN)的几种排序方法中效率较高,因此经常被采用,再加上快速排序思想——分治法也确实实用。但要直接默写出快速排序还是有一定难度的,下面就让我们来看下何为快速排序。快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序。它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod)。该方法的基本思想是:1.先从数列中取出一个数作为基准数。2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。3.再对

2020-07-20 16:07:17 222

原创 排序算法(1)——冒泡排序

冒泡排序(Bubble Sort)是一种典型的交换排序算法,通过交换数据元素的位置进行排序。一、算法基本思想(1)基本思想冒泡排序的基本思想就是:从无序序列头部开始,进行两两比较,根据大小交换位置,直到最后将最大(小)的数据元素交换到了无序队列的队尾,从而成为有序序列的一部分;下一次继续这个过程,直到所有数据元素都排好序。算法的核心在于每次通过两两比较交换位置,选出剩余无序序列里最大(小)的数据元素放到队尾。(2)运行过程冒泡排序算法的运作如下:1、比较相邻的元素。如果第一个比第二个大(小),

2020-07-20 10:40:39 853

原创 Java集合的迭代——Iterator

迭代对于我们搞Java的来说绝对不陌生。我们常常使用JDK提供的迭代接口进行Java集合的迭代。迭代其实我们可以简单地理解为遍历,是一个标准化遍历各类容器里面的所有对象的方法类,它是一个很典型的设计模式。Iterator模式是用于遍历集合类的标准访问方法。它可以把访问逻辑从不同类型的集合类中抽象出来,从而避免向客户端暴露集合的内部结构。 在没有迭代器时我们都是这么进行处理的。如下:对于数组我们是使用下标来进行处理的:对于ArrayList是这么处理的:对于这两种方式,我们总是都事先知道集合的内

2020-07-19 17:29:57 921

原创 用两个栈实现一个队列

最初重温了下数据结构的栈和队列的基本使用,想要在LeetCode上刷下题巩固,首先选了道标注简单难度的题,结果最开始就看懵了,不太理解它的输入输出是怎么理解,下面我们就来看一下题目描述:以下是初始代码模板:下面我来带没看懂的朋友理解一下这个输入输出的意思:输入: [“CQueue”,“appendTail”,“deleteHead”,“deleteHead”] 这里是要执行的方法,从左到右执行[[],[3],[],[]]对应上面的方法,是上面方法的参数。CQueue和deleteHead方法不需

2020-07-19 10:24:53 364

转载 深入理解List的toArray()方法和toArray(T[] a)方法

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。原文链接:https://blog.csdn.net/mucaoyx/article/details/86005283深入理解List的toArray()方法和toArray(T[] a)方法这两个方法都是将列表List中的元素转导出为数组,不同的是,toArray()方法导出的是Object类型数组,而toArray[T[] a]方法导出的是指定类型的数组。下面是两个方法的申明及说明,摘自J.

2020-07-18 19:09:34 474

原创 Web中的过滤器

web中的过滤器1.概念Filter,过滤器的意思,在web中是对客户端访问资源的过滤,符合条件放行,不符合条件过滤。在Java里肯定会有一个类或者接口与其对应,因为有制定规则的作用,在这儿对应的是接口。下面让我们来看Filter接口源码:从图中我们可以看到有三个方法,下面一一介绍:(1)init()方法初始化的意思,其有一个参数FilterConfig,这也很好理解,初始化的时候需要获取配置信息。(2)doFilter()方法毫无疑问,核心方法就在该方法中。具体要怎么过滤,肯定也就是对

2020-07-18 17:41:18 925

原创 Java疑难点总结(二)

2.集合2.1. Arrays.asList()使用指南2.1.1. 简介Arrays.asList()在平时开发中还是比较常见的,我们可以使用它将一个数组转换为一个List集合。JDK 源码对于这个方法的说明:2.1.2. 《阿里巴巴Java 开发手册》对其的描述Arrays.asList()将数组转换为集合后,底层其实还是数组,《阿里巴巴Java 开发手册》对于这个方法有如下描述:2.1.3. 使用时的注意事项总结传递的数组必须是对象数组,而不是基本类型。Arrays.asLis

2020-07-17 17:13:17 149

原创 Java疑难点总结(一)

1.基础1.1. 正确使用 equals 方法Object的equals方法容易抛空指针异常,应使用常量或确定有值的对象来调用 equals。举个例子:运行上面的程序会抛出空指针异常,但是我们把第二行的条件判断语句改为下面这样的话,就不会抛出空指针异常,else 语句块得到执行。...

2020-07-16 17:17:25 181

原创 Java基础知识点汇总(四)

31.Java序列化中如果有些字段不想进行序列化,怎么办?对于不想进行序列化的变量,使用transient关键字修饰。transient关键字的作用是:阻止实例中那些用此关键字修饰的的变量序列化;当对象被反序列化时,被transient修饰的变量值不会被持久化和恢复。transient只能修饰变量,不能修饰类和方法。32.获取用键盘输入常用的两种方法方法1:通过 Scanner(最常用也是最强大的方法)方法2:通过 BufferedReader33.Java 中 IO 流Java 中 IO

2020-07-16 10:42:34 288

原创 Java基础知识点汇总(三)

21.构造方法有哪些特性?1.名字与类名相同。2.没有返回值,但不能用void声明构造函数。3.生成类的对象时自动执行,无需调用。22.静态方法和实例方法有何不同?1.在外部调用静态方法时,可以使用”类名.方法名”的方式,也可以使用”对象名.方法名”的方式。而实例方法只有后面这种方式。也就是说,调用静态方法可以无需创建对象。2.静态方法在访问本类的成员时,只允许访问静态成员(即静态成员变量和静态方法),而不允许访问实例成员变量和实例方法;实例方法则无此限制。23.对象的相等与指向他们的引用相等

2020-07-15 09:51:27 214

原创 Java基础知识点汇总(二)

11.String StringBuffer 和 StringBuilder 的区别是什么? String 为什么是不可变的?可变性简单的来说:String 类中使用 final 关键字修饰字符数组来保存字符串,private final char value[],所以 String 对象是不可变的。而StringBuilder 与 StringBuffer 都继承自 AbstractStringBuilder 类,在 AbstractStringBuilder 中也是使用字符数组保存字符串char[]

2020-07-05 18:46:00 207

原创 Java中的构造方法以及this的使用

文章目录构造方法定义无参的构造方法有参的构造方法构造方法的重载注意this关键字的使用总结构造方法定义构造方法需要满足以下条件:1.方法名要与类名相同2.在方法名的前面没有返回值类型声明3.在方法中不能使用return语句返回无参的构造方法package game;class Student{ public Student() { System.out.println("无参的构造方法被调用"); }}public class text_2 { public static v

2020-07-05 17:11:29 2469

转载 重学TCP/IP协议和三次握手四次挥手

这里写自定义目录标题

2020-07-05 12:25:31 192

原创 csdn博文添加目录

第一次添加目录,之前看到有人写博客有,但一直不知道怎么做,今天学会了,总结一下:直接上图解释:目录最开始的文字显示通过@[TOC](xxx),然后把括号里的xxx改成你想要的目录接着如果你想弄一级目录,就# 再加上一个空格,后面跟上你的目录名称二级目录即两个#号即可!!!一定注意#号后加上一个空格...

2020-07-04 21:37:33 235

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除