![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
面试准备
lcr_happy
调试的错误就是编程给你最好的东西,因为在每个错误上面都标志着前进的一步。
展开
-
java的基本数据类型和大小
Java语言提供了八种基本类型。六种数字类型(四个整数型,两个浮点型),一种字符类型,还有一种布尔型。byte: 8bit,一个字节byte 数据类型是8位、有符号的,以二进制补码表示的整数;最小值是 -128(-2^7);最大值是 127(2^7-1);默认值是 0;byte 类型用在大型数组中节约空间,主要代替整数,因为 byte 变量占用的空间只有 int 类型的四分之一;例子...原创 2019-07-09 07:47:10 · 1533 阅读 · 0 评论 -
说一说你对java.lang.Object对象中hashCode和equals方法的理解。在什么场景下需要重新实现这两个方法
其实我也说不明白。但是Object的equals方法是直接比较内存地址的(这里是针对对象而言);参考一下别人的描述吧:https://blog.csdn.net/qq_21163061/article/details/73606523...原创 2019-07-11 07:15:16 · 2450 阅读 · 0 评论 -
在自己的代码中,如果创建一个java.lang.String类,这个类是否可以被类加载器加载?为什么
说到类加载,就必须对类加载机制非常熟悉。类加载使用的是双亲委派模型,当你想要加载一个类的时候,必须先给你的父加载器,它再去想办法加载,如果它不能加载,再告诉我们,我们自己想办法。所以,在java中java.lang.String肯定在上层的ClassLoader被加载过了,所以你自己写的完全没有机会加载。如果可以加载的话,那么我们可以把所有java自带的类全部重写用我们自己的,这样大家使用就...原创 2019-07-11 07:11:45 · 3139 阅读 · 0 评论 -
数组和链表数据结构描述,各自的时间复杂度
我们都知道:数组是开辟一块连续的空间用来保存数据的。链表是通过节点一个连一个来保存数据,更具灵活性。根据索引获取元素数组O(1) 链表O(n)查找元素数组O(n) 链表O(n)插入、删除元素数组需要移动数据,链表只需要改变指针指向。写的是自己的看法,可能不对,后续需要完善。...原创 2019-07-11 07:04:19 · 695 阅读 · 0 评论 -
请结合OO设计理念,谈谈访问修饰符public、private、protected、default在应用设计中的作用。
OO就是面向对象。那面向对象的四大特性就是:抽象 封装 继承 多态从修饰符的角度来说,我觉得满足抽象和封装两个特性。一个类总有暴露给外面的方法,也有自己独立的方法不想被别人知道。修饰符的存在可以在包与包之间、类与类之间产生一种权限的关系,并不能保证随心所欲,这样才能确保安全。参考链接:https://blog.csdn.net/riemann_/article/details/8748...原创 2019-07-11 06:59:27 · 715 阅读 · 0 评论 -
如何在父类中为子类自动完成所有的hashcode和equals实现,这样做有何优劣
https://java-min.iteye.com/blog/1416727父类为子类写好的话,我觉得优点就是:我们不用自己去写但缺点就是有时父类的equals和hashcode不满足我们自己的要求,我们需要重新去重写。...原创 2019-07-11 06:52:46 · 5096 阅读 · 0 评论 -
单例模式的实现
单例:保证一个类仅有一个实例,并提供一个访问它的全局访问点。单例模式是一种常用的软件设计模式之一,其目的是保证整个应用中只存在类的唯一个实例。比如我们在系统启动时,需要加载一些公共的配置信息,对整个应用程序的整个生命周期中都可见且唯一,这时需要设计成单例模式。如:spring容器,session工厂,缓存,数据库连接池等等。常见的方式有饿汉式懒汉式枚举其中需要考虑到线程安全需要考...原创 2019-07-11 06:46:36 · 65 阅读 · 0 评论 -
java中final的用途
1、修饰类,不能被继承2、修饰常量,初始化赋值,不能修改3、修饰方法,不能被覆盖加油原创 2019-07-11 06:43:06 · 161 阅读 · 0 评论 -
动态代理和cglib实现的区别
一、原理区别:java动态代理是利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。而cglib动态代理是利用asm开源包,对代理对象类的class文件加载进来,通过修改其字节码生成子类来处理。1、如果目标对象实现了接口,默认情况下会采用JDK的动态代理实现AOP2、如果目标对象实现了接口,可以强制使用CGLIB实现AOP3、如果目标对象没有实...原创 2019-07-11 06:40:55 · 785 阅读 · 0 评论 -
java中的泛型解决了什么问题
泛型的本质是参数化类型,这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。在 Java SE 1.5 之前没有泛型的情况的下只能通过对类型 Object 的引用来实现参数的任意化,其带来的缺点是要做显式强制类型转换,而这种强制转换编译期是不做检查的,容易把问题留到运行时,所以 泛型的好处是在编译时检查类型安全,并且所有的强制转换都是自动和隐式的,提高了代码的重用率...原创 2019-07-11 07:18:58 · 2933 阅读 · 0 评论 -
a.hashcode()有什么用,与a.equals(b)有什么关系
hashcodehashcode()方法提供了对象的hashCode值,是一个native方法,返回的默认值与System.identityHashCode(obj)一致。通常这个值是对象头部的一部分二进制位组成的数字,具有一定的标识对象的意义存在,但绝不定于地址。作用是:用一个数字来标识对象。比如在HashMap、HashSet等类似的集合类中,如果用某个对象本身作为Key,即要基于这个对...原创 2019-07-11 07:22:35 · 856 阅读 · 0 评论 -
Java-交替打印偶数和奇数
常见的一道面试题,认真想一想,自己写出来还是对wait()和notify()的理解有好处的,但是还是推荐使用reentrantlock去实现,更灵活吧。package com.ilovewl.interview.concurrent;/** * 主要就是两个线程占用同一把锁,一个标志位保存当前应该输出偶数还是奇数 * @author liuchangrong */public cl...原创 2019-08-22 18:17:24 · 858 阅读 · 0 评论 -
JVM中一次完整的GC流程中是怎样的,对象如何晋升到老年代,说说你知道的几种主要的JVM参数
对象诞生即新生代->eden,在进行minor gc过程中,如果依旧存活,移动到from,变成Survivor,进行标记。当一个对象存活默认超过15次都没有被回收掉,就会进入老年代。主要的JVM参数:http://ifeve.com/useful-jvm-flags/...原创 2019-07-27 23:11:29 · 10773 阅读 · 1 评论 -
JVM内存为什么要分成新生代、老年代、持久代。新生代中为什么要分成Eden和Survivor
https://dsxwjhf.iteye.com/blog/22016871、Minor GC是发生在新生代中的垃圾收集,采用的复制算法;2、新生代中每次使用的空间不超过90%,主要用来存放新生的对象;3、Minor GC每次收集后Eden区和一块Survivor区都被清空;4、老年代中使用Full GC,采用的标记-清除算法类需要同时满足下面3个条件才能算是“无用的类”:1、该类所...原创 2019-07-27 22:51:25 · 8024 阅读 · 2 评论 -
java8新特性
1、lambda表达式2、函数式接口原创 2019-07-23 22:29:17 · 104 阅读 · 0 评论 -
反序列化会遇到什么问题,如何解决?
简单来说,Java的序列化机制是通过在运行时判断类的serialVersionUID来验证版本一致性的。在进行反序列化时,JVM会把传来的字节流中的serialVersionUID与本地相应实体(类)的serialVersionUID进行比较,如果相同就认为是一致的,可以进行反序列化,否则就会出现序列化版本不一致的异常。(InvalidCastException)强烈建议在一个可序列化类中显示的...原创 2019-07-12 07:27:34 · 3819 阅读 · 0 评论 -
什么是序列化 怎么序列化 为什么序列化
序列化 (Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。序列化使其他代码可以查看或修改,那些不序列化便无法访问的对象实例数据。确切地说,代码执行序列化需要特殊的权限:即指定了 SerializationFormatter 标志的 Securi...原创 2019-07-12 07:21:23 · 8404 阅读 · 0 评论 -
java中的HashSet内部是如何工作的
HashSet 的内部采用 HashMap来实现。由于 Map 需要 key 和 value,所以HashSet中所有 key 的都有一个默认 value。类似于HashMap,HashSet 不允许重复的 key,只允许有一个null key,意思就是 HashSet 中只允许存储一个 null 对象。如果需要详细了解,还是看一下HashSet的源码比较好。参考链接:https://bl...原创 2019-07-12 07:13:04 · 1386 阅读 · 0 评论 -
有没有可能两个不相等的对象有相同的hashcode
答案是:有参考链接:https://blog.csdn.net/prh1023/article/details/80652704原创 2019-07-12 07:08:08 · 3714 阅读 · 0 评论 -
动态代理的几种实现方式和它们的优缺点
一般主要有两种实现方式:1、jdk动态代理2、cglib动态代理两种方法同时存在,各有优劣。jdk动态代理是由java内部的反射机制来实现的,cglib动态代理是通过继承来实现的,底层则是借助asm(Java 字节码操控框架)来实现的(采用字节码的方式,给A类创建一个子类B,子类B使用方法拦截的技术拦截所有父类的方法调用)。总的来说,反射机制在生成类的过程中比较高效,而asm在生成类之...原创 2019-07-11 06:36:18 · 710 阅读 · 0 评论 -
Java反射中,Class.forName和ClassLoader的区别
Java中Class.forName和classloader都可以用来对类进行加载。Class.forName除了将类的.class文件加载到jvm中之外,还会对类进行解释,执行类中的static块。而classloader使用双亲委派模型只干一件事情,就是将.class文件加载到jvm中,不会执行static中的内容,只有在newInstance才会去执行static块。Class.for...原创 2019-07-11 06:28:11 · 202 阅读 · 0 评论 -
java8的ConcurrentHashMap为何放弃分段锁
现在看不懂系列,呜呜呜。https://my.oschina.net/pingpangkuangmo/blog/817973https://www.wanaright.com/2018/09/30/java10-concurrenthashmap-no-segment-lock/https://blog.csdn.net/mian_csdn/article/details/70185104...原创 2019-07-09 21:33:05 · 13853 阅读 · 1 评论 -
常见的Map类和它们的区别(Java)
java为数据结构中的映射定义了一个接口java.util.Map;它有四个实现类,分别是HashMapHashtableLinkedHashMapTreeMap.好像还有ConcurrentHashMap?Map主要用于存储健值对,根据键得到值,因此不允许键重复(重复了覆盖了),但允许值重复。Hashmap 是一个最常用的Map,它根据键的HashCode值存储数据,根据键可以直接获...原创 2019-07-09 21:21:16 · 5601 阅读 · 0 评论 -
类的实例化顺序
1、类中所有属性的默认值(一举而成)2.、父类静态属性初始化,静态块,静态方法的声明(按出现顺序执行)3、子类静态属性初始化,静态块,静态方法的声明 (按出现顺序执行)4、 调用父类的构造方法,首先父类的非静态成员初始化,构造块,普通方法的声明(按出现顺序执行)然后父类构造方法5、 调用子类的构造方法,首先子类的非静态成员初始化,构造块,普通方法的声明(按出现顺序执行)然后子类...原创 2019-07-09 21:01:19 · 264 阅读 · 0 评论 -
ArrayList和LinkedList的区别
记住ArrayList底层是数组,而LinkedList底层是链表。数组的优缺点和链表的优缺点。ArrayList:底层是基于动态数组,根据下表随机访问数组元素的效率高,向数组尾部添加元素的效率高;但是,删除数组中的数据以及向数组中间添加数据效率低,因为需要移动数组。例如最坏的情况是删除第一个数组元素,则需要将第2至第n个数组元素各向前移动一位。而之所以称为动态数组,是因为Arraylist...原创 2019-07-09 20:56:09 · 76 阅读 · 0 评论 -
String、StringBuffer和StringBuilder的区别
1,执行速度StringBuilder > StringBuffer > String我们知道String是字符串常量,不可变对象,因此每次对String进行操作的时候实际上是生成了一个新的String对象,然后将指针指向新的String对象上。StringBuilder和StringBuffer是字符串变量,因此当我们对字符串做操作的时候,实际上都是操作的同一个对象,不会...原创 2019-07-09 20:45:36 · 79 阅读 · 0 评论 -
JVM的内存结构,Eden和Survivor的比例
Eden区是一块,Survivor区是两块。Eden区和Survivor区的比例是8:1:1JVM内存的结构为堆:存放对象栈:运行时存放栈帧程序计数器方法区:存放类和常量Jdk 1.8之后好像取消了方法区,直接将永久代放到了本地内存里面。...原创 2019-07-12 23:16:13 · 5878 阅读 · 2 评论 -
什么情况下会发生栈内存溢出
java中的栈一般存储的是栈帧。所以栈内存溢出就是栈帧的数量太多超过了系统预先设定的值,所以导致内存溢出。可能的原因就是方法循环调用,栈帧充满了整个栈后溢出。...原创 2019-07-12 22:52:29 · 3369 阅读 · 0 评论 -
String类能被继承吗?为什么
答案是不能的。因为我们查看String源码就知道,String被关键字final修饰,所以不能被继承。这里就要简单介绍一下final的基础。1、修饰类当用final去修饰一个类的时候,表示这个类不能被继承。注意:a. 被final修饰的类,final类中的成员变量可以根据自己的实际需要设计为fianl。b. final类中的成员方法都会被隐式的指定为final方法。说明:在自己设计一个类的时...原创 2019-07-09 07:54:32 · 3250 阅读 · 0 评论 -
TreeMap如何实现有序
TreeMap 默认排序规则:按照key的字典顺序来排序(升序)当然,也可以自定义排序规则:要实现Comparator接口。TreeMap<String, String> map = new TreeMap<String, String>(new Comparator<String>() { @Override ...原创 2019-07-09 21:35:50 · 12681 阅读 · 0 评论 -
抽象类和接口的区别
抽象类1.抽象类中可以构造方法2.抽象类中可以存在普通属性,方法,静态属性和方法。3.抽象类中可以存在抽象方法。4.如果一个类中有一个抽象方法,那么当前类一定是抽象类;抽象类中不一定有抽象方法。5.抽象类中的抽象方法,需要有子类实现,如果子类不实现,则子类也需要定义为抽象的。接口1.在接口中只有方法的声明,没有方法体。 (Java8 接口可以有实例方法)2.在接口中只有常量,因为定...原创 2019-07-09 21:47:55 · 73 阅读 · 0 评论 -
反射获取class对象和类实例
1、获取Class对象在 Java API 中,提供了获取 Class 类对象的三种方法:第一种,使用 Class.forName 静态方法。前提:已明确类的全路径名。第二种,使用 .class 方法。说明:仅适合在编译前就已经明确要操作的 Class第三种,使用类对象的 getClass() 方法。2、获取对象实例共两种方法:2.1、直接用字节码文件获取对应实例// 调用无参...原创 2019-07-11 06:23:44 · 527 阅读 · 0 评论 -
计算机网络--七层结构示意图
学习计算机网络,必然得知道七层架构。截取一张网上的图,好好观摩。学习之路,长路漫漫,要坚持,即使有时候困难重重。原创 2019-07-14 08:56:02 · 966 阅读 · 0 评论 -
java中的异常
异常分类: 可查异常(CheckException),运行时异常(RuntimeException)和错误(Error)3种其中,运行时异常和错误又叫非可查异常,因为运行时异常只能是程序运行起来会发生的异常。常见的运行时异常有:除数不能为0异常:ArithmeticException下标越界异常:ArrayIndexOutOfBoundsException空指针异常:NullPointe...原创 2019-07-10 07:07:05 · 83 阅读 · 0 评论 -
深拷贝和浅拷贝的区别
深拷贝和浅拷贝最根本的区别在于是否真正获取一个对象的复制实体,而不是引用。浅拷贝的时候基本数据类型是能实现拷贝的,但是对象类型只是引用同一个实例,深拷贝就是要新建一个同类型对象,然后将属性指向这个引用。假设B复制了A,修改A的时候,看B是否发生变化:如果B跟着也变了,说明是浅拷贝,拿人手短!(修改堆内存中的同一个值)如果B没有改变,说明是深拷贝,自食其力!(修改堆内存中的不同的值)浅拷贝...原创 2019-07-10 06:43:51 · 83 阅读 · 0 评论 -
反射的原理和获取class对象的方法
反射就是在运行时才知道要操作的类是什么,并且可以在运行时获取类的完整构造,并调用对应的方法。反射就是在运行的时候使用类加载器加载到程序中,然后你可以调用这个类的相应方法。获取class对象有三种方式:第一种,使用 Class.forName 静态方法。当你知道该类的全路径名时,你可以使用该方法获取 Class 类对象。Class clz = Class.forName(“java.lang...原创 2019-07-09 22:25:34 · 203 阅读 · 0 评论 -
reactor模型
https://www.cnblogs.com/crazymakercircle/p/9833847.htmlhttps://blog.csdn.net/qq924862077/article/details/81026740还是看不懂哇。原创 2019-07-09 22:15:22 · 72 阅读 · 0 评论 -
AIO BIO NIO的区别
https://www.cnblogs.com/doit8791/p/4951591.htmlhttps://blog.csdn.net/luzhensmart/article/details/82230076总结:Java BIO : 同步并阻塞,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,当然可...原创 2019-07-09 22:09:34 · 130 阅读 · 0 评论 -
继承和聚合的区别
继承指的是一个类继承另外的一个类的功能,并可以增加它自己的新功能的能力,继承是类与类或者接口与接口之间最常见的关系;在Java中此类关系通过关键字extends明确标识。聚合指的是聚合体现的是整体与部分、拥有的关系,此时整体与部分之间是可分离的,他们可以具有各自的生命周期;比如计算机与CPU、公司与员工的关系等;参考链接:https://www.cnblogs.com/nnngu/p/834...原创 2019-07-09 21:56:19 · 6233 阅读 · 0 评论 -
const和宏定义的区别
宏定义:#define PI 3.14.15926const常量:const intN = 10;宏定义是在编译之前进行的,而const是在编译阶段处理的宏定义不占用内存单元,而const定义的常量占用内存单元宏定义没有具体的数据类型,而const有具体的数据类型宏定义可以带参数进行定义,而const不能带参数定义...原创 2019-08-22 22:46:05 · 1260 阅读 · 0 评论