编程语言(Java基础)
文章平均质量分 65
王小二(海阔天空)
这个作者很懒,什么都没留下…
展开
-
Java-IO:简述常见的IO模型
最传统的一种IO模型,即在读写数据过程中会发生阻塞现象。在信号驱动IO模型中,当用户线程发起一个IO请求操作,会给对应的socket注册一个信号函数,然后用户线程会继续执行,当内核数据就绪时会发送一个信号给用户线程,用户线程接收到信号之后,便在信号函数中调用IO读写操作来进行实际的IO请求操作。另外多路复用IO为何比非阻塞IO模型的效率高是因为在非阻塞IO中,不断地询问socket状态时通过用户线程去进行的,而在多路复用IO中,轮询每个socket状态是内核在进行的,这个效率要比用户线程要高的多。原创 2024-09-02 17:09:02 · 732 阅读 · 0 评论 -
Java:HashMap和HashTable的区别
虽然HashMap是线程不安全的,但是它的效率远远高于Hashtable,这样设计是合理的,因为大部分的使用场景都是单线程。HashMap:key可以为null,但是这样的key只能有一个,因为必须保证key的唯一性;可以有多个key值对应的value为null。HashMap是线程不安全的,在多线程并发的环境下,可能会产生死锁等问题,因此需要开发人员自己处理多线程的安全问题。HashTable是线程安全的,它的每个方法上都有synchronized 关键字,因此可直接用于多线程中。原创 2024-09-04 09:00:00 · 149 阅读 · 0 评论 -
Java:简单比较synchronized和lock
区别类型SynchronizedLock存在层次Java的关键字JVM的一个接口锁的获取假设A线程获得锁,B线程等待。如果A线程阻塞,B线程会一直等待情况而定,Lock有多个锁获取的方式,大致就是可以尝试获得锁,线程可以不用一直等待(可以通过tryLock判断有没有锁)锁的释放1、获取锁的线程执行完同步代码,释放锁2、线程执行发生异常,jvm会让线程释放在finally中必须手动释放锁,不然容易造成线程死锁锁类型锁可重入、不可中断、非公平可重入、可判断原创 2024-08-30 14:08:00 · 113 阅读 · 0 评论 -
Java:如何选择线程池的核心线程数
程序开多少线程合适?需要考虑程序是CDP密集型,还是I/O密集型。原创 2024-08-30 11:06:11 · 159 阅读 · 0 评论 -
Java:简述线程安全(死锁)的认识
这个问题除了正确的ack之外,往往是通过将失败的消息放入到延时队列中,等到一定的延时再进行重试来解决。:一个进程不能获得所需要的全部资源时便处于等待状态,等待期间他占有的资源将被隐式的释放重新加入到系统的资源列表中,可以被其他的进程使用,而等待的进程只有重新获得自己原有的资源以及新申请的资源才可以重新启动,执行。:采用资源有序分配,其基本思想是将系统中的所有资源顺序编号,将紧缺的,稀少的采用较大的编号,在申请资源时必须按照编号的顺序进行,一个进程只有获得较小编号的进程才能申请较大编号的进程。原创 2024-08-30 10:48:34 · 674 阅读 · 0 评论 -
Java:浅谈线程的生命周期
此时的线程对象没有表现出任何线程的动态特征,程序也不会执行线程的线程执行体。从start()源码中看出,start后添加到了就绪队列中,接着在native层添加到VM中,至于该线程何时开始运行,取决于JVM里线程调度器的调度(如果OS调度选中了,就会进入到运行状态)。Java虚拟机会为其创建方法调用栈和程序计数器,处于这个状态的线程并没有开始运行,它只是表示该线程可以运行了。如果就绪状态的线程获取 CPU 资源,就可以执行 run(),此时线程便处于运行状态。(1)run()方法执行完成,线程正常结束。原创 2024-08-29 18:13:17 · 674 阅读 · 0 评论 -
JVM:浅谈内存溢出的原因
java.lang.OutOfMemoryError: GC over head limit exceeded 系统处于高频的GC状态,而且回收的效果依然不佳的情况,就会开始报这个错误。java.lang.OutOfMemoryError: PermGen space jdk1.7之前才会出现的问题 ,原因是系统的代码非常多或引用的第三方包非常多、或代码中使用了大量的常量、或通过intern注入常量、或者通过动态代码加载等方法,导致常量池的膨胀。原创 2024-08-29 17:52:52 · 530 阅读 · 0 评论 -
JVM:浅谈垃圾回收GC机制
复制算法的代价是将内存缩小为了原来的一半,减少了实际可用的内存。现在的商业虚拟机都采用这种收集算法来回收新生代,IBM公司的专门研究表明,新生代中的对象98%是“朝生夕死”的,所以并不需要按照1:1的比例来划分内存空间,而是将内存分为一块较大的Eden空间和两块较小的Survivor空间,每次使用Eden和其中一块Survivor。更关键的是,如果不想浪费50%的空间,就需要有额外的空间进行分配担保,以应对被使用的内存中所有对象都100%存活的极端情况,所以在老年代一般不能直接选用这种算法。原创 2024-08-29 17:38:20 · 1102 阅读 · 0 评论 -
Java:简述类的加载机制-双亲委派
类加载的机制过程分为以下:加载、验证、准备、解析、初始化等。在第一步的加载环节,Java类加载器有四种:Bootstrap类加载器、Extention 类加载器、Application类加载器、Custom自定义类加载器,其中会涉及“双亲委派”模式。原创 2024-08-29 16:54:00 · 958 阅读 · 0 评论 -
Java:内存过高和CPU过高的排查流程
3、假设占用率最高的线程 ID 为 6900,将其转换为 16 进制形式 (因为 java native 线程以16进制形式输出)。4、利用 jstack 打印出 java 线程调用栈信息,这样就可以更好定位问题。1、利用 top 命令可以查出占 CPU 最高的的进程pid。2、查看该进程下占用最高的线程id。4、查看占用内存比较多的存活对象。2、查看JVM堆内存分配情况。3、查看占用内存比较多的对象。原创 2024-08-29 16:18:13 · 369 阅读 · 0 评论 -
JVM:浅谈JVM调优策略
多数的Java应用不需要在服务器上进行GC优化,虚拟机内部已有很多优化来保证应用的稳定运行,所以不要为了调优而调优,不当的调优可能适得其反。在应用上线之前,先考虑将机器的JVM参数设置到最优(适合)。在进行GC优化之前,需要确认项目的架构和代码等已经没有优化空间。我们不能指望一个系统架构有缺陷或者代码层次优化没有穷尽的应用,通过GC优化令其性能达到一个质的飞跃。GC优化是一个系统而复杂的工作,没有万能的调优策略可以满足所有的性能指标。原创 2024-08-29 16:09:00 · 846 阅读 · 0 评论 -
Java:简述类的加载机制-初始化
如果Class是类而不是接口,且Class的父类Super Class(SC)和各个接口SIn(按照implements子句中的顺序来)还没有初始化,那么就在SC上面递归地进行完整的初始化过程,如果有必要,需要先验证和准备SC;如果SC或SIn初始化过程中抛出异常,则获取LC,将Class标记为错误状态,并通知所有正在等待的线程,然后释放LC,然后再抛出同样的异常。类的初始化阶段,是真正开始执行类中定义的java程序代码(.class字节码),并按程序员的意图去初始化类变量的过程。原创 2024-08-29 15:18:05 · 366 阅读 · 0 评论 -
Java:浅谈字节码文件(.class)
JVM具有可移植性,针对各种操作系统和平台都进行了定制,无论在什么平台,都可以通过javac命令将一个.java文件编译成固定格式的字节码(.class文件)供JVM使用。之所以被称为字节码,是因为.class文件是由十六进制值组成的,JVM以两个十六进制值为一组,就是以字节为单位进行读取。原创 2024-08-29 14:44:45 · 698 阅读 · 0 评论 -
Java:Collections.empty*的作用及要注意的地方
一、好处1、如果你想 new 一个空的 List ,而这个 List 以后也不会再添加元素,那么就用 Collections.emptyList() 好了。new ArrayList() 或者 new LinkedList() 在创建的时候有会有初始大小,多少会占用一内存。每次使用都new 一个空的list集合,浪费就积少成多,浪费就严重啦。2、为了编码的方便。比如说一个方法返回类型是List,当没有任何结果的时候,返回null,有结果的时候,返回list集合列表。那样的话,调用这个方法的地方,就需原创 2022-03-25 09:35:01 · 864 阅读 · 0 评论 -
Java:移除无效的括号
一、题目给你一个由 ‘(’、’)’ 和小写字母组成的字符串 s。你需要从字符串中删除最少数目的 ‘(’ 或者 ‘)’ (可以删除任意位置的括号),使得剩下的「括号字符串」有效。有效「括号字符串」应当符合以下 任意一条 要求:空字符串或只包含小写字母的字符串可以被写作 AB(A 连接 B)的字符串,其中 A 和 B 都是有效「括号字符串」可以被写作 (A) 的字符串,其中 A 是一个有效的「括号字符串」二、示例))(( -》 (leetode -》 leetodeleetod原创 2021-04-20 23:25:30 · 365 阅读 · 1 评论 -
目录:线程相关文章记录
资料:简述分布式、高并发与多线程操作系统:从工厂的角度来理解进程线程操作系统:详述对进程和线程的认识Java:简述Java多线程的四种实现方式Java:简述Java中的多线程编程Java:简述线程池的工作原理Java:简述Java中满足线程安全的数据结构...原创 2021-03-10 17:43:42 · 158 阅读 · 0 评论 -
Java:字符串split使用.时返回空数组的问题
String str= "127.0.0.1";String[] splitStr= str.split(".");这个时候得到的是一个空数组。因为:涉及转义的字符,类似的还有() [] {} + - * / . ^ ? $ ¦ 。正确的写入如下。String[] splitStr= str.split("\\.");原创 2020-06-10 22:25:02 · 2925 阅读 · 0 评论 -
简述Java中outer:语法的使用
关键字break和continue都是结束循环的作用,但是它只能结束它外面的第一层循环,如果代码里面是一层一层又一层的循环,但是想直接结束最外层循环就需要outer了。看如下代码:outer:for (int i = 0; i < 10; i++) { for (int j = 0; j < 10; j++) { if(j==0) { System.out.print(j); }else { /转载 2020-06-07 23:08:48 · 1752 阅读 · 0 评论 -
Exception:java.lang.IllegalArgumentException: invalid comparison
异常: java.lang.IllegalArgumentException: invalid comparisonError querying database. Cause: java.lang.IllegalArgumentException: invalid comparison: com.*.module.bean.enums.Enum_BusinessStage and java.lang.String说明: 在Mapper.xml中对非字符串类型的数据进行了是否原创 2020-06-01 23:23:24 · 754 阅读 · 0 评论 -
Java:简述对Serializable序列化的认识
一般情况下,我们在定义实体类时会继承Serializable接口,还有一个serialVersionUID变量。如下所示,那么他们有什么用处呢?public class User implements Serializable { private static final long serialVersionUID = 1L; ......}一、Serializable接口Seri...原创 2020-03-19 22:16:02 · 298 阅读 · 0 评论 -
Druid:简述对数据库连接池Druid的认识和使用
一、Druid介绍Druid是一个数据库连接池,可以说是目前最好的!因其优秀的功能、性能和扩展性方面,深受开发人员的青睐。阿里巴巴已经部署了超过600个使用Druid的应用,经过一年多生产环境大规模部署的严苛考验。Druid是阿里巴巴开发的号称为监控而生的数据库连接池!Druid的主要功能如下:一个高效、功能强大、可扩展性好的数据库连接池。可以监控数据库访问性能。进行数据库密码加密 ...原创 2019-12-04 10:08:56 · 868 阅读 · 0 评论 -
PageHelper:简述对物理分页插件PageHelper的认识
PageHelper是一款好用的,开源的,免费的Mybatis第三方物理分页插件。本文简单介绍PageHelper的基本使用和配置参数的含义,重点分析PageHelper作为Mybatis分页插件的实现原理。一、PageHelper的maven依赖及插件配置PageHelper除了本身的jar包外,它还依赖了一个叫jsqlparser的jar包,使用时,我们不需要单独指定jsqlparser的...原创 2019-12-03 11:03:10 · 3004 阅读 · 1 评论 -
JVM:简述JVM内存分配模型
JAVA程序运行于JVM虚拟机上,运行时需要内存空间。JVM虚拟机执行JAVA程序的过程中会把它管理的内存划分为不同的数据区域方便管理。原创 2019-11-24 19:55:58 · 384 阅读 · 0 评论 -
Java:StringUtils类isEmpty方法和isBlank方法区别
org.apache.commons.lang3.StringUtils 类提供了 String 的常用操作,最为常用的判空有如下两种 isEmpty(String str) 和 isBlank(String str)。一、源码public static boolean isEmpty(String str) { return str == null || str.length() =...原创 2019-11-08 18:12:05 · 1441 阅读 · 0 评论 -
Java:JDK源码阅读的方式
为什么需要阅读源码?从实用性的角度来看,主要有三个目的:解决手头的新问题或者新需求;真正理解一部分理论的落地实现;应对面试。阅读源码的方式如下:一、端正心态在准备投身到阅读源码的事业之前,首先需要端正一下心态:阅读源码是一场持久战,浅尝辄止的话,顶多能写几篇水文,吸点粉糊弄下新手,对自身实力的提高没有显著作用。阅读源码是锦上添花,不是雪中送炭。如果你进入一个全新的领域,...转载 2019-10-22 21:06:23 · 654 阅读 · 2 评论 -
Java:简述Java中对时间和日期的操作
一、Date1. java.util.Date(1)java.util.Date的构造方法如下:public Date() { this(System.currentTimeMillis());}public Date(long date) { fastTime = date;}(2)java.util.Date的测试用例及输出结果如下:java.util.Date dat...原创 2019-10-22 20:47:38 · 608 阅读 · 0 评论 -
Java:简述throw-throws异常抛出
Java:简述throw-throws异常抛出 任何Java代码都可以抛出异常,如:自己编写的代码、来自Java开发环境包中代码,或者Java运行时系统。无论是谁,都可以通过Java的throw语句抛出异常。从方法中抛出的任何异常都必须使用throws子句。一、throws抛出异常 &n...原创 2019-04-19 12:37:27 · 16748 阅读 · 10 评论 -
Java:简述Java中的自定义异常
Java:简述Java中的自定义异常 虽然Java系统已经预定义好了很多异常类,但是有时会遇到预定义的异常类不能描述出现的错误。在这种情况下,程序员可以通过扩展Exception类及其子类来定义自己的异常类。1. 自定义异常,格式如下:class 异常类名 extends Exception { public...原创 2019-04-19 13:48:53 · 6865 阅读 · 0 评论 -
面向对象编程的三大特征简述
面向对象编程的三大特性,简要阐述如下(1).继承:继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。对象的一个新类可以从现有的类中派生,这个过程称为类继承。新类继 承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类)。派生类可以从它的基类那里继承方法和实例变量,并且类可以修改或增 加新的方法使之更适合特殊的需要。(2).封装...原创 2018-01-04 20:38:15 · 12981 阅读 · 1 评论 -
Java:简述Java数据类型(基本类型,对象类型)之间的比较
Java:简述Java数据类型(基本类型,对象类型)之间的比较 Java的数据类型分为两种:基本类型:byte(8),short(16),int(32),long(64),float(32),double(64),char(16),boolean(1)对象类型:Byte,Short,Integer,Long,Float...原创 2019-04-26 17:17:33 · 1270 阅读 · 0 评论 -
Java:判断一个对象是否是特定类的实例(InstanceOf)
通过比较上面的两个测试代码,可以得知:通过InstanceOf运算符比较,子类对象是父类对象的实例;通过Class.getClass()方法比较,子类对象不是父类对象的实例。原创 2019-04-09 19:23:31 · 12235 阅读 · 0 评论 -
Java:详解Cron表达式的使用
Java:详解Cron表达式的使用 Cron表达式是一个字符串,字符串以5或6个空格隔开,分为6或7个域,每一个域代表一个含义,Cron有如下两种语法格式:Seconds Minutes Hours DayofMonth Month DayofWeek YearSeconds Minutes Hours DayofMonth Month DayofWee...原创 2019-04-11 16:38:46 · 7773 阅读 · 0 评论 -
IP地址(IPV6)与long数组之间的转换
IP地址(IPV6)与long数组之间的转换一、前言IPv6是英文“Internet Protocol Version 6”(互联网协议第6版)的缩写,是互联网工程任务组(IETF)设计的用于替代IPv4的下一代IP协议,其地址数量号称可以为全世界的每一粒沙子编上一个地址。IPv6的地址长度为128位,它有3种表示方法,分别是冒分十六进制表示法、0位压缩表示法、内嵌IPv4地址表示法。二、...原创 2019-03-22 13:52:09 · 6809 阅读 · 2 评论 -
IP地址(IPV4)与int类型之间的转换
IP地址(IPV4)与int类型之间的转换一、前言IP地址(IPV4)是一个32位的二进制数,通常被分割为4个“8位二进制数”(也就是4个字节)。IP地址(IPV4)通常用“点分十进制”表示成(a.b.c.d)的形式,其中,a,b,c,d都是0~255之间的十进制整数。例:点分十进IP地址(100.4.5.6),实际上是32位二进制数(01100100.00000100.00000101.0...原创 2019-03-22 11:01:02 · 15622 阅读 · 2 评论 -
Java:子类能否重写父类中的属性值
Java:子类使用Override能否重写父类中的属性值? 首先,让我们来看一个例子,大家可以猜测下输出结果是什么。1.父类public class FatherClass { String info="FatherClass";}2.子类public class SonClass extends Fath...原创 2019-04-26 15:58:06 · 17762 阅读 · 4 评论 -
Java:简述Java开发中的实体类
Java:简述Java开发中的实体类一、实体类百度百科中对于 实体类 的定义为:实体类的主要职责是存储和管理系统内部的信息,它也可以有行为,甚至很复杂的行为,但这些行为必须与它所代表的实体对象密切相关。根据以上定义,我们可以了解到,实体类有两方面内容,存储数据和执行数据本身相关的操作。这两方面内容对应到实现上,最简单的实体类是 POJO(Plain Ordinary Java Object...原创 2019-02-22 11:36:47 · 11884 阅读 · 2 评论 -
Linux:Linux系统如何配置全局JDK和局部JDK
Linux:Linux系统如何配置全局JDK和局部JDK 通常,遇到一个新的Linux系统需要安装JDK,一般都安装一个所需版本的JDK(1.8xx)然后配置一下/etc/profile文件的环境变量。这个配置是全用户的。任意用户登录,输入java –version得到的是同一个JDK版本。 &nbs...原创 2019-05-06 16:42:38 · 2318 阅读 · 0 评论 -
Java:因JDK版本问题出现Unsupported major.minor version 52.0
Java:因JDK版本问题出现Unsupported major.minor version 52.0 今天在本地开发完代码,打包发布到服务器上部署时出现如下异常:Exception in thread "main" java.lang.UnsupportedClassVersionError: com/*/Applica...原创 2019-05-06 17:12:16 · 3661 阅读 · 0 评论 -
Java:简述JDK,JRE,JVM之间的关系
Java:简述对JDK,JRE,JVM的认识JVM(Java Virtual Machine):Java虚拟机,主要负责运行Java编译器编译后的字节码文件(*.class文件),它存在于内存中,与内存打交道。JVM运行在操作系统之上,与硬件没有直接交互,JVM是实现跨平台的核心。JVM是一种抽象&虚拟出来的计算机,和实际的计算机一样,它具有指令集并使用不同的存储区域,它负责执...原创 2019-05-29 16:13:44 · 7345 阅读 · 0 评论 -
Java:简述Java中的类型传递问题(值传递,引用传递)
Java:简述Java中的类型传递问题(值传递,引用传递)一、类型传递的简单认识首先,让我们来看看如何定义值传递和引用传递。值传递(pass by value): 在调用函数时将实际参数拷贝一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。引用传递(pass by reference): 在调用函数时将实际参数的地址直接传递到函数中,那么在函数中对参数所进行的修改...原创 2019-06-24 16:07:38 · 1255 阅读 · 0 评论