林寻星辰_社区达人页

个人头像照片
林寻星辰

java后端小白

暂无精选文章
暂无更多信息

2023年02月

  • 02.14 23:10:38
    发表了文章 2023-02-14 23:10:38

    高并发编程之阻塞队列

    9 阻塞队列 9.1 BlockingQueue 简介 Concurrent 包中,BlockingQueue 很好的解决了多线程中,如何高效安全 “传输”数据的问题。通过这些高效并且线程安全的队列类,为我们快速搭建 高质量的多线程程序带来极大的便利。本文详细介绍了 BlockingQueue 家庭 中的所有成员,包括他们各自的功能以及常见使用场景。 阻塞队列,顾名思义,首先它是一个队列, 通过一个共享的队列,可以使得数据 由队列的一端输入,从另外一端输出; 当队列是空的,从队列中获取元素的操作将会被阻塞 当队列是满的,从队列中添加元素的操作将会被阻塞 试图从空的队列中获取元
  • 02.14 23:05:28
    发表了文章 2023-02-14 23:05:28

    高并发编程之ThreadPool 线程池

    10 ThreadPool 线程池 10.1 线程池简介 线程池(英语:thread pool):一种线程使用模式。线程过多会带来调度开销, 进而影响缓存局部性和整体性能。而线程池维护着多个线程,等待着监督管理 者分配可并发执行的任务。这避免了在处理短时间任务时创建与销毁线程的代 价。线程池不仅能够保证内核的充分利用,还能防止过分调度。 例子: 10 年前单核 CPU 电脑,假的多线程,像马戏团小丑玩多个球,CPU 需 要来回切换。 现在是多核电脑,多个线程各自跑在独立的 CPU 上,不用切换 效率高。 线程池的优势: 线程池做的工作只要是控制运行的线程数量,处理过程中将任
  • 02.14 23:05:02
    发表了文章 2023-02-14 23:05:02

    高并发编程之JUC 三大辅助类和读写锁

    7 JUC 三大辅助类 JUC 中提供了三种常用的辅助类,通过这些辅助类可以很好的解决线程数量过 多时 Lock 锁的频繁操作。这三种辅助类为: ● • CountDownLatch: 减少计数 ● • CyclicBarrier: 循环栅栏 ● • Semaphore: 信号灯 下面我们分别进行详细的介绍和学习 7.1 减少计数 CountDownLatch CountDownLatch 类可以设置一个计数器,然后通过 countDown 方法来进行 减 1 的操作,使用 await 方法等待计数器不大于 0,然后继续执行 await 方法 之后的语句。 • Count
  • 02.14 23:04:31
    发表了文章 2023-02-14 23:04:31

    高并发编程之多线程锁和Callable&Future 接口

    5 多线程锁 5.1 锁的八个问题演示 package com.xingchen.sync; import java.util.concurrent.TimeUnit; class Phone { public static synchronized void sendSMS() throws Exception { //停留4秒 TimeUnit.SECONDS.sleep(4); System.out.println("------sendSMS"); } public synchronized void
  • 02.14 23:03:07
    发表了文章 2023-02-14 23:03:07

    高并发编程之线程间通信和集合的线程安全

    3 线程间通信 线程间通信的模型有两种:共享内存和消息传递,以下方式都是基本这两种模 型来实现的。我们来基本一道面试常见的题目来分析 场景---两个线程,一个线程对当前数值加 1,另一个线程对当前数值减 1,要求用线程间通信 3.1 synchronized 方案 package com.atguigu.test; class DemoClass{ //加减对象 private int number = 0; /** * 加 1 */ public synchronized void increment() { try {
  • 02.14 23:01:19
    发表了文章 2023-02-14 23:01:19

    高并发编程之什么是 Lock 接口

    2 Lock 接口 2.1 Synchronized 2.1.1 Synchronized 关键字回顾 synchronized 是 Java 中的关键字,是一种同步锁。它修饰的对象有以下几种: 1. 修饰一个代码块, 被修饰的代码块称为同步语句块,其作用的范围是大括号{} 括起来的代码,作用的对象是调用这个代码块的对象; 2. 修饰一个方法, 被修饰的方法称为同步方法,其作用的范围是整个方法,作用 的对象是调用这个方法的对象; o 虽然可以使用 synchronized 来定义方法,但 synchronized 并不属于方法定 义的一部分,因此,synchronized 关键字
  • 02.14 23:00:32
    发表了文章 2023-02-14 23:00:32

    高并发编程之什么是 JUC

    课程内容概览 • 1、什么是 JUC • 2、Lock 接口 • 3、线程间通信 • 4、集合的线程安全 • 5、多线程锁 • 6、Callable 接口 • 7、JUC 三大辅助类: CountDownLatch CyclicBarrier Semaphore • 8、读写锁: ReentrantReadWriteLock • 9、阻塞队列 • 10、ThreadPool 线程池 • 11、Fork/Join 框架 • 12、CompletableFuture\ juc 1.1 JUC 简介 在 Java 中,线程部分是一个重点,本篇文章说的 JUC 也是关于线程的
  • 02.14 22:57:52
    发表了文章 2023-02-14 22:57:52

    设计模式日常学习(七)

    6.5 状态模式 6.5.1 概述 【例】通过按钮来控制一个电梯的状态,一个电梯有开门状态,关门状态,停止状态,运行状态。每一种状态改变,都有可能要根据其他状态来更新处理。例如,如果电梯门现在处于运行时状态,就不能进行开门操作,而如果电梯门是停止状态,就可以执行开门操作。 类图如下: public interface ILift { //电梯的4个状态 //开门状态 public final static int OPENING_STATE = 1; //关门状态 public final static int CLOSING_STATE = 2;
  • 02.14 22:57:22
    发表了文章 2023-02-14 22:57:22

    设计模式日常学习(六)

    六.行为型模式 行为型模式用于描述程序在运行时复杂的流程控制,即描述多个类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务,它涉及算法与对象间职责的分配。 行为型模式分为类行为模式和对象行为模式,前者采用继承机制来在类间分派行为,后者采用组合或聚合在对象间分配行为。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象行为模式比类行为模式具有更大的灵活性。 行为型模式分为: ● 模板方法模式 ● 策略模式 ● 命令模式 ● 职责链模式 ● 状态模式 ● 观察者模式 ● 中介者模式 ● 迭代器模式 ● 访问者模式 ● 备忘录模式 ● 解释器模式 以上 11 种行为型模
  • 02.14 22:42:14
    发表了文章 2023-02-14 22:42:14

    设计模式日常学习(五)

    五.结构型模式 结构型模式描述如何将类或对象按某种布局组成更大的结构。它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接口和类,后者釆用组合或聚合来组合对象。 由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象结构型模式比类结构型模式具有更大的灵活性。 结构型模式分为以下 7 种: ● 代理模式 ● 适配器模式 ● 装饰者模式 ● 桥接模式 ● 外观模式 ● 组合模式 ● 享元模式 5.1.代理模式 5.1.1 概述 由于某些原因需要给某对象提供一个代理以控制对该对象的访问。这时,访问对象不适合或者不能直接引用目标对象,代理对象作为访问对象和目标对象之间的中介。
  • 02.14 22:41:53
    发表了文章 2023-02-14 22:41:53

    设计模式日常学习(四)

    三.原型模式 概述 用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型对象相同的新对象。 结构 原型模式包含如下角色: ● 抽象原型类:规定了具体原型对象必须实现的的 clone() 方法。 ● 具体原型类:实现抽象原型类的 clone() 方法,它是可被复制的对象。 ● 访问类:使用具体原型类中的 clone() 方法来复制新的对象。 实现 原型模式的克隆分为浅克隆和深克隆。 浅克隆:创建一个新对象,新对象的属性和原来对象完全相同,对于非基本类型属性,仍指向原有属性所指向的对象的内存地址。 深克隆:创建一个新对象,属性中引用的其他对象也会被克隆,不再指向原有对象地址。 Ja
  • 02.14 22:40:38
    发表了文章 2023-02-14 22:40:38

    设计模式日常学习(三)

    创建者模式 二.工厂模式 在java中,万物皆对象,这些对象都需要创建,如果创建的时候直接new该对象,就会对该对象耦合严重,假如我们要更换对象,所有new对象的地方都需要修改一遍,这显然违背了软件设计的开闭原则。如果我们使用工厂来生产对象,我们就只和工厂打交道就可以了,彻底和对象解耦,如果要更换对象,直接在工厂里更换该对象即可,达到了与对象解耦的目的;所以说,工厂模式最大的优点就是:解耦。 ● 简单工厂模式(不属于GOF的23种经典设计模式) ● 工厂方法模式 ● 抽象工厂模式 1.简单工厂模式 简单工厂不是一种设计模式,反而比较像是一种编程习惯。 1.1 结构 简单工厂包含如下角色: ●
  • 02.14 22:40:05
    发表了文章 2023-02-14 22:40:05

    设计模式日常学习(二)

    跟着黑马的视频学习设计模式总结记录 地址:BV1Np4y1z7BU 软件设计原则 在软件开发中,为了提高软件系统的可维护性和可复用性,增加软件的可扩展性和灵活性,程序员要尽量根据6条原则来开发程序,从而提高软件开发效率、节约软件开发成本和维护成本。 一.开闭原则 对扩展开放,对修改关闭。 在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。简言之,是为了使程序的扩展性好,易于维护和升级。 想要达到这样的效果,我们需要使用接口和抽象类。 因为抽象灵活性好,适应性广,只要抽象的合理,可以基本保持软件架构的稳定。而软件中易变的细节可以从抽象派生来的实现类来进行扩展,当软件需要发生变
  • 02.14 22:39:45
    发表了文章 2023-02-14 22:39:45

    设计模式日常学习(一)

    设计模式 软件设计模式的概念 软件设计模式(Software Design Pattern),又称设计模式,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。它描述了在软件设计过程中的一些不断重复发生的问题,以及该问题的解决方案。也就是说,它是解决特定问题的一系列套路,是前辈们的代码设计经验的总结,具有一定的普遍性,可以反复使用。 学习设计模式的必要性 设计模式的本质是面向对象设计原则的实际运用,是对类的封装性、继承性和多态性以及类的关联关系和组合关系的充分理解。 正确使用设计模式具有以下优点。 ● 可以提高程序员的思维能力、编程能力和设计能力。 ● 使程序设计更加标准化、代
  • 02.14 22:34:30
    发表了文章 2023-02-14 22:34:30

    初级算法之数组(完结)

    数组 删除有序数组中的重复项 给你一个 升序排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。 由于在某些语言中不能改变数组的长度,所以必须将结果放在数组nums的第一部分。更规范地说,如果在删除重复项之后有 k 个元素,那么 nums 的前 k 个元素应该保存最终结果。 将最终结果插入 nums 的前 k 个位置后返回 k 。 不要使用额外的空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。 思路及代码 遍历数组的每一个数,如果当前元素和下一个元素不一样,那么就加一. c
  • 02.14 22:34:13
    发表了文章 2023-02-14 22:34:13

    高度平衡的二叉搜索树简介

    什么是一个高度平衡的二叉搜索树? 树结构中的常见用语: 节点的深度 - 从树的根节点到该节点的边数 节点的高度 - 该节点和叶子之间最长路径上的边数 树的高度 - 其根节点的高度 一个高度平衡的二叉搜索树(平衡二叉搜索树)是在插入和删除任何节点之后,可以自动保持其高度最小。也就是说,有 N 个节点的平衡二叉搜索树,它的高度是 logN 。并且,每个节点的两个子树的高度不会相差超过 1。 为什么是 logN 呢? 一个高度为 h 的二叉树 .换言之,一个有 N 个节点,且高度为 h 的二叉树 所以根据定义, 我们可以判断出一个二叉搜索树是否是高度平衡的 (平衡二叉树)。 正如我们之前提到的
  • 02.14 22:33:54
    发表了文章 2023-02-14 22:33:54

    数据结构和算法(二叉搜索树)

    概述 二叉搜索树是二叉树的一种特殊形式。 二叉搜索树具有以下性质:每个节点中的值必须大于(或等于)其左侧子树中的任何值,但小于(或等于)其右侧子树中的任何值。 二叉搜索树(BST)是二叉树的一种特殊表示形式,它满足如下特性: 每个节点中的值必须大于(或等于)存储在其左侧子树中的任何值。 每个节点中的值必须小于(或等于)存储在其右子树中的任何值。 在二叉搜索树中实现搜索操作 - 介绍 二叉搜索树主要支持三个操作:搜索、插入和删除。 在本章中,我们将讨论如何在二叉搜索树中搜索特定的值。 根据BST的特性,对于每个节点: 如果目标值等于节点的值,则返回节点; 如果目标值小于节点的值,则继续在左子树
  • 02.14 22:32:47
    发表了文章 2023-02-14 22:32:47

    数据结构和算法(树Tree)

    树 概述: 树: 是一种经常用到的数据结构,用来模拟具有树状结构性质的数据集合。 树里的每一个节点有一个值和一个包含所有子节点的列表。从图的观点来看,树也可视为一个拥有N 个节点和N-1 条边的一个有向无环图。 二叉树: 是一种更为典型的树状结构。如它名字所描述的那样,二叉树是每个节点最多有两个子树的树结构,通常子树被称作“左子树”和“右子树”。 树的遍历 前序遍历 前序遍历首先访问根节点,然后遍历左子树,最后遍历右子树。 中序遍历 中序遍历是先遍历左子树,然后访问根节点,然后遍历右子树。 我们可以通过中序遍历得到一个递增的有序序列 后序遍历 后序遍历是先遍历左子树,然后遍历右子树,最后访
  • 02.14 22:32:27
    发表了文章 2023-02-14 22:32:27

    算法小白成长之路(一)

    --- title: 算法小白成长之路(一) date: 2022-11-06 20:56:58 tags: -java -算法 -力扣 categories: -算法刷题总结 --- 情景一: 头尾交换位置往中间靠近: 反转字符串: 344. 反转字符串 编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。 不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。 示例 1: 输入:s = ["h","e","l","l","o"] 输出:["o","l","l","e","h"] 示例 2: 输入:s = [
  • 02.14 22:32:03
    发表了文章 2023-02-14 22:32:03

    数据结构和算法之图的认识

    什么是图 定义 包含 ● 1. 一组顶点:通常用V(Vertex)表示顶点集合 ● 2. 一组边:通常用E(Edge)表示边的集合 ⅰ. 1. 边是顶点对:(v,w)属于E,其中v,w属于V ⅱ. 2. 有向边<v,w>表示从v指 ⅲ. 3.不考虑重边和自回路 抽象数据类型定义 ● 1.类型名称:图(Graph) ● 2. 数据对象集:G(V,E)由一个非空的有限顶点集合V和一个有限边集合E组成(可以一条边都没有,但不 能一个顶点都没有) ● 3. 操作集:对于任意图G属于Graph,以及v属于V,e属于E 1. Graph Create():建立并返回空图
  • 02.14 22:31:40
    发表了文章 2023-02-14 22:31:40

    数据结构和算法之图的遍历

    6.2 图的遍历 6.2.1 图的遍历——DFS 遍历:把图里面每个顶点都访问一遍而且不能有重复的访问 深度优先搜索(DFS) 当访问完了一个节点所有的灯后,一定原路返回对应着堆栈的出栈入栈的一个行为 深度优先搜索的算法描述 void DFS(Vertex V)//从迷宫的节点出来 { visited[V] = true;//给每个节点一个变量,true相当于灯亮了,false则是熄灭状态 for(V的每个邻接点W)//视野看得到的灯 if(!visited[W])//检测是否还有没点亮的 DFS(W);//递归调用 } //类似树的先序遍历 若有N个顶点、E条边,时间复杂度是 用邻
  • 02.14 22:31:12
    发表了文章 2023-02-14 22:31:12

    初级算法之字符串

    344. 反转字符串 编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。 思路一: 从中间开始向两边遍历,然后两边交换位置,最终获得字符串的反转 // class Solution { public void reverseString(char[] s) { int len = s.length,size = len; for(int i = 0;i < len/2;i++){ size--; char tmp = s[i]; s[i] = s[s
  • 02.14 22:30:30
    发表了文章 2023-02-14 22:30:30

    数据结构和算法之如何建立图

    小白BG.1 邻接矩阵表示的图结点的结构 typedef struct GNode *PtrToGNode;//PtrToGNode是指向GNode的一个指针 struct GNode{ int Nv;//顶点数 int Ne;//边数 WeightType G[MaxVertexNum][MaxVertexNum]; DataType Data[MaxVertexNum];//存顶点的数据 }; typedef PtrToGNode MGraph;//以邻接矩阵存储的图类型。定义为指向节点的指针。因为要用到的时候 一个指针远远比一整个图来的快捷 小白BG.2 邻接矩阵表示的图——初始化 初
  • 02.14 22:30:08
    发表了文章 2023-02-14 22:30:08

    数据结构与算法之图的应用

    一.树之习题选讲-Tree Traversals Again 树习题-TTA.1 题意理解 非递归中序遍历的过程 ● 1. Push的顺序为先序遍历(pre) ● 2. Pop的顺序给出中序遍历(in) ● 树习题-TTA.2 核心算法 上图分别是先序、中序、后序遍历通过规律我们可以看到他们之间的位置分配 //伪代码 void solve(int preL,int inL,int n) { if(n == 0) return;//n等于0的时候什么都不做(n真的会右等于0的时候吗?为什么写他?)调用完了 之后右边没有元素,此时n等于0,进行判断正常结束进程 if(n == 1){p
  • 02.14 22:29:03
    发表了文章 2023-02-14 22:29:03

    初级算法之链表

    剑指 Offer 18. 删除链表的节点 给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。 返回删除后的链表的头节点。 思路: 对链表进行遍历,遇到要删除的结点就可以用per=cur;cur=cur.next;来进行删除,per.next=per.next.next; /**  * Definition for singly-linked list.  * public class ListNode {  *     int val;  *     ListNode next;  *     ListNode(int x) { val = x; }  * }
  • 02.14 22:28:33
    发表了文章 2023-02-14 22:28:33

    初级算法之树

    树比链表稍微复杂,因为链表是线性数据结构,而树不是。 树的问题可以由 广度优先搜索 或 深度优先搜索 解决。 在本章节中,我们提供了一个对于练习 广度优先遍历 很好的题目。 我们推荐以下题目: 二叉树的最大深度,验证二叉搜索树,二叉树的层次遍历 和 将有序数组转换为二叉搜索树。 剑指 Offer 55 - I. 二叉树的深度 输入一棵二叉树的根节点,求该树的深度。从根节点到叶节点依次经过的节点(含根、叶节点)形成树的一条路径,最长路径的长度为树的深度。 递归法: class Solution { public int maxDepth(TreeNode root) {
  • 02.14 22:27:57
    发表了文章 2023-02-14 22:27:57

    面试题(二十四)数据结构与算法

    9.1哈希 请谈一谈,hashCode() 和equals() 方法的重要性体现在什么地方? 考察点:JAVA哈希表 参考回答: Java中的HashMap使用hashCode()和equals()方法来确定键值对的索引,当根据键获取值的时候也会用到这两个方法。如果没有正确的实现这两个方法,两个不同的键可能会有相同的hash值,因此,可能会被集合认为是相等的。而且,这两个方法也用来发现重复元素。所以这两个方法的实现对HashMap的精确性和正确性是至关重要的。 请说一说,Java中的HashMap的工作原理是什么? 考察点:JAVA哈希表 参考回答: HashMap是以键值对的形式存储元素的,
  • 02.14 22:27:04
    发表了文章 2023-02-14 22:27:04

    牛客java刷题知识点总结(七)

    方法调用 类中变量:除了private权限外,其他权限的变量(没有表示默认default),均可以用“对象.变量名”来调用。对于private变量,即使使用static,也不能用“类.变量名”来调用私有变量。只能通过类中的public get()方法来调用。 类中方法:除了private权限外,其他权限的方法(没有表示默认default),均可以用“对象.方法名”来调用。private方法可以用java反射机制调用。当然如果用 private修饰方法,该方法只在类的内部调用。其中比较著名的就是单例模式中的私有构造方法。 static属性:static方法在编译期就已经生成了,其他方法
  • 02.14 22:26:42
    发表了文章 2023-02-14 22:26:42

    牛客java刷题知识点总结(六)

    内存引用地址 内存引用地址,是指栈中存放的地址,来指向堆中的某个位置。 int 是基本类型,数据直接存放在栈中,不存在内存引用地址的说法 == A对 指向常量池里的"hello"。 B对 题中没说声明的a是局部变量。 C错 int a =1;并不指向堆中,它只有值,没有引用地址,Integer b =new Integer(1);指向堆中地址为1的位置。 D错 原因同C java并发 答案:B A,CopyOnWriteArrayList适用于写少读多的并发场景 B,ReadWriteLock即为读写锁,他要求写与写之间互斥,读与写之间互斥, 读与读之间可
  • 02.14 22:26:15
    发表了文章 2023-02-14 22:26:15

    牛客java刷题知识点总结(五)

    jdbc statement的说法 1.Statement、PreparedStatement和CallableStatement都是接口(interface)。 2.Statement继承自Wrapper、PreparedStatement继承自Statement、CallableStatement继承自PreparedStatement。 3. Statement接口提供了执行语句和获取结果的基本方法; PreparedStatement接口添加了处理 IN 参数的方法; CallableStatement接口添加了处理 OUT 参数的方法。 4. a.Statem
  • 02.14 22:25:51
    发表了文章 2023-02-14 22:25:51

    牛客java刷题知识点总结(四)

    异常 假如try中有异常抛出,则会去执行catch块,再去执行finally块;假如没有catch 块,可以直接执行finally 块,方法就以抛出异常的方式结束,而finally 后的内容也不会被执行,所以catch 和 finally 不能同时省略。 继承和实现 1.类与类之间的关系为继承,只能单继承,但可以多层继承。 2.类与接口之间的关系为实现,既可以单实现,也可以多实现。 3.接口与接口之间的关系为继承,既可以单继承,也可以多继承。 多线程 Thread.yield()方法作用是:暂停当前正在执行的线程对象,并执行其他线程。 yield()应该做的是让当前运行线程回到可运行状态,以
  • 02.14 17:31:14
    发表了文章 2023-02-14 17:31:14

    java基础复习

    这是前段时间学长让复习java基础时候发了一个问题的文档,根据问题在网上查阅资料文档总结记录下来的内容(我把问题的文档也放到下面方便查阅) java基础复习 开发者客栈-帮助开发者面试的平台-顽强网络 (developers.pub) http://c.biancheng.net/java/10/ Java 语言是一种分布式的面向对象语言,具有面向对象、平台无关性、简单性、解释执行、多线程、安全性等很多特点 1. 面向对象 Java 是一种面向对象的语言,它对对象中的类、对象、继承、封装、多态、接口、包等均有很好的支持。为了简单起见,Java 只支持类之间的单继承,但是可以使用接口来实现多继承
  • 02.14 17:30:41
    发表了文章 2023-02-14 17:30:41

    牛客java刷题知识点总结(二)

    命令javac-d参数的用途 -d destination 目的地 -s source 起源地 javac -d 指定放置生成的类文件的位置 javac -s 指定放置生成的源文件的位置 杂记 A.StringBuilder线程不安全,StringBuffer线程安全。 B.同时用 abstract和final就会自相矛盾。 C.Hashmap中的value可以之null,get(key)==null有两种情况,一是key不存在,二是该key中存的是null,所以应该使用map.containskey(key)返回的true/false来判断是否存在这个key。 D.volatile关键字有两
  • 02.14 17:30:23
    发表了文章 2023-02-14 17:30:23

    牛客java基础刷题笔记(三)

    当你创建一个新的实例对象时,它会得到一块新的内存空间。但是类中的静态成员变量是所有对象共有的,也就是在一片属于类的存储空间中,被所有对象共有。 servlet在多线程下其本身并不是线程安全的。 如果在类中定义成员变量,而在service中根据不同的线程对该成员变量进行更改,那么在并发的时候就会引起错误。最好是在方法中,定义局部变量,而不是类变量或者对象的成员变量。由于方法中的局部变量是在栈中,彼此各自都拥有独立的运行空间而不会互相干扰,因此才做到线程安全。 JDK提供的用于并发编程的同步器 Java 并发库 的Semaphore 可以很轻松完成信号量控制,Semaphore可以控制某个资源
  • 02.14 17:30:00
    发表了文章 2023-02-14 17:30:00

    牛客java刷题知识点总结(一)

    java基本类型的默认值和取值范围 字节型 : 0 -2^7—-2^7-1 byte b=10; 字符型 : ‘ \u0000′ 0—-2^16-1 char c=’c’ ; short : 0 -2^15—-2^15-1 short s=10; int : 0 -2^31—-2^31-1 int i=10; long : 0 -2^63—-2^63-1 long o=10L; float : 0.0f -2^31—-2^31-1 float f=10.0F double : 0.0d -2^63—-2^63-1 double d=10.0; boolean: fals
  • 02.14 17:28:39
    发表了文章 2023-02-14 17:28:39

    面试题(二十五)设计模式

    1. 设计模式 1.1 说一说设计模式的六大原则 参考答案 单一职责原则 一个类,应当只有一个引起它变化的原因;即一个类应该只有一个职责。 就一个类而言,应该只专注于做一件事和仅有一个引起变化的原因,这就是所谓的单一职责原则。该原则提出了对对象职责的一种理想期望,对象不应该承担太多职责,正如人不应该一心分为二用。唯有专注,才能保证对象的高内聚;唯有单一,才能保证对象的细粒度。对象的高内聚与细粒度有利于对象的重用。一个庞大的对象承担了太多的职责,当客户端需要该对象的某一个职责时,就不得不将所有的职责都包含进来,从而造成冗余代码。 里氏替换原则 在面向对象的语言中,继承是必不可少的、优秀的语言机制
  • 02.14 17:28:14
    发表了文章 2023-02-14 17:28:14

    面试题(二十四)数据结构与算法

    9.1哈希 请谈一谈,hashCode() 和equals() 方法的重要性体现在什么地方? 考察点:JAVA哈希表 参考回答: Java中的HashMap使用hashCode()和equals()方法来确定键值对的索引,当根据键获取值的时候也会用到这两个方法。如果没有正确的实现这两个方法,两个不同的键可能会有相同的hash值,因此,可能会被集合认为是相等的。而且,这两个方法也用来发现重复元素。所以这两个方法的实现对HashMap的精确性和正确性是至关重要的。 请说一说,Java中的HashMap的工作原理是什么? 考察点:JAVA哈希表 参考回答: HashMap是以键值对的形式存储元素的,
  • 02.14 17:27:50
    发表了文章 2023-02-14 17:27:50

    面试题(二十三)操作系统(一)

    1.1 Linux里如何查看一个想知道的进程? 参考回答 查看进程运行状态的指令:ps命令。“ps -aux | grep PID”,用来查看某PID进程状态 答案解析 //ps使用示例 //显示当前所有进程 ps -A //与grep联用查找某进程 ps -aux | grep apache //查看进程运行状态、查看内存使用情况的指令均可使用top指令。 top 1.2 Linux里如何查看带有关键字的日志文件? 参考回答 1. cat 路径/文件名 | grep 关键词 # 返回test.log中包含http的所有行 cat test.log | grep "http"
  • 02.14 17:27:21
    发表了文章 2023-02-14 17:27:21

    面试题(二十二)消息队列与搜索引擎

    2. 消息队列 2.1 MQ有什么用? 参考答案 消息队列有很多使用场景,比较常见的有3个:解耦、异步、削峰。 1. 解耦:传统的软件开发模式,各个模块之间相互调用,数据共享,每个模块都要时刻关注其他模块的是否更改或者是否挂掉等等,使用消息队列,可以避免模块之间直接调用,将所需共享的数据放在消息队列中,对于新增业务模块,只要对该类消息感兴趣,即可订阅该类消息,对原有系统和业务没有任何影响,降低了系统各个模块的耦合度,提高了系统的可扩展性。 2. 异步:消息队列提供了异步处理机制,在很多时候应用不想也不需要立即处理消息,允许应用把一些消息放入消息中间件中,并不立即处理它,在之后需要的时候再慢慢处
  • 02.14 17:26:54
    发表了文章 2023-02-14 17:26:54

    java面试题(二十一)redis2

    1.21 说一说Redis集群的应用和优劣势 参考答案 优势: Redis Cluster是Redis的分布式解决方案,在3.0版本正式推出,有效地解决了Redis分布式方面的需求。当遇到单机内存、并发、流量等瓶颈时,可以采用Cluster架构方案达到负载均衡的目的。 劣势: Redis集群方案在扩展了Redis处理能力的同时,也带来了一些使用上的限制: 1. key批量操作支持有限。如mset、mget,目前只支持具有相同slot值的key执行批量操作。对于映射为不同slot值的key由于执行mset、mget等操作可能存在于多个节点上所以不被支持。 2. key事务操作支持有限。同理只支持
  • 02.14 17:26:33
    发表了文章 2023-02-14 17:26:33

    java面试题(二十)中间件redis

    1.1 Redis可以用来做什么? 参考答案 1. Redis最常用来做缓存,是实现分布式缓存的首先中间件; 2. Redis可以作为数据库,实现诸如点赞、关注、排行等对性能要求极高的互联网需求; 3. Redis可以作为计算工具,能用很小的代价,统计诸如PV/UV、用户在线天数等数据; 4. Redis还有很多其他的使用场景,例如:可以实现分布式锁,可以作为消息队列使用。 1.2 Redis和传统的关系型数据库有什么不同? 参考答案 Redis是一种基于键值对的NoSQL数据库,而键值对的值是由多种数据结构和算法组成的。Redis的数据都存储于内存中,因此它的速度惊人,读写性能可达10万/秒
  • 02.14 17:26:11
    发表了文章 2023-02-14 17:26:11

    java面试题(十九) Mybatis

    4.1 谈谈MyBatis和JPA的区别 参考答案 ORM映射不同: MyBatis是半自动的ORM框架,提供数据库与结果集的映射; JPA(默认采用Hibernate实现)是全自动的ORM框架,提供对象与数据库的映射。 可移植性不同: JPA通过它强大的映射结构和HQL语言,大大降低了对象与数据库的耦合性; MyBatis由于需要写SQL,因此与数据库的耦合性直接取决于SQL的写法,如果SQL不具备通用性而用了很多数据库的特性SQL的话,移植性就会降低很多,移植时成本很高。 日志系统的完整性不同: JPA日志系统非常健全、涉及广泛,包括:SQL记录、关系异常、优化警告、缓存提示、脏数据警告等
  • 02.14 17:25:48
    发表了文章 2023-02-14 17:25:48

    java面试题(十八)spring MVC

    3.1 什么是MVC? 参考答案 MVC是一种设计模式,在这种模式下软件被分为三层,即Model(模型)、View(视图)、Controller(控制器)。Model代表的是数据,View代表的是用户界面,Controller代表的是数据的处理逻辑,它是Model和View这两层的桥梁。将软件分层的好处是,可以将对象之间的耦合度降低,便于代码的维护。 3.2 DAO层是做什么的? 参考答案 DAO是Data Access Object的缩写,即数据访问对象,在项目中它通常作为独立的一层,专门用于访问数据库。这一层的具体实现技术有很多,常用的有Spring JDBC、Hibernate、JPA、
  • 02.14 16:54:40
    发表了文章 2023-02-14 16:54:40

    java面试题(十七)spring

    2.1 请你说说Spring的核心是什么 参考答案 Spring框架包含众多模块,如Core、Testing、Data Access、Web Servlet等,其中Core是整个Spring框架的核心模块。Core模块提供了IoC容器、AOP功能、数据绑定、类型转换等一系列的基础功能,而这些功能以及其他模块的功能都是建立在IoC和AOP之上的,所以IoC和AOP是Spring框架的核心。 IoC(Inversion of Control)是控制反转的意思,这是一种面向对象编程的设计思想。在不采用这种思想的情况下,我们需要自己维护对象与对象之间的依赖关系,很容易造成对象之间的耦合度过高,在一个大
  • 02.14 16:54:16
    发表了文章 2023-02-14 16:54:16

    java面试题(十六)springBoot

    1.1 说说你对Spring Boot的理解 参考答案 从本质上来说,Spring Boot就是Spring,它做了那些没有它你自己也会去做的Spring Bean配置。Spring Boot使用“习惯优于配置”的理念让你的项目快速地运行起来,使用Spring Boot很容易创建一个能独立运行、准生产级别、基于Spring框架的项目,使用Spring Boot你可以不用或者只需要很少的Spring配置。 简而言之,Spring Boot本身并不提供Spring的核心功能,而是作为Spring的脚手架框架,以达到快速构建项目、预置三方配置、开箱即用的目的。Spring Boot有如下的优点: ●
  • 02.14 16:54:00
    发表了文章 2023-02-14 16:54:00

    java面试题(十五)数据库之索引

    2.1 说一说你对MySQL索引的理解 参考答案 索引是一个单独的、存储在磁盘上的数据库结构,包含着对数据表里所有记录的引用指针。使用索引可以快速找出在某个或多个列中有一特定值的行,所有MySQL列类型都可以被索引,对相关列使用索引是提高查询操作速度的最佳途径。 索引是在存储引擎中实现的,因此,每种存储引擎的索引都不一定完全相同,并且每种存储引擎也不一定支持所有索引类型。MySQL中索引的存储类型有两种,即BTREE和HASH,具体和表的存储引擎相关。MyISAM和InnoDB存储引擎只支持BTREE索引;MEMORY/HEAP存储引擎可以支持HASH和BTREE索引。 索引的优点主要有以下几
  • 02.14 16:53:39
    发表了文章 2023-02-14 16:53:39

    java面试题(十四)数据库之sql

    1.1 介绍一下数据库分页 参考答案 MySQL的分页语法: 在MySQL中,SELECT语句默认返回所有匹配的行,它们可能是指定表中的每个行。为了返回第一行或前几行,可使用LIMIT子句,以实现分页查询。LIMIT子句的语法如下: -- 在所有的查询结果中,返回前5行记录。 SELECT prod_name FROM products LIMIT 5; -- 在所有的查询结果中,从第5行开始,返回5行记录。 SELECT prod_name FROM products LIMIT 5,5; 总之,带一个值的LIMIT总是从第一行开始,给出的数为返回的行数。带两个值的LIMIT可以指定从行号
  • 02.14 16:53:15
    发表了文章 2023-02-14 16:53:15

    java面试题(十三)之多线程篇

    4.11 如何实现子线程先执行,主线程再执行? 参考答案 启动子线程后,立即调用该线程的join()方法,则主线程必须等待子线程执行完成后再执行。 扩展阅读 Thread类提供了让一个线程等待另一个线程完成的方法——join()方法。当在某个程序执行流中调用其他线程的join()方法时,调用线程将被阻塞,直到被join()方法加入的join线程执行完为止。 join()方法通常由使用线程的程序调用,以将大问题划分成许多小问题,每个小问题分配一个线程。当所有的小问题都得到处理后,再调用主线程来进一步操作。 4.12 阻塞线程的方式有哪些? 参考答案 当发生如下情况时,线程将会进入阻塞状态: ●
  • 02.14 16:52:56
    发表了文章 2023-02-14 16:52:56

    java面试题(十二)之多线程篇

    4.1 创建线程有哪几种方式? 参考答案 创建线程有三种方式,分别是继承Thread类、实现Runnable接口、实现Callable接口。 通过继承Thread类来创建并启动线程的步骤如下: 1. 定义Thread类的子类,并重写该类的run()方法,该run()方法将作为线程执行体。 2. 创建Thread子类的实例,即创建了线程对象。 3. 调用线程对象的start()方法来启动该线程。 通过实现Runnable接口来创建并启动线程的步骤如下: 1. 定义Runnable接口的实现类,并实现该接口的run()方法,该run()方法将作为线程执行体。 2. 创建Runnable实现类的实例
  • 02.14 16:52:33
    发表了文章 2023-02-14 16:52:33

    java面试题(十一)IO流篇

    3.1 介绍一下Java中的IO流 参考答案 IO(Input Output)用于实现对数据的输入与输出操作,Java把不同的输入/输出源(键盘、文件、网络等)抽象表述为流(Stream)。流是从起源到接收的有序数据,有了它程序就可以采用同一方式访问不同的输入/输出源。 ● 按照数据流向,可以将流分为输入流和输出流,其中输入流只能读取数据、不能写入数据,而输出流只能写入数据、不能读取数据。 ● 按照数据类型,可以将流分为字节流和字符流,其中字节流操作的数据单元是8位的字节,而字符流操作的数据单元是16位的字符。 ● 按照处理功能,可以将流分为节点流和处理流,其中节点流可以直接从/向一个特定的I
  • 发表了文章 2023-02-14

    高并发编程之阻塞队列

  • 发表了文章 2023-02-14

    高并发编程之ThreadPool 线程池

  • 发表了文章 2023-02-14

    高并发编程之JUC 三大辅助类和读写锁

  • 发表了文章 2023-02-14

    高并发编程之多线程锁和Callable&Future 接口

  • 发表了文章 2023-02-14

    高并发编程之线程间通信和集合的线程安全

  • 发表了文章 2023-02-14

    高并发编程之什么是 Lock 接口

  • 发表了文章 2023-02-14

    高并发编程之什么是 JUC

  • 发表了文章 2023-02-14

    设计模式日常学习(七)

  • 发表了文章 2023-02-14

    设计模式日常学习(六)

  • 发表了文章 2023-02-14

    设计模式日常学习(五)

  • 发表了文章 2023-02-14

    设计模式日常学习(四)

  • 发表了文章 2023-02-14

    设计模式日常学习(三)

  • 发表了文章 2023-02-14

    设计模式日常学习(二)

  • 发表了文章 2023-02-14

    设计模式日常学习(一)

  • 发表了文章 2023-02-14

    初级算法之数组(完结)

  • 发表了文章 2023-02-14

    高度平衡的二叉搜索树简介

  • 发表了文章 2023-02-14

    数据结构和算法(二叉搜索树)

  • 发表了文章 2023-02-14

    数据结构和算法(树Tree)

  • 发表了文章 2023-02-14

    算法小白成长之路(一)

  • 发表了文章 2023-02-14

    数据结构和算法之图的认识

正在加载, 请稍后...
滑动查看更多
  • 回答了问题 2023-02-14

    问答最高荣誉,乘风问答官招募中!每周积分活动、每月排位赛等权益专享!

    积极参加

    踩0 评论0
正在加载, 请稍后...
滑动查看更多
正在加载, 请稍后...
暂无更多信息