Java
文章平均质量分 92
兔老大RabbitMQ
我是全站最硬核博主。我话讲完,谁赞成,谁反对?
展开
-
当年,学姐把这份Java总结给我,让我在22k的校招王者局乱杀
可以说,学姐给我的这份文档真的把我的知识查漏补缺,面试问到了好多,值得收藏。原创 2021-04-22 08:48:17 · 42557 阅读 · 156 评论 -
复习Java的精华总结
输入java.util.Scanner 是 Java5 的新特征,我们可以通过 Scanner 类来获取用户的输入。下面是创建 Scanner 对象的基本语法:Scanner s = new Scanner(System.in);使用方法如下://对应类型用对应的方法接收 String stringx=s.next();String stringy=s.nextLine(); int intx=s.nextInt();long longx=s.nextLong();原创 2021-03-15 09:26:48 · 15518 阅读 · 25 评论 -
精华Java问题总结
当时在网上汇总了不知多少面试和基础题,弄了个精华总结。1、一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制?可以有多个类,但只能有一个public的类,并且public的类名必须与文件名相一致。2、short s1= 1; s1= s1+1;有没有错?s1+1运算时会自动提升类型,结果是int,赋值给s1时,将报告需要强转类型的错误。3、short s1= 1; s1 += 1;有没有错?+=是java规定的运算符,编译器会对它进行特殊处理,因此可以正确编..原创 2021-03-15 09:22:40 · 18923 阅读 · 67 评论 -
为什么 main 方法是 public static void ?
main方法是我们学习Java编程语言时知道的第一个方法,你是否曾经想过为什么main方法是public、static、void的。当然,很多人首先学的是C和C++,但是在Java中main方法与前者有些细微的不同,它不会返回任何值,为什么main方法是public、static、void,这篇文章尝试去找到一些答案。main方法是Java程序的入口,记住,我们这里不会讨论S...转载 2020-04-19 15:27:59 · 10135 阅读 · 85 评论 -
(多线程)leetcode1195. 交替打印字符串 最简单解法一个变量搞定
编写一个可以从 1 到 n 输出代表这个数字的字符串的程序,但是:如果这个数字可以被 3 整除,输出 "fizz"。如果这个数字可以被 5 整除,输出"buzz"。如果这个数字可以同时被 3 和 5 整除,输出 "fizzbuzz"。例如,当n = 15,输出:1, 2, fizz, 4, buzz, fizz, 7, 8, fizz, buzz, 11, fizz, 13, 14...原创 2020-03-08 20:43:39 · 9329 阅读 · 19 评论 -
(多线程)leetcode1117. H2O 生成 认识Java中的PV原语
现在有两种线程,氢 oxygen 和氧 hydrogen,你的目标是组织这两种线程来产生水分子。存在一个屏障(barrier)使得每个线程必须等候直到一个完整水分子能够被产生出来。氢和氧线程会被分别给予 releaseHydrogen 和 releaseOxygen 方法来允许它们突破屏障。这些线程应该三三成组突破屏障并能立即组合产生一个水分子。你必须保证产生一个水分子所需线程的结...原创 2020-03-08 17:01:08 · 5143 阅读 · 23 评论 -
(多线程)leetcode1116. 打印零与奇偶数
假设有这么一个类:class ZeroEvenOdd {public ZeroEvenOdd(int n) { ... } // 构造函数 public void zero(printNumber) { ... } // 仅打印出 0 public void even(printNumber) { ... } // 仅打印出 偶数 public void odd...原创 2020-03-07 17:47:42 · 10835 阅读 · 63 评论 -
(多线程)leetcode1115. 交替打印FooBar 记得Thread.yield();
我们提供一个类:class FooBar { public void foo() {for (int i = 0; i < n; i++) {print("foo"); } } public void bar() {for (int i = 0; i < n; i++) {print("bar");}...原创 2020-03-07 17:12:56 · 8835 阅读 · 22 评论 -
(多线程)leetcode1114. 按序打印 认识AtomicInteger
我们提供了一个类:public class Foo {public void one() { print("one"); }public void two() { print("two"); }public void three() { print("three"); }}三个不同的线程将会共用一个Foo实例。线程 A 将会调用 one() 方法线程 B 将会调...原创 2020-03-07 16:31:31 · 4222 阅读 · 33 评论 -
总结了线程安全性的二十四个精华问题
1、对象的状态:对象的状态是指存储在状态变量中的数据,对象的状态可能包括其他依赖对象的域。在对象的状态中包含了任何可能影响其外部可见行为的数据。2、一个对象是否是线程安全的,取决于它是否被多个线程访问。这指的是在程序中访问对象的方式,而不是对象要实现的功能。当多个线程访问某个状态变量并且其中有一个线程执行写入操作时,必须采用同步机制来协同这些线程对变量的访问。同步机制包括synch...原创 2019-12-05 19:19:27 · 4372 阅读 · 22 评论 -
终于,我读懂了所有Java集合——sort
Collections.sort事实上Collections.sort方法底层就是调用的Arrays.sort方法,而Arrays.sort使用了两种排序方法,快速排序和优化的归并排序。 快速排序主要是对那些基本类型数据(int,short,long等)排序, 而归并排序用于对Object类型进行排序。使用不同类型的排序算法主要是由于快速排序是不稳定的,而归并排序是稳定的。...原创 2019-12-04 21:45:38 · 3960 阅读 · 2 评论 -
springboot——概述
Spring Boot 介绍Spring Boot 是由 Pivotal 团队提供的全新框架,其设计⽬的是⽤来简化新 Spring 应⽤ 初始搭建以及开发过程,该框架使⽤了特定的⽅式来进⾏配置,从⽽使开发⼈员不再需要定义样板化的配置。默认配置了很多框架的使⽤⽅式,就像 Maven 整合了所有的 Jar 包,Spring Boot整合了所有的框架。Spring Boot的核⼼设计思想...原创 2019-12-04 21:12:00 · 3911 阅读 · 16 评论 -
终于,我读懂了所有Java集合——map篇(多线程)
多线程环境下的问题1.8中hashmap的确不会因为多线程put导致死循环(1.7代码中会这样子),但是依然有其他的弊端,比如数据丢失等等。因此多线程情况下还是建议使用ConcurrentHashMap。数据丢失:当多线程put的时候,当index相同而又同时达到链表的末尾时,另一个线程put的数据会把之前线程put的数据覆盖掉,就会产生数据丢失。if ((e = p.next...原创 2019-12-04 14:02:52 · 7839 阅读 · 46 评论 -
终于,我读懂了所有Java集合——map篇
首先,红黑树细节暂时撸不出来,所以没写,承诺年前一定写HashMap(底层是数组+链表/红黑树,无序键值对集合,非线程安全)基于哈希表实现,链地址法。loadFactor默认为0.75,threshold(阈)为12,并创建一个大小为16的Entry数组。在遍历时是无序的,如需有序,建议使用TreeMap。采用数组方式存储key、value构成的Entry对...原创 2019-12-03 14:22:55 · 10032 阅读 · 97 评论 -
终于,我读懂了所有Java集合——List篇
ArrayList基于数组实现,无容量的限制。在执行插入元素时可能要扩容,在删除元素时并不会减小数组的容量,在查找元素时要遍历数组,对于非null的元素采取equals的方式寻找。是非线程安全的。注意点:(1)ArrayList随机存取元素时间复杂度O(1),插入删除操作需大量移动元素,效率较低(2)为了节约内存,当新建容器为空时,会共享Object[] EMPT...原创 2019-12-03 14:11:11 · 10605 阅读 · 51 评论 -
终于,我读懂了所有Java集合——set篇
HashSet(底层是HashMap)Set不允许元素重复。基于HashMap实现,无容量限制。是非线程安全的。成员变量private transient HashMap<E,Object> map;// Dummy value to associate with an Object in the backing Mapprivate static fina...原创 2019-12-04 14:02:22 · 3224 阅读 · 2 评论 -
终于,我读懂了所有Java集合——queue篇
Stack基于Vector实现,支持LIFO。类声明public class Stack<E> extends Vector<E> {}pushpublic E push(E item) { addElement(item); return item;}poppublic synchronized E pop() {...原创 2019-12-03 14:12:21 · 4312 阅读 · 4 评论 -
volatile
1. volatile简介synchronized是阻塞式同步,在线程竞争激烈的情况下会升级为重量级锁。而volatile就可以说是java虚拟机提供的最轻量级的同步机制。但它同时不容易被正确理解,也至于在并发编程中很多程序员遇到线程安全的问题就会使用synchronized。各个线程会将共享变量从主内存中拷贝到工作内存,然后执行引擎会基于工作内存中的数据进行操作处理。线程在工作内存进...转载 2019-12-01 11:58:50 · 3081 阅读 · 0 评论 -
Spring Security使用
Spring Security在web应用开发中,安全无疑是十分重要的,选择Spring Security来保护web应用是一个非常好的选择。Spring Security 是spring项目之中的一个安全模块,可以非常方便与spring项目无缝集成。特别是在spring boot项目中加入spring security更是十分简单。本篇我们介绍spring security,以及spri...原创 2019-11-29 20:16:02 · 3681 阅读 · 2 评论 -
堆和栈的精华大总结
Java内存分配原理栈、堆、常量池虽同属Java内存分配时操作的区域,但其适用范围和功用却大不相同。一般Java在内存分配时会涉及到以下区域:◆寄存器:我们在程序中无法控制◆栈:存放基本类型的数据和对象的引用,但对象本身不存放在栈中,而是存放在堆中◆堆:存放用new产生的数据◆静态域:存放在对象中用static定义的静态成员◆常量池:存放常量◆非RAM存储:硬盘...原创 2019-11-18 18:38:35 · 19400 阅读 · 183 评论 -
synchronized使用和原理全解
synchronized是Java中的关键字,是一种同步锁。它修饰的对象有以下几种:修饰一个方法被修饰的方法称为同步方法,其作用的范围是整个方法,作用的对象是调用这个方法的对象;修饰一个静态的方法其作用的范围是整个静态方法,作用的对象是这个类的所有对象;修饰一个代码块被修饰的代码块称为同步语句块,其作用的范围是大括号{}括起来的代码,作用的对象是调用这个代码块的对象;修...原创 2019-11-14 10:27:06 · 34575 阅读 · 194 评论 -
类加载器
类加载过程加载->连接->初始化。连接过程又可分为三步:验证->准备->解析。类加载器分类JVM 中内置了三个重要的 ClassLoader,除了 BootstrapClassLoader 其他类加载器均由 Java 实现且全部继承自java.lang.ClassLoader: 启动类加载器(Bootstrap ClassLoader)此类加载器负责将存放...原创 2019-11-13 14:54:41 · 3398 阅读 · 2 评论 -
类加载过程
加载类加载过程的第一步,主要完成下面3件事情:通过全类名获取定义此类的二进制字节流 将字节流所代表的静态存储结构转换为方法区的运行时数据结构 在内存中生成一个代表该类的 Class 对象,作为方法区这些数据的访问入口虚拟机规范多上面这3点并不具体,因此是非常灵活的。比如:"通过全类名获取定义此类的二进制字节流" 并没有指明具体从哪里获取、怎样获取。比如:比较常见的就是从 ZIP 包中...转载 2019-11-11 20:38:41 · 2877 阅读 · 0 评论 -
空间分配
目前主流的垃圾收集器都会采用分代回收算法,因此需要将堆内存分为新生代和老年代,这样我们就可以根据各个年代的特点选择合适的垃圾收集算法。大多数情况下,对象在新生代中 eden 区分配。当 eden 区没有足够空间进行分配时,虚拟机将发起一次 Minor GC.下面我们来进行实际测试以下。在测试之前我们先来看看Minor GC 和 Full GC 有什么不同呢?新生代 GC(Minor ...原创 2019-11-05 20:28:40 · 2952 阅读 · 2 评论 -
垃圾收集器
serialSerial(串行)收集器收集器是最基本、历史最悠久的垃圾收集器了。大家看名字就知道这个收集器是一个单线程收集器了。它的“单线程”的意义不仅仅意味着它只会使用一条垃圾收集线程去完成垃圾收集工作,更重要的是它在进行垃圾收集工作的时候必须暂停其他所有的工作线程("Stop The World"),直到它收集结束。新生代采用复制算法,老年代采用标记-整理算法。虚拟机的设...原创 2019-11-05 20:04:15 · 2956 阅读 · 0 评论 -
垃圾回收
标记-清除该算法分为“标记”和“清除”阶段:首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象。它是最基础的收集算法,后续的算法都是对其不足进行改进得到。这种垃圾收集算法会带来两个明显的问题:效率问题 空间问题(标记清除后会产生大量不连续的碎片)复制为了解决效率问题,“复制”收集算法出现了。它可以将内存分为大小相同的两块,每次使用其中的一块。当这一块的内存使用完...原创 2019-11-05 19:18:52 · 2977 阅读 · 0 评论 -
Hotspot虚拟机的对象
创建Step1:类加载检查虚拟机遇到一条 new 指令时,首先将去检查这个指令的参数是否能在常量池中定位到这个类的符号引用,并且检查这个符号引用代表的类是否已被加载过、解析和初始化过。如果没有,那必须先执行相应的类加载过程。Step2:分配内存在类加载检查通过后,接下来虚拟机将为新生对象分配内存。对象所需的内存大小在类加载完成后便可确定,为对象分配空间的任务等同于把一块确定大...原创 2019-04-16 19:04:14 · 3105 阅读 · 0 评论 -
如何判断对象已经死亡
引用计数给对象中添加一个引用计数器,每当有一个地方引用它,计数器就加 1;当引用失效,计数器就减 1;任何时候计数器为 0 的对象就是不可能再被使用的。这个方法实现简单,效率高,但是目前主流的虚拟机中并没有选择这个算法来管理内存,其最主要的原因是它很难解决对象之间相互循环引用的问题。所谓对象之间的相互引用问题,如下面代码所示:除了对象 objA 和 objB 相互引用着对方之外,这两个对...原创 2019-11-05 18:26:55 · 3155 阅读 · 0 评论 -
关于Java中String的问题
String 对象的两种创建方式:String str1 = "abcd";//先检查字符串常量池中有没有"abcd",如果字符串常量池中没有,则创建一个,然后 str1 指向字符串常量池中的对象,如果有,则直接将 str1 指向"abcd"";String str2 = new String("abcd");//堆中创建一个新的对象String str3 = new String("a...原创 2019-11-05 18:16:05 · 7665 阅读 · 95 评论 -
反射全解
反射的概念反射的引入:Object obj = new Student();若程序运行时接收到外部传入的一个对象,该对象的编译类型是Object,但程序又需要调用该对象运行类型的方法:1.若编译和运行类型都知道,使用 instanceof判断后,强转。2.编译时根本无法预知该对象属于什么类,程序只能依靠运行时信息来发现对象的真实信息,这时就必须使用反射了。3.要是想得到对象...原创 2019-10-31 17:06:00 · 23322 阅读 · 132 评论 -
Java内存区域
概述对于 Java 程序员来说,在虚拟机自动内存管理机制下,不再需要像 C/C++程序开发程序员这样为每一个 new 操作去写对应的 delete/free 操作,不容易出现内存泄漏和内存溢出问题。正是因为 Java 程序员把内存控制权利交给 Java 虚拟机,一旦出现内存泄漏和溢出方面的问题,如果不了解虚拟机是怎样使用内存的,那么排查错误将会是一个非常艰巨的任务。运行时数据区域Jav...原创 2019-10-30 21:42:13 · 5735 阅读 · 1 评论 -
Collection源码阅读
package java.util;import java.util.function.Predicate;import java.util.stream.Stream;import java.util.stream.StreamSupport;/** * 集合层次结构的根接口,一个集合表示一组对象,称为元素 * JDK不提供任何该接口的直接实现,JDK提供实现特定情况的子接口,...原创 2019-10-30 20:02:51 · 3069 阅读 · 3 评论 -
springboot——kaptcha
导入包: <dependency> <groupId>com.github.penggle</groupId> <artifactId>kaptcha</artifactId> <version>2.3.2</version> </dependency>配置类:p...原创 2019-10-29 18:55:29 · 3404 阅读 · 0 评论 -
springboot-拦截器
package com.now.community.community.controller.interceptor;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.stereotype.Component;import org.springframework.web.s...原创 2019-10-28 18:28:59 · 4139 阅读 · 0 评论 -
commons-lang常用方法
maven引入 <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.9</version> </dependency>跟...原创 2018-11-28 10:41:21 · 2751 阅读 · 0 评论 -
Java网络编程
TCP/UDP协议(网络传输过程中,数据的传递两种最常见的形式)TCP传输控制协议:是一种面向连接的、可靠的、基于字节流的传输层通信协议需要首先在网络两端建立安全连接,再进行数据传递,确保网络双方完整无误地传输数据UDP用户数据报协议:是一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务无需建立网络双方连接,直接发送数据包(包含目的地址信息),可能会因为网络问题导致数据传...原创 2019-10-23 15:56:42 · 4814 阅读 · 43 评论 -
Java多线程——基本概念
线程和多线程程序:是一段静态的代码,是应用软件执行的蓝本进程:是程序的一次动态执行过程,它对应了从代码加载、执行至执行完毕的一个完整过程,这个过程也是进程本身从产生、发展至消亡的过程线程:是比进程更小的执行单位。进程在其执行过程中,可以产生多个线程,形成多条执行线索,每条线索,即每个线程也有它自身的产生、存在和消亡的过程,也是一个动态的概念主线程:(每个Java程序都有一个...原创 2019-10-23 10:43:26 · 15172 阅读 · 72 评论 -
springboot3——Email
maven导入包: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId> <version>2.1.6.RELEASE</version...原创 2019-10-22 20:17:33 · 3523 阅读 · 0 评论 -
Java多线程常用方法
start()与run() start() 启动线程并执行相应的run()方法 run() 子线程要执行的代码放入run()方法getName()和setName()getName() 获取此线程的名字setName() 设置此线程的名字isAlive()是判断当前线程是否处于活动状态。活动状态就是已经启动尚未终止。currentThread()...原创 2019-10-21 21:15:11 · 7507 阅读 · 48 评论 -
java 各种数据类型的互相转换
int -- Integer int num = 20; A:Integer i = new Integer(num); B:Integer i = Integer.valueOf(num);Integer -- int Integer i = new Integer(20); A:int num = i.intValue(); int -- St...原创 2019-10-17 21:15:25 · 4235 阅读 · 19 评论