自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(29)
  • 收藏
  • 关注

原创 Java面试4

1、垃圾回收是在什么时候开始?对什么东西,做了什么事情?内存区得堆空间划分成年轻代和老年代,非堆空间叫做元空间。年轻代又划分成Eden S0 S1区。产生对象时会先放在Eden区,若Eden区域满则会触发MinorGC对Eden和Survivor进行垃圾回收。剩下的对象会放到TO区。这时要是有对象得生命周期已达阈值会放到老年代。一些大的对象也会分配在老年代。若是老年代内存也不够就会触发MajorGC对老年代进行回收,若回收后还是不够会尝试放到元空间,若空间不够会FULL GC,回收后不够的话OOM。垃

2020-07-30 13:53:59 194

原创 Arrays.asList()避坑

简介ArrayList.asList()一般用来将一个数组转换为一个List.public static <T> List<T> asList(T... a) { return new ArrayList<>(a);}根据上述源码可以看出返回一个ArrayList,但是这里的ArrayList并不是实现了Collection接口的那个,这个是Arrays的内部类,底层实现还是数组。当使用Arrays.asList()将数组转换为集合后不能使用修改集合

2020-07-30 12:49:37 303

转载 TCP和UDP的区别

一、TCP协议:位于传输层, 提供可靠的字节流服务。所谓的字节流服务(Byte Stream Service) 是指, 为了方便传输, 将大块数据分割成以报文段(segment) 为单位的数据包进行管理。 而可靠的传输服务是指, 能够把数据准确可靠地传给对方。 即TCP 协议为了更容易传送大数据才把数据分割, 而且 TCP 协议能够确认数据最终是否送达到对方。所以,TCP连接相当于两根管道(一个用于服务器到客户端,一个用于客户端到服务器),管道里面数据传输是通过字节码传输,传输是有序的,每个字节都是一个

2020-07-29 20:41:18 122

原创 Java面试3-多线程

1、线程的几种状态new:新建一个对象可运行runnable:start使得线程位于可运行线程池中,等待被调度运行running:runnable的线程获得了时间片阻塞block:等待阻塞:running线程执行wait,JVM把线程放进等待队列同步阻塞:running在获取对象同步锁时,同步锁被其他线程占用,JVM把该线程放进锁池其他阻塞:running执行sleep、join、发出IO请求死亡dead:run执行结束/main结束/因异常退出run/线程结束生命周期2、死锁以

2020-07-28 11:10:49 113

原创 Java面试题2

1、JDBC访问数据库的基本步骤是?加载数据库驱动到JVM建立数据库连接创建数据库操作对象定义SQL语句执行数据库操作获取结果集关闭2、PreparedStatement和Statement1,效率:预编译会话比普通会话对象,数据库系统不会对相同的sql语句不会再次编译2,安全性:可以有效的避免sql注入攻击!sql注入攻击就是从客户端输入一些非法的特殊字符,而使服务器端在构造sql语句的时候仍然能够正确构造,从而收集程序和服务器的信息和数据。用户在进行登录时,需要验证用户名和密

2020-07-28 09:47:09 173

原创 Java面试题整理1

#参考自:https://zhuanlan.zhihu.com/p/975909221、静态变量和实例变量的区别实例变量是某个对象的属性,必须创建对象也可以被分配空间.静态变量属于类又叫做类变量,程序加载字节码之后在链接阶段的准备阶段会给静态变量分配空间,并对其进行零值初始化,在初始化阶段会根据用户的赋值进行初始化。2、 switch语句能否作用在byte上,能否作用在long上,能否作用在String上?在switch(e)中,e只能是一个整数表达式或者枚举常量(更大字体),整数表达式

2020-07-27 10:01:57 234

原创 集合类详解

1.List1.1 ArrayListArrayList概述实现List接口的动态数组(大小可变)。默认初始容量10,随着元素增加容量也在不断变化每次添加之前检查是否需要扩容带来数据向新数组的拷贝,若知道数据量可以指定一个初始容量。ArrayList实现不是同步的。如果多个线程同时访问一个ArrayList实例,而其中至少一个线程从结构上修改了列表,那么它必须保持外部同步。ArrayList继承关系ArrayList继承AbstractList抽象父类,实现了List接口(规定了Lis

2020-07-24 16:26:03 521

原创 Java基础18.序列化与反序列化

序列化与反序列化基本定义Java序列化就是指把Java对象转换为字节序列的过程;Java反序列化就是指把字节序列恢复为Java对象的过程。核心作用就是对象状态的保存和重建。只有实现了Serializable或者Externalizable接口的类的对象才能被序列化为字节序列。(不是则会抛出异常)相关接口及类Java为了方便开发人员将Java对象进行序列化及反序列化提供了一套方便的API来支持。其中包括以下接口和类:java.io.Serializablejava.io.Ex

2020-07-24 15:38:14 171

原创 Java基础17.继承、封装、多态的实现原理

继承、封装、多态的实现原理JVM 的结构典型的 Java 虚拟机的运行时结构如下图所示图 1.JVM 运行时结构此结构中,我们只探讨和本文密切相关的方法区 (method area)。当程序运行需要某个类的定义时,载入子系统 (class loader subsystem) 装入所需的 class 文件,并在内部建立该类的类型信息,这个类型信息就存贮在方法区。类型信息一般包括该类的方法代码、类变量、成员变量的定义等等。可以说,类型信息就是类的 Java 文件在运行时的内部结构,包含了改类的所有在

2020-07-24 15:33:14 339

原创 Java基础16.集合类初探

集合类Collection接口Collection接口是最基本的集合接口,它不提供直接的实现,Java SDK提供的类都是继承自Collection的“子接口”如List和Set。Collection所代表的是一种规则,它所包含的元素都必须遵循一条或者多条规则。如有些允许重复而有些则不能重复、有些必须要按照顺序插入而有些则是散列,有些支持排序但是有些则不支持。在Java中所有实现了Collection接口的类都必须提供两套标准的构造函数,一个是无参,用于创建一个空的Collection,一个是带有

2020-07-24 15:15:19 118

原创 Java基础14.IO流

IO流IO流,什么是IO?​ I : Input​ O : Output​ 通过IO可以完成硬盘文件的读和写。IO流的分类?有多种分类方式: 一种方式是按照流的方向进行分类: 以内存作为参照物, 往内存中去,叫做输入(Input)。或者叫做读(Read)。 从内存中出来,叫做输出(Output)。或者叫做写(Write)。 另一种方式是按照读取数据方式不同进行分类: 有的流是按照字节的方式读取数据,一次读取1个字节byte,等同于一次读取8个二进制位。 这种流是万

2020-07-24 15:08:21 161

原创 Java基础13.注解

注解元注解元注解就是标记其他注解的注解@Target 用来约束注解可以应用的地方(如方法、类或字段),其中ElementType是枚举类型,其定义如下,也代表可能的取值范围当注解未指定Target值时,则此注解可以用于任何元素之上,多个值使用{}包含并用逗号隔开@Retention用来约束注解的生命周期,分别有三个值,源码级别(source),类文件级别(class)或者运行时级别(runtime)SOURCE:注解将被编译器丢弃(该类型的注解信息只会保留在源码里,源码经过编译后,注解

2020-07-24 15:07:08 526

原创 设计模式

1、七大设计原则1.1 单一接口原则1.2 开闭原则…2、设计模式概述2.1、创建型模式​ 这些设计模式提供了一种在创建对象的同时隐藏创建逻辑的方式,而不是使用 new 运算符直接实例化对象。这使得程序在判断针对某个给定实例需要创建哪些对象时更加灵活。工厂模式(Factory Pattern)抽象工厂模式(Abstract Factory Pattern)单例模式(Singleton Pattern)建造者模式(Builder Pattern)原型模式(Prototype Pa

2020-07-24 14:55:07 206

原创 8、垃圾回收相关算法

垃圾回收相关算法Minor GC、Major GC、Full GC部分收集:包含Minor GC和Major GC新生代收集(Minor GC):只是新生代的垃圾收集。老年代收集(Major GC):只是老年代的垃圾收集。整堆收集Full GC:收集整个java堆和方法区的垃圾收集。很多时候Major GC会和Full GC混淆使用,需要具体分辨是老年代回收还是整堆回收。垃圾回收触发机制Minor GC触发机制:1、当年轻代空间不足时,这里的年轻代指的是Eden区,Survi

2020-07-24 10:48:54 131

原创 JVM5、方法区

5、方法区5.1 栈、堆、方法区的交互关系5.2 方法区的理解是一种虚拟机规范,而元空间是HotSpotJVM对方法区的一种实现;HotSpotJVM中把方法区看作是非堆目的是要和堆分开,所以将方法区看作是一块独立于Java堆的内存空间;5.3 方法区的内部结构类型信息对每个加载的类型(类class,接口interface,枚举enum,注解annotation)。JVM在方法区存储以下信息:这个类型的完整有效类名这个类型直接父类完整有效名(interface和Object都没

2020-07-24 10:45:46 125

原创 JVM4、堆

堆4.1 堆的核心概述一个进程对应一个JVM实例,一个JVM实例只存在一个堆内存Java堆区在JVM启动的时候被创建,其看见大小也就确定了。其大小是可以调节的。所有的线程共享Java堆,在这里还可以划分私有的缓冲区(Thread Local Allocation Buffer,TLAB)。数组和对象可能永远不会存储在栈上,因为栈帧保存引用,这个引用指向对象或者数组在堆中的位置。在方法结束后,堆中的对象不会马上被移除仅仅在垃圾收集时才会被移除。堆是GC执行垃圾回收的重点区域。堆空间细分

2020-07-24 10:38:52 134

原创 JVM3、运行时数据区

3、运行时数据区JVM内存布局规定了Java在运行过程中内存申请、分配、管理的策略,保证了JVM的高校稳定运行。不同的JVM对于内存划分方式和管理策略存在着部分差异。每个线程:独立包括程序计数器、本地栈、虚拟机栈线程间共享:堆、堆外内存3.1 程序计数器任何时间每个线程只有一个方法执行即当前方法是程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等都需要依赖这个计数器完成唯一一个没有规定OutOfMemoryError的区域3.2 虚拟机栈每个线程在创建时都会创建一个虚

2020-07-24 10:36:21 130

原创 JVM2、类加载子系统

2、类加载子系统2.1 内存结构概述注:class loader扮演一个快递员角色,.class->JVM->成为元数据模板2.2 加载过程类的加载过程1、通过一个类的全限定名获取定义此类的二进制字节流2、将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构3、在内存中生成一个代表该类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口。链接阶段初始化阶段2.3 类加载器分类2.4 双亲委派机制双亲父类加载器(par

2020-07-24 10:34:24 101

原创 JVM1-内存结构

1、JVM内存结构分析JVM的内存结构主要就是分析JVM运行时数据存储区域。JVM运行时数据区主要包括堆、栈、方法区、程序计数器。而JVM的优化问题主要是在线程共享的数据区中如堆、方法区。1.1 程序计数器程序计数器(Program Counter Register)是一块较小的内存空间,可以看作是当前线程所执行字节码的行号指示器,指向下一个将要执行的指令代码,由执行引擎来读取下一条指令。更确切的说,一个线程的执行,是通过字节码解释器改变当前线程的计数器的值,来获取下一条需要执行的字节码指令,从而确

2020-07-24 10:21:20 147

原创 Java基础11.反射

反射类的加载、连接和初始化类的加载当程序主动使用某个类时,如果该类还没有被加载到内存中,则系统会通过加载、连接、初始化这三个步骤对该类进行初始化。有时会把这一整个流程统称为类加载或类初始化。类加载指的是将类的class文件读入内存中,并为之创建一个 java.lang.Class对象,也就是说程序使用任何类的时候,都会为其创建一个class对象。类的连接类被加载之后,系统会为之生成一个Class对象,接着会进入连接阶段,连接阶段负责把类的二进制数据合并到JRE中。类的连接又分为下面三个阶段

2020-07-23 22:17:40 300

原创 Java基础10.回调

回调模块间的调用在一个应用系统中,无论使用何种语言开发,必然存在模块之间的调用,调用的方式分为几种:(1)同步调用同步调用是最基本并且最简单的一种调用方式,类A的方法a()调用类B的方法b(),一直等待b()方法执行完毕,a()方法继续往下走。这种调用方式适用于方法b()执行时间不长的情况,因为b()方法执行时间一长或者直接阻塞的话,a()方法的余下代码是无法执行下去的,这样会造成整个流程的阻塞。(2)异步调用异步调用是为了解决同步调用可能出现阻塞,导致整个流程卡住而产生的一种调用方式。类

2020-07-23 22:17:09 91

原创 Java基础9.Java异常

Java异常Java标准库内建了一些通用的异常,这些类以Throwable为顶层父类。Throwable又派生出Error类和Exception类。错误:Error类以及他的子类的实例,代表了JVM本身的错误。错误不能被程序员通过代码处理,Error很少出现。因此,程序员应该关注Exception为父类的分支下的各种异常类。异常:Exception以及他的子类,代表程序运行时发送的各种不期望发生的事件。可以被Java异常处理机制使用,是异常处理的核心。总体上我们根据Javac对异常的处理要求,

2020-07-23 22:16:20 166

原创 Java基础8.Class类和Object类

Class类和Object类Class类主要跟反射有关。Object类Object类位于java.lang包中,java.lang包包含着Java最基础和核心的类,在编译时会自动导入。Object类没有定义属性,一共有13个方法,13个方法之中并不是所有方法都是子类可访问的,一共有9个方法是所有子类都继承了的。1.clone方法 保护方法,实现对象的浅复制,只有实现了Cloneable接口才可以调用该方法,否则抛出CloneNotSupportedException异常。2.getClass方法

2020-07-23 22:15:41 202

原创 Java基础7.浅拷贝与深拷贝

Object类里面有个clone方法:是一种保护方法,实现对象的浅复制,只有实现了Cloneable接口才可以调用该方法,否则抛出CloneNotSupportedException异常。浅拷贝介绍浅拷贝是按位拷贝对象,它会创建一个新对象,这个对象有着原始对象属性值的一份精确拷贝。如果属性是基本类型,拷贝的就是基本类型的值;如果属性是内存地址(引用类型),拷贝的就是内存地址 ,因此如果其中一个对象改变了这个地址,就会影响到另一个对象。即默认拷贝构造函数只是对对象进行浅拷贝复制(逐个成员依次拷贝),即只复

2020-07-23 22:14:13 116 1

原创 Java基础6.Java自动拆箱装箱

Java自动拆箱装箱当需要一个对象的时候会自动装箱,Integer a=10;当需要一个基本类型时会自动拆箱,int a=new Integer(10);包装类型 == 基本类型时,包装类型自动拆箱;==在没遇到算术运算时,不会自动拆箱;基本类型只会自动装箱为对应的包装类型,代码中最后一条说明的内容。在JDK 1.5中提供了自动装箱与自动拆箱,这其实是Java 编译器的语法糖,编译器通过调用包装类型的valueOf()方法实现自动装箱,调用xxxValue()方法自动拆箱。自动装箱和拆箱会有一

2020-07-23 22:13:26 115

原创 Java基础5.抽象类和接口

抽象类和接口含有抽象方法的类一定是抽象类抽象类除了包含抽象方法外,还可以包含具体的变量和具体的方法。类即使不包含抽象方法,也可以被声明为抽象类,防止被实例化。抽象类不能被实例化,也就是不能使用new关键字来得到一个抽象类的实例,抽象方法必须在子类中被实现。在下列情况在中,一个类将成为抽象类。当一个类的一个或多个方法是抽象方法时。当类是一个抽象类的子类,并且不能实现父类的所有抽象方法时。当一个类实现一个接口,并且不能实现接口的所有抽象方法时。为什么使用抽象类而写成抽象类,这样别人

2020-07-23 22:12:43 141

原创 Java基础4.final关键字特性

final关键字特性4.1 final变量final变量有成员变量或者是本地变量(方法内的局部变量),在类成员中final经常和static一起使用,作为类常量使用。其中类常量必须在声明时初始化,final成员常量可以在构造函数初始化。final类final类不能被继承,final类中的方法默认也会是final类型的,java中的String类和Integer类都是final类型的。final成员变量必须在声明的时候初始化或者在构造器中初始化,否则就会报编译错误。final变量一旦被初始化后不能

2020-07-23 22:11:01 569

原创 Java基础3.String和包装类

3.String和包装类在字符串不经常发生变化的业务场景优先使用String(代码更清晰简洁)。如常量的声明,少量的字符串操作(拼接,删除等)。在单线程情况下,如有大量的字符串操作情况,应该使用StringBuilder来操作字符串。不能使用String"+"来拼接而是使用,避免产生大量无用的中间对象,耗费空间且执行效率低下(新建对象、回收对象花费大量时间)。如JSON的封装等。在多线程情况下,如有大量的字符串操作情况,应该使用StringBuffer。如HTTP参数解析和封装等。String类

2020-07-23 21:53:46 101

原创 Java基础1、面向对象三大特性

1.Java面向对象三大特性1.1 继承Java中的继承只能单继承,但是可以通过内部类继承其他类来实现多继承。子类如果对父类的方法不满意可以自己编写继承的方法,即方法重写。重载与重写的区别:继承的初始化顺序:初始化父类再初始化子类;先执行初始化对象中属性,再执行构造方法的初始化实例化一个子类:父类对象属性初始化–>父类对象构造方法–>子类对象属性初始化–>子类对象构造方法final关键字:final 修饰类,则该类不允许被继承。final 修饰方法,则该方法

2020-07-23 21:17:12 105

空空如也

空空如也

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

TA关注的人

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