java
retemin
脑子不好就多努力一点
展开
-
JVM对象的分配过程
二话不说,直接上图解释:java虚拟机在类加载后,将为新生对象分配内存空间,虚拟机将在java堆中划分一块确定大小的内存。栈上分配但是在此之前,虚拟机首先会在栈上分配空间,如果栈上可以分配,便可以在栈中分配,无需GC介入。(对象小,对象简单,使用标量替换:将简单对象的变量直接声明在栈上,用标记标记为同一个对象,且对象不会产生逃逸现象:只在当前栈帧(方法)中存在,不会在其他地方调用)。堆...原创 2020-04-10 23:53:40 · 681 阅读 · 0 评论 -
Volatile对于引用对象的修饰
奇怪的知识故事是这样的:说是有一道阿里的面试题,是这样描述的:给定一个容器,提供两个方法add,size,写两个线程:线程一:添加10个元素到容器中线程二:实现监控元素个数,当个数到5个的时候,线程2给出提示并结束多线程的一道题,肯定不会啊,那面向百度编程。先按照正常思路码代码:public class WithoutVolatile {//提供一个容器 List list...原创 2020-04-05 02:55:39 · 3515 阅读 · 6 评论 -
源码-补码-反码
一道简单的面试题,发现自己的bug题目int a = 4;System.out.println(~a);int b = -4;System.out.println(~b);问:程序输出什么答案:-5和3解释前提:一个字节有8位,首位为符号位,1为负数,0为正数。如10000001 = -1(十进制),00000001 = 1(十进制)正数补码 = 原码负数补码在计算的时候...原创 2020-03-17 17:21:39 · 214 阅读 · 0 评论 -
职责链模式
基本介绍1、职责链模式又叫责任链模式,为请求创建了一个接受者对象的链,这种模式对请求的发送者和接受者进行解耦2、职责链模式通常每个接收者都包含对另一个接收者的引用,如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接受者,以此类推3、这是一种行为型设计模式使得多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,知道有...原创 2020-02-10 13:58:06 · 174 阅读 · 0 评论 -
UML类图介绍
UML基本介绍UML:统一建模语言UML有一套符号具体介绍UML类图的分类:1、用例图2、静态结构图:类图、对象图、包图、组件图、部署图3、动态行为图:交互图(时序图与协作图)、状态图、活动图类图是描述类与类之间的关系,是UML图中最核心的类之间的关系有:依赖,泛化(继承),实现、关联、聚合与组合类图-依赖关系只要在类中用了对方,那么他们之间就存在依赖关系,如果没有对方,编...原创 2020-02-09 15:38:28 · 184 阅读 · 0 评论 -
设计模式概述
设计模式的目的代码可重用性(相同功能的代码,不用多次编写)可读性(编程规范性)可扩展性(增加新的功能时,非常方便,可维护)可靠性(增加新的功能,对原来的功能没有影响)使程序呈现高内聚,低耦合的特性设计模式的七大原则单一职责原则接口隔离原则依赖倒转(倒置)原则里氏替换原则开闭原则(OCP)迪米特法则合成复用1、单一职责原则基本介绍:对类来说,即一个类应该只负责...原创 2020-02-08 18:48:28 · 206 阅读 · 0 评论 -
代理模式
基本介绍代理模式:为一个对象提供一个替身,以控制对这个对象的访问。即通过代理对象访问目标对象。好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能。被代理的对象可以是远程对象,创建开销大的对象或需要安全控制的对象代理模式有不同的形式,主要有三种 静态模式,动态代理模式(JDK代理,接口代理)和Cglib代理(可以在内存动态地创建对象,而不需要实现接口)UML类图如...原创 2020-02-07 17:07:43 · 160 阅读 · 0 评论 -
适配器模式
基本介绍适配器模式(Adapter Pattern) 将某个类的接口转换成客户端期望的另一个接口表示,主要目的是兼容性,将原本接口不匹配不能一起工作的两个类可以协调工作,别名是包装器(Wrapper)适配器模式属于结构型模式(没有产生新的对象)主要有三类:类适配器模式,对象适配器模式,接口适配器模式工作原理适配器模式:将一个类的接口转换成另一种接口,让原本接口不兼容的类可以兼容从...原创 2020-02-06 17:36:51 · 151 阅读 · 0 评论 -
原型模式
问题描述现在有一只羊tom,姓名为tom,年龄为1,颜色为白色,请编写程序创建和tom属性完全相同的10只羊传统思维直接new出一个对象优点:比较好理解,简单易操作缺点:在创建新的对象的时候,总是需要重新获取原始对象的属性,如果创建的对象比较复杂时,效率低。总是需要重新初始化对象,而不是动态的对象运行时的状态,不够灵活使用原型模式概括原型模式是指:用原型实例指定创建对象的...原创 2020-02-05 20:33:40 · 170 阅读 · 0 评论 -
观察者模式
概述观察者模式是对象间多对一依赖的一种设计方案,被依赖的对象为Subject,依赖的对象为Observer,Subject通知bserver变化。也就是开闭原则例子需求气象站可以每天测量到温度,湿度,气压等以公告的形式发布出去。需要设计开放型api,便于其他第三方也可以接入气象台获取数据提供温度,湿度,气压的接口测量数据更新时,实时通知第三方传统思维创建一个WeatherDa...原创 2020-02-05 10:29:27 · 111 阅读 · 0 评论 -
抽象工厂模式
概述抽象工厂模式定义一个interface用于创建相关或者有依赖关系的对象簇,而无需指明具体的类抽象工厂模式可以将简单工厂模式和工厂方法模式进行整合抽象工厂模式是简单工厂模式的改进(进一步抽象)将工厂抽象成两层,AbstractFactory和集体实现的工厂子类,程序员可以根据创建对象类型使用对应的工厂子类,这样将单个的简单工厂变成工厂簇,更利于代码的维护和扩展。实例Pizza抽象...原创 2020-02-03 21:39:21 · 92 阅读 · 0 评论 -
工厂方法模式
概述工厂方法模式:定义一个创建对象的抽象方法,由子类决定要实例化的类,工厂方法模式将对象的实例化推迟到子类。工厂方法模式将工厂抽象起来,让其子类去实现。工厂方法模式可以比作:生产 - 工厂 - 消费每一个工厂有一个总部,分部的工厂就是实现类,每个实现类都有自己对应的生产类型实例pizza的实现类,创建一个抽象类,另外还有继承了抽象类的具体pizza实现定义一个抽象工厂,其定义了Pi...原创 2020-02-03 14:24:06 · 95 阅读 · 0 评论 -
单例模式(静态内部类实现方式)
使用静态内部类实现懒加载class Singleton7{ //私有构造器 private Singleton7(){ } //编写静态内部类,该类中有一个静态属性Singleton, //这个类加载的时,内部类不会加载,实现懒加载的方式 private static class SingletonInstance{ private...原创 2020-02-03 10:15:35 · 343 阅读 · 0 评论 -
简单工厂模式
概述定义:定义一个工厂类,他可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类。在简单工厂模式中用于创建实例的方法通常是静态的方法,简单工厂模式又被称为静态工厂模式实例使用简单工厂模式,使得可以生产不同的pizza,如cheesePizza,GreekPizza等不同的Pizza,每一个Pizza都需要进行准备材料,做,切,打包等工作。创建一个简单工厂,工厂的逻辑...原创 2020-02-03 10:14:25 · 143 阅读 · 0 评论 -
单例模式之枚举
利用枚举实现单例模式enum Singleton8{ INSTANCE; public void sayOk(){ System.out.println("ok~"); }}借助jdk1.5新加的枚举,可以避免多线程问题,还可以防止反序列化重新创建新的对象。可以使用此种方法。单例模式在JDK源码中的体现public class Runtime {...原创 2020-02-02 10:30:08 · 221 阅读 · 0 评论 -
单例模式之懒汉式
采用懒加载的方式获取实例class Singleton3{ private static Singleton3 instance; private Singleton3(){ } //提供一个静态公有的方法,当使用的时候才实例化,实现懒汉式加载 public static Singleton3 getInstance(){ if(insta...原创 2020-02-01 11:21:29 · 105 阅读 · 0 评论 -
单例模式(静态常量)
单例模式的实现方式1,饿汉式静态常量方式通过返回一个静态常量,实现对象的单一形式class Singleton{ //构造器私有化,只能是类内部能new private Singleton(){ } //本地内部类创建实例 private final static Singleton instance = new Singleton(); //设置一个公...原创 2020-02-01 10:21:02 · 666 阅读 · 0 评论 -
初级排序算法
初级排序算法模板:定义了基本的辅助函数传入了实现了Comparable接口的数据类型的数组class Sort{ public void sort(Comparable [] a){} public static boolean less(Comparable v,Comparable w){ return v.compareTo(w)<0; ...原创 2019-11-18 23:13:18 · 110 阅读 · 0 评论 -
栈和队列
栈和队列题目:用两个栈实现队列用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。思路:栈是一种先进后出的数据结构,队列是一种先进先出的数据结构,两个栈,一个用来保存入栈,一个用来保存出栈的顺序public class Solution { Stack<Integer> stack1 = new Stack<Integer>...原创 2019-11-17 19:34:25 · 87 阅读 · 0 评论 -
二叉树的下一个节点
二叉树的下一个节点题目:给定一棵二叉树和其中的一个节点,如何找出中序遍历序列的下一个节点?树中的节点除了有两个分别指向左右节点的指针,还有一个指向父节点的指针思路:针对于中序遍历,具体做法是先遍历左子树,然后再遍历根节点,最后遍历右子树。我们在判断下一个节点的时候大概是这样一个思路,如果该节点有右子节点的话,进入右子树,然后遍历右子树的最左边的一个节点;如果给定的节点没有右子树,那么就...原创 2019-11-17 10:01:28 · 95 阅读 · 0 评论 -
树的基本操作
树题目:重构二叉树输入输入某二叉树的前序遍历和中序遍历的结果,请重构该二叉树。假设输入的前序遍历和中序遍历的结果中都不包含重复的数字。例如,输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},重建该树。树的结点类如下:class TreeNode{ int value; TreeNode left; TreeNode right; T...原创 2019-11-16 19:21:01 · 196 阅读 · 0 评论 -
链表操作(从尾到头打印数字)
链表操作(从尾到头打印数字)题目:输入一个链表的头结点,从尾到头返过来打印出每个节点的值,链表的定义如下:class ListNode{ int val; ListNode next = null; ListNode(int val){ this.val = val; }}解决方法:思路一:利用栈的数据结构,将链表遍历一遍,保存在栈中,利用...原创 2019-11-14 17:38:15 · 253 阅读 · 0 评论 -
字符串替换
字符串替换题目:实现一个函数,把字符串中的每个空格替换成“%20” ,例如,输入“We are happy”,输出“We%20are%20happy”解决:利用字符串替换,使用StringBuilder重新生成一个字符串public String replaceSpace(StringBuffer str) { StringBuilder sb = new StringB...原创 2019-11-14 10:44:56 · 143 阅读 · 0 评论 -
二维数组中的查找
二维数组中的查找题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序,请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数解决:思路一:暴力破解直接遍历一遍二维数组,就可以找出是否存在,这里的时间复杂度为O(n2) public boolean Find(int target, int [][] array) { ...原创 2019-11-14 10:11:50 · 145 阅读 · 0 评论 -
数组中重复的数字
数组中重复的数字问题描述:在一个长度为n的数组中的所有数字都在0~n-1范围内,数组中某些数字是重复的,,需要找出其中的任意一个重复的数字。例子:{2,3,1,0,2,5,3} 输出2或者3思路一: 最简单的方式就是将其排序,然后从排好序的数组中找出重复的数字思路二: 遍历一遍数组,当扫描到下标为i的数字时,首先比较这个数字(用m表示)是不是等于i,如果是,直接扫描下一个数字,...原创 2019-11-13 18:04:44 · 152 阅读 · 0 评论 -
位运算
知识点:位运算左移运算符m<<n 表示把m左移n位,在左移n位的时候,最左边的位将被丢弃,同时在最右边补上n个0,比如:00001010 << 2 = 0010100010001010 << 3 = 01010000右移运算符 m>> n 表示把m右移n位,在右移n位的时候,最右边n位将被丢弃,这里分两种情况:如果数字是一个无符号数值...原创 2019-11-13 14:57:57 · 68 阅读 · 0 评论 -
linux环境下配置java变量
linux系统使用yum下载的jdk无法进行java文件的编译,就是无法使用javac命令。补充知识点:centos系统yum下载的文件保存在/usr/lib,jdk一般安装在/usr/lib/jvm下载.gz安装包1、wget命令(安装在usr/lib/jvm)# wget https://download.oracle.com/otn-pub/java/jdk/12.0.1+12/...原创 2019-10-16 08:52:26 · 104 阅读 · 0 评论 -
Java语言的重载和重写的区别
学习java语言中重载和重写的区别重载(Overload)重载(overloading) 是在一个类里面,方法名字相同,而参数不同。返回类型可以相同也可以不同。每个重载的方法(或者构造函数)都必须有一个独一无二的参数类型列表。最常用的地方就是构造器的重载。重载规则:被重载的方法必须改变参数列表(参数个数或类型不一样); 被重载的方法可以改变返回类型; 被重载的方法可以改...转载 2019-08-26 09:37:21 · 233 阅读 · 0 评论