2020年如何面试大厂?阿里架构师良心分享美团、滴滴Java岗面试真题

Java架构师面试题 个人搜集的Java架构师面试题及答案,有需要的朋友可以下载 立即下载

本文转载自:2020年如何面试大厂?阿里架构师良心分享美团、滴滴Java岗面试真题


题记:本文会尽量模拟面试现场对话情景, 用口语而非书面语 ,采用问答形式来展现。另外每一个问题都附上“延伸”,这部分内容是帮助小伙伴们更深的理解一些底层细节的补充,在面试中可能很少直接涉及,权当是提高自身水平的知识储备吧。

一、Java基础

1. 问:List 和 Set 都有什么区别?

分析:这种问题面试官一般想考察的都是你对这两种数据结构的了解,已经使用时候的选择依据,所以可以从数据结构和一些使用案例入手分别做个介绍

答:List,列表,元素可重复。常用的实现ArrayList和LinkedList,前者是数组方式来实现,后者是通过链表来实现,在使用选择的时候,一般考虑的是基本数据结构的特性,比如,数组读取效率较高,链表插入时效率较高。

Set,集合,特点就是存储的元素不可重复。常用是实现,是HashSet和TreeSet,分开来谈:

HashSet,底层实现是HashMap,存储时,把值存在key,而value统一存储一个object对象。排重的时候,是先通过对象的hashcode来判断,如果不相等,直接存储。如果相等,会再对key做equals判断,如果依然相等,不存储,如果不相等,则存入,我们知道,HashMap是数组+链表的基本结构,同样的,在HashSet中,也是通过同样的策略,存储在相同的数组位置下的链表中。

TreeSet,存入自定义对象时,对象需要实现Comparable接口,重写排序规则。使用场景一般是需要保证存储数据的有序和唯一性。底层数据结构是自平衡的二叉排序树(红黑树)

延伸:

  1. 在说到HashMap时,可能会直接引到HashMap相关话题,我发现这个问题面试官非常喜欢问,可能是因为HashMap可聊的较多,也能很好的考验下应聘者对底层实现细节、源码阅读、刨根问底的态度。
  2. 涉及到二叉树了,小端就遇到过一次问红黑树特性的,因为之前准备过,胸有成竹的啪啪啪正要一一道来呢,结果刚说到第二个特性,面试官就问:红黑树和普通的平衡二叉树有什么区别?当时一脸懵逼样…回来后赶紧补足,核心区别就是:红黑树也是二叉查找树的一种,二叉树需要通过自旋、或其他方式(比如红黑树还能通过变色)来保证平衡(否则就成了链表结构了,没有时间复杂度上的优势了),红黑树限定的条件相对来说比较宽松,也就是说在平衡的过程中,消耗相对较小。
  3. 由于HashSet无序,为了实现有序的目的,又不想用其他数据结构,可以用LinkedHashSet。简要说明,同HashSet和HashMap关系一样,也是使用了一个LinkedHashMap,LinkedHashMap和普通的HashMap的区别就是,在原有数据结构之上,采用双向链表的形式将所有entry(注意,是前面讲过的数组+链表中的各个链表里的元素,做了连接)连起来,顺序就是entry的插入顺序,这样可以保证元素的迭代顺序和插入顺序相同(有序性)

2. HashMap 是线程安全的吗,为什么不是线程安全的?

分析:这种问题,既然面试官问起,肯定是在这方面有的聊的。这个问题,在多数情况下,能清晰、全面的描述出问题来龙去脉即可,很少有面试官真的拿一段源码来考。当然,作为应聘者,如果能理解的很透彻,再用简单的图边写边讲,作为补充,还是非常出彩的。

答:嗯,不是线程安全的。主要从两个方面来说:

  • 在插入新数据的时候,多线程hash后的结果相同,插入位置也就会定位到数组的相同下标下的同一个链表中。在插入时,假如第二个线程在第一个线程插入的瞬间也插入,就可能会导致,覆盖前面插入的值。
  • 第二个非线程安全的影响是在扩容的时候,扩容会把所有值重新hash,插入到新的扩容后的“数组+链表”结构中。可能会导致环状链表情况出现,这样在读取节点的next节点时,永不为空,也就是著名的扩容时CPU使用率100%情况。

延伸:

要做到心中有底,还是需要知其然知其所以然才行,所以,撸下源码好好想想,才能做到临阵不乱。

  1. 建议好好看看源码,源码量不大,结构也比较清晰。
  2. 针对环状链表的情况,我是看了别人写的图文并茂版的文章弄明白的,这里放上链接,供参考:HashMap高并发问题

3. 问:那你是用什么数据结构来作为替代,满足线程安全的场景要求呢?

分析:这里一般面试官想考察的是对ConcurrentHashMap的了解,但是也有个别情况,会涉及到HashTable,小端就吃过这方面的亏,明明可以一笔带过的小知识点,却由于准备不充分,而没能答完整。

答:在Java里,提供了以下数据结构,可以解决线程安全问题:

  • HashTable,实现原理是通过Synchronize同步锁来把读写方法都加锁的方式。虽然线程安全了,但是效率低下,只要有读写,就不能做其他操作。
  • SynchronizedMap(涉及较少,了解即可),有条件的同步,是Collections类提供的一个方法返回的HashMap的多线程版本。实现是把基本的方法都加了同步锁。
  • ConcurrentHashMap(重头戏):根据jdk版本不同,实现也有差别。

java8以前,是用segment(锁住map一段实现,默认是16段也就是可以并发数支持到16,也可自定义。读不受影响),数据结构为数组(segment)+数组(entry)+链表,适用于读多写少的场景。提供原子操作putIfAbsent()(没有则添加)。segment继承自ReentrantLock,来作为锁。

java8,元素结构为Node(实现Entry接口),数据结构为数组+链表;直接对Node进行加锁,粒度更小。当链表长度大于8,转换为红黑树,当然在转换前,先看下数组长度,如果小于64,那先通过扩容来实现;插入元素时,如果该位置为null,用CAS插入;如果不为null,则加Synchronize锁插入到链表;

扩展:

  • 我们看到,数组的默认长度都是16,那么这个数字有什么深意吗?有!做运算时效率高!属于取巧的设计。一个是扩容的时候,直接向左位操作,移一位,扩张为二倍;二是hash取模的时候,hash值是32位,右移28位,剩高四位,然后与这个length-1也就是15(1111)按位与操作,使数据均匀分布。
  • ConcurrentHashMap在获取size时候是怎么计算的呢?

1.7size(),先获取segment的大小,然后判断是否修改过,如果是,在加锁重新获取segment大小,然后把所有segment大小加在一起;
1.8size()的实现是用一个volatile 变量来做CAS修改,如果高并发,还会把部分值存到一个volatile数组。取值时,把这两部分的值加在一起。mappingcount()方法和size()方法实现方式一样

  • hashmap可以使用null作为key和value,存储于table数组第一个节点;hashtable不允许key和value为null.(这个在一个小公司被面试官问倒了,汗颜)
  • 了解一些其他的数据结构:
  • ConcurrentSkipListMap 数据有序
  • ConcurrentSkipListSet 能去重
  • hashset是用hashmap实现,内部存的是key,所有的value都是同一个object

二、ThreadLocal

1. 问:请谈谈你对ThreadLocal的理解。

分析:在多线程环境下,我们经常遇到这样的场景:维护一个全局变量。如果要保证变量值的正确性(或者说变量值修改的原子性),需用什么方式来实现呢?是的,对修改代码加锁可以实现,保证了在同一时刻只有一个线程来修改该变量值。办法当然不止一种,并发包AtomicXXX一样能达到这个效果,原理,差不多,无非是通过锁来实现并发。那么还有没有其他思路呢?有,ThreadLocal,实现思路可谓是另辟蹊径。

答:每个线程,都会有一个Map(ThreadLocalMap),用来存储以我们定义的ThreadLocal对象为key,以我们自定义的值为value的 名值对。而这个Map,是来自于我们写的多线程程序继承的父线程Thread。以此机制,保证了多线程间该变量值的隔离。

看下源码,以get()方法为切入口:

public T get() {
	Thread t = Thread.currentThread();
	ThreadLocalMap map = getMap(t);
	if (map != null) {
		ThreadLocalMap.Entry e = map.getEntry(this);
		if (e != null) {
			@SuppressWarnings("unchecked")
			                  T result = (T)e.value;
			return result;
		}
	}
	return setInitialValue();
}

重点是第三行,当前线程作为参数传入,我们来看下getMap(t)做了什么?

ThreadLocalMap getMap(Thread t) {
	return t.threadLocals;
}

是的,拿到当前线程对象的threadLocals对象,我们可以通过方法返回值推断,是一个ThreadLocalMap类型的对象。那么这个对象在哪定义的呢?继续看源码:

public class Thread implements Runnable {
	......
	     ThreadLocal.ThreadLocalMap threadLocals = null;
	......
}

很明显,是在Thread类里定义。

扩展:内存泄漏问题。

ThreadLocal对象是弱引用。在GC时,会直接回收。这种情况下,Map中的key为null,value值还在,无法得到及时的释放。目前的策略是在调用get、set、remove等方法时,会启动回收这些值。但是如果一直没调用呢?嗯,很容易就导致内存泄漏了。当然,并不能因为此就认为是弱引用导致的内存泄露,而应该是,设计的这个变量存储机制,导致了泄露。所以在使用的时候,要及时释放(通过以上描述,你肯定已经想到怎么合理释放了吧?)

三、Valotile

1. 问:请你说下对Valotile的了解,以及使用场景。

分析:多线程编程,我们要解决的问题集中在三个方面:

  • 原子性:最简单的例子就是,i++,在多线程环境下,最终的结果是不确定的,为什么?就是因为这么一个++操作,被编译为指令 后,是多个指令来完成的。那么遇到并发的情况,就会导致彼此“覆盖”的情况。
  • 可见性:通俗解释就是,在A线程对一个变量做了修改,在B线程中,能正确的读取到修改后的结果。究其原理,是cpu不是直 接 和系统内存通信,而是把变量读取到L1,L2等内部的缓存中,也叫作私有的数据工作栈。修改也是在内部缓存中,但是何时同步到系统内存是不能确定的,有了这个时间差,在并发的时候,就可能会导致,读到的值,不是最新值。
  • 有序性:这里只说指令重排序,虚拟机在把代码编译为指令后执行,出于优化的目的,在保证结果不变的情况下,可能会调整指 令的执行顺序。

答:valotile,能满足上述的可见性和有序性。但是无法保证原子性。

  • 可见性,是在修改后,强制把对变量的修改同步到系统内存。而其他cpu在读取自己的内部缓存中的值的时候,发现是valotile修饰 的,会把内部缓存中的值,置为无效,然后从系统内存读取。
  • 有序性,是通过内存屏障来实现的。所谓的内存屏障,可以理解为,在某些指令中,插入屏障指令,用以确保,在向屏障指令后面 继续执行的时候,其前面的所有指令已经执行完毕。

扩展:在写单例模式时,我们通常会采用双层判断的方式,在最内层:

instance = new Singleton()

其实这也有一个隐含的问题:这句赋值语句,其实是分三步来操作的:

  • 为instance分配内存
  • 调用Singleto构造函数来初始化变量
  • instance指向上一步初始化的对象

在jvm做了指令重排序优化后,上述步骤b和c不能保证,可能出现,c先执行,但是对象却没初始化,这时候其他线程判断的时候,发现是非null,但是使用的时候,却没有具体实例,导致报错。所以,我们可以用valotile来修饰instance,避免该问题。

四、多线程——Synchronized

1. 问:你平时涉及到多线程编程多不多?谈谈你对Synchronized锁的理解

分析:多从实现原理,工作机制来描述

答:在多线程编程中,为了达到线程安全的目的,我们往往通过加锁的方式来实现。而Synchronized正是java提供给我们的非常重要的锁之一。它属于jvm级别加锁,底层实现是:在编译过程中,在指令级别加入一些标识来实现的。例如,同步代码块,会在同步代码块首尾加入monitorenter和monitorexit字节码指令,这两个指令都需要一个reference类型的参数,指明要加锁和解锁的对象,同步方法则是通过在修饰符上加acc_synchronized标识实现。在执行到这些指令(标识)时,本质都是获取、占有、释放monitor锁对象实现互斥,也就是说,同一时刻,只能有一个线程能成功的获取到这个锁对象。我们看一段加了synchronized关键字的代码编译后的字节码。编译前:

public class test {
  public test() {
  }
  public static void main(String[] args) {
    synchronized(new Object()){
        int i = 0;
    }
  }
}

编译后:

public class test extends java.lang.Object{
public test();
  Code:
   0:   aload_0
   1:   invokespecial   #1; //Method java/lang/Object."":()V
   4:   nop
   5:   return

public static void main(java.lang.String[]);
  Code:
   0:   new     #2; //class Object
   3:   dup
   4:   invokespecial   #1; //Method java/lang/Object."":()V
   7:   dup
   8:   astore_1
   9:   monitorenter // Enter the monitor associated with object 
   10:  iconst_0
   11:  istore_2
   12:  nop
   13:  aload_1
   14:  monitorexit // Exit the monitor associated with object 
   15:  goto    23
   18:  astore_3
   19:  aload_1
   20:  monitorexit // Be sure to exit monitor... 
   21:  aload_3
   22:  athrow
   23:  nop
   24:  return
  Exception table:
   from   to  target type
   15    18   any
   21    18   any

}

重点关注14行,和20行。

在使用Synchronized时,用到的方法是wait和notify(或notifyAll),他们的原理是,调用wait方法后,线程让出cpu资源,释放锁,进入waiting状态,进入等待队列【第一个队列】。当有其他线程调用了notify或者notifyAll唤醒时,会将等待队列里的线程对象,移入阻塞队列【第二个队列】,状态是blocked,等待锁被释放后(这个释放时机,由虚拟机来决定,人为无法干预),开始竞争锁。

Synchronized无法中断正在阻塞队列或者等待队列的线程。

扩展:Synchronized提供了以下几种类型的锁:偏向锁、轻量级锁、重量级锁。在大部分情况下,并不存在多线程竞争,更常见的是一个线程多次获取同一个锁。那么很多的消耗,其实是在锁的获取与释放上。Synchronized一直在被优化,可以说Synchronized虽然推出的较早,但是效率并不比后来推出的Lock差。

偏向锁:在jdk1.6中引入,目的是消除在无竞争情况下的同步原语(翻译成人话就是,即使加了synchronized关键字,但是在没有竞争的时候,没必要去做获取-持有-释放锁对象的操作,提高程序运行性能)。怎么做呢?当锁对象第一次被线程A获取时,虚拟机会把对象头中的标志位设置为01,也就是代表偏向模式。同时把代表这个线程A的ID,通过CAS方式,更新到锁对象头的MarkWord中。相同的线程下次再次申请锁的时候,只需要简单的比较线程ID即可。以上操作成功,则成功进入到同步代码块。如果此时有其他线程B来竞争该锁,分两种情况做不同的处理:

  • 如果线程A已执行完(并不会主动的修改锁对象的状态),会直接撤销锁对象的状态为未锁定,标志位为00;
  • 如果线程A还在持有该锁,则锁升级为轻量级锁。

轻量级锁:也是JDK1.6中引入的,轻量级,是相对于使用互斥量的重量级锁来说的。线程发生竞争锁的时候,不会直接进入阻塞状态,而是先尝试做CAS修改操作,进入自旋,这个过程避免了线程状态切换的开销,不过要消耗cpu资源。详细过程是:

  1. 线程尝试进入同步代码块,如果锁对象未被锁定,在当前线程对应的栈帧中,建立锁记录的空间,用于存储锁对象Mark Word的拷贝。
  2. 然后JVM用CAS方式尝试将锁对象的MarkWord内容替换为指向前述“锁记录”的指针。如果成功,当前线程则持有了锁,处于轻量级锁定状态;如果失败,会首先检查当前MarkWord是否已经指向当前线程栈帧的“锁记录”,如果是,就说明当前线程已经拥有了这个锁,直接重入即可。否则就表明是其他线程持有锁,那么进入自旋(其实就是重试CAS修改操作)。
  3. 释放锁时,是使用CAS来讲MarkWord和“锁记录”里的内容互换。如果成功,成功释放;如果事变,表明当前锁存在竞争(被其他线程修改了MarkWord里的数据),此时,锁会升级为重量级锁。

重量级锁:也就是我们使用的互斥量方式实现的锁,当存在多线程竞争时,只要没拿到锁,就会进入阻塞状态,主要消耗是在阻塞-唤起-阻塞-唤起的线程状态切换上。

上面介绍的三种类型的锁,是JVM来负责管理使用哪种类型锁,以及锁的升级(注意,没有降级)。

五、多线程——Lock

1. 问:你平时涉及到多线程编程多不多?谈谈你对Lock锁的理解

分析:最好对比着synchronized来讲

答:

在多线程编程中,为了达到线程安全的目的,我们往往通过加锁的方式来实现。Lock锁是java代码级别来实现的,相对于synchronizedd在功能性上,有所加强,主要是,公平锁,轮询锁,定时锁,可中断锁等,还增加了多路通知机制(Condition),可以用一个锁来管理多个同步块。另外在使用的时候,必须手动的释放锁。

详细分析:

  • Lock锁的实现,主要是借助于队列同步器(我们常常见到的AQS)来实现。它包括一个int变量来表示状态;一个FIFO队列,来存储获取资源的排队线程。
  • 当一个线程申请资源时,就是是获取当前的同步状态,并判断是否可符合预期,如果是,则通过CAS操作,来修改上述Int变量标识的同步状态。如果否,则线程进入队列排队(这是在一般情况,在使用tyrLock时,是直接返回获取锁失败)。

锁有独占锁和共享锁。独占锁就是在同一时刻,只允许同一个线程持有该锁;共享锁实现的时候和独占锁稍有不同,不是简单的修改同步状态(比如1和0),而是获取这个值,当值大于0时,即标识获取共享锁成功(隐含意思是每个线程获取锁成功后,这个值减1)。这里附上独占锁的实现源码(源码片段来自《java并发编程的艺术》,并加上自己的注释):

public class Mutex implements Lock {  
  
    // 静态内部类,自定义同步器  
    private static class Sync extends AbstractQueuedSynchronizer{  
        // 该方法用于判断当前锁是否在独占模式下被占用状态  
        protected boolean isHeldExclusively(){  
            return getState() == 1;  
        }  
  
        // 获取锁!!! 
        public boolean tryAcquire(int acquires){ 
          //典型的CAS原子操作,如果初始状态为0,可以获得锁
            if (compareAndSetState(0, 1)){  
                setExclusiveOwnerThread(Thread.currentThread());  
                return true;  
            }  
            return false;  
        }  
  
        //释放锁,将当前状态设置为0  
        protected boolean tryRelease(int releases){  
            if (getState() == 0){  
                throw new IllegalMonitorStateException();  
            }  
            setExclusiveOwnerThread(null);  
            setState(0);  
            return true;  
        }  
  
        // 返回一个Condition,每个condition都包含了一个condition队列 ,这个后续再说 
        Condition newCondition(){  
            return new ConditionObject();  
        }  
    }
  • Lock锁中,支持可中断的锁,实现原理是,队列中的等待线程,可以响应其他线程发起的中断信号,抛出InterruptdException异常。
  • 关于同步队列,需要了解,获取同步状态失败的线程,被包装为Node节点后,加入队列尾,这个操作是CAS操作,以保证线程安全,失败就死循环重试;而队列首节点,则是当前持有锁的线程。该节点一旦释放锁,会唤醒后继节点。
  • 关于唤醒,是这样的,每个在同步队列中的阻塞线程,都处于自旋的状态,不断的尝试获取锁。这样,当首节点释放锁唤醒后继线程后,被唤醒的线程,还需要判断是否前继线程是首线程,是则获取同步状态(锁)成功。

扩展:Condition,多路通知机制

  • 在Synchronized锁中,提供了wait、notify、notifyAll等方法,实现了等待/通知模式。那么在lock中,由Condition配合,也实现了类似的模式。
  • 其实现实质是,一个Condition包含一个等待队列,定义多个Condition,那就有多个等待队列,和上文提到的同步队列配合使用。同步队列-等待队列模型请参

  • 在上述模型中,调用await方法,相当于把同步队列首节点(持有锁的线程),移动到等待队列。调用signal方法唤醒阻塞的线程,则是将对应Condition等待队列里的首节点(等待时间最长),移入同步队列。
  • 还有一点需要补充,就是线程的唤醒,调用signal可以正常唤醒;在其他线程中终止线程,也一样会唤醒,只不过唤醒后,只是抛出InterruptException异常。

本文转载自:2020年如何面试大厂?阿里架构师良心分享美团、滴滴Java岗面试真题

2020年下半年系统架构设计师下午真题及答案解析.pdf 2020年下半年系统架构设计师下午真题及答案解析,全网最清晰,答案最正确的软考真题资料,小任老师出品,必属精品! 立即下载

相关推荐

1.3-----Simplify 3D切片软件:从新手困惑到高效打印的进阶设置指南

本文详细介绍了Simplify 3D切片软件在大型模型打印中的高效设置技巧,包括切片效率、支撑结构智能生成和精细参数调节等核心优势。通过实战案例和进阶参数设置指南,帮助用户从新手快速进阶到高效打印,显著提升3D打印质量和效率。

weixin_42552716的博客 422

Java架构师面试宝典(含答案)

双十一秒杀高可靠如何实现? Sentinel承接了阿里10年的促销场景,利用:流量控制(通过设置QPS来控制),容错(熔断就是切断坏路,让后续新流量再走这个坏路),降级(备选B角,走了try-cath的机制,),三板斧解决高可靠。熔断机制:通过滑动时间窗口实现的,对前一段时间的错误比例来设置熔断点。

Peter_Changyb的博客 2万+

Markdown编辑器介绍

这篇文章介绍了Markdown编辑器的功能和使用方法。主要内容包括:Markdown的基本语法如标题、列表、链接插入等;新增功能如图片拖拽、数学公式支持、甘特图和UML图表绘制;常用快捷键说明;以及文本导出导入操作。文章详细说明了如何通过Markdown语法实现文本格式化、代码高亮、表格创建等功能,并提供了多种图表绘制的语法示例,帮助用户更好地利用Markdown编辑器进行写作和内容创作。

soso1968的博客 1178

Java 架构师面试题解析(2024 年版)

分布式事务是指在分布式系统中,涉及多个节点的事务操作。由于分布式系统的复杂性,传统的单机事务处理方式已经不能满足需求,需要采用专门的分布式事务解决方案。两阶段提交(2PC)准备阶段:事务协调者向所有参与者发送准备请求,参与者执行事务操作,但不提交,然后向协调者回复是否准备成功。提交阶段:如果所有参与者都回复准备成功,协调者向所有参与者发送提交请求,参与者提交事务;否则,协调者向所有参与者发送回滚请求,参与者回滚事务。优点:实现简单,对事务的强一致性有较好的保证。

爱好技术的小老头 6357

《双剑合璧:双 IMU 驱动的高精度 AHRS 实战宝典(基于 ROS2)》

本文系统阐述了基于双IMU的高精度姿态与航向参考系统(AHRS)设计与实现方法。文章首先分析了传统单IMU系统的局限性,提出通过双IMU冗余配置实现性能互补的方案。从硬件设计要点(包括IMU选型策略、电路降噪方法、PCB布局规范),到算法实现方案(互补滤波、卡尔曼滤波等融合算法),再到ROS2软件架构与调优策略,全方位展示了双IMU系统的技术实现路径。特别强调快速性与高精度平衡的方法,包括动态参数调整、双IMU权重优化等核心技巧。最后总结了硬件降噪、算法调优等实用心法。

bother3000的博客 2024

No Target Connected 错误时的一种情况

STM32的SWD烧录模式No Target Connected 错误的一种情况 STM32的SWD烧录模式No Target Connected 错误时的一种处理情况 这是我第一次烧板子的时候遇到的问题,在给板子download的时候出现了“No Target Connected”的错误,这里讲一种解决方法。不一定适用于全部状况,但是可以作为一种纠错方法。 打开 Options for Target… 1.首先点击Options for Target…这个像魔棒一样的按键打开,会出现这个页面 2.点击

Logan_CodeGou的博客 1万+

43道Java架构师面试题以及答案解析,快测试一下你会不会?

前言 2021年通用架构师面试问题,面试中较为笼统的部分不一定只专注于您的简历。它还可能包含一些有关您从事的项目以及如何管理时间和优先级的问题。作为架构师去参加面试的时候只有自己平时的积累可能是源源不够的,我们还要去了解一些平时工作中可能不会接触到的技术相关来丰富我们自己的眼界,也需要去了解所要面试公司的架构的演进,有一个对应的了解,会对我们的职业生涯带来更多的帮助。 ## 一、架构师的日常职责是什么 ? 总体而言,架构师负责软件领域的顶层设计。 架构师需要根据公司的发展,规划企业未来若干年的架构,制定可

weixin_56667968的博客 2万+

CVAT实战:从零搭建高效数据标注流水线

本文详细介绍了如何使用CVAT搭建高效的数据标注流水线,从环境部署到团队协作,再到数据流转和质量把控,全面覆盖了数据标注的各个环节。CVAT作为一款开源的数据标注工具,支持多人协作和丰富的标注类型,特别适合遥感图像等复杂场景的标注需求。通过实战案例和技巧分享,帮助读者快速掌握CVAT的核心功能,提升标注效率。

weixin_30555125的博客 397

java架构师岗面试题——基础篇

可以推出 obj1.hashCode()==obj2.hashCode() ,但是。5. Hashtable 的 key 不能为 null,value 也不能为 null,这个可以从 Hashtable 源码中的 put 方。hash % length == hash &(length - 1) 的前提是 length 是 2 的 n 次方)。elments() 方法继承自。1. 出生的版本不一样,Hashtable 出生于 Java 发布的第一版本 JDK 1.0,HashMap 出生于 JDK。

杜引强 1833

从点击图标到Activity亮屏:AMS、Zygote、ActivityThread的Binder协作之旅

Launcher通过Context调用 startActivity(),最终会通过 Activity.startActivity() 传递到 ActivityManager.getService(),获取AMS的Binder代理对象(IActivityManager)。这里的 attach() 方法通过Binder调用AMS的 attachApplication(),将新进程的 IApplicationThread 代理对象传递给AMS。这一步的Binder通信,是整个启动流程的关键转折点,值得细细品味。

大模型大数据攻城狮的专栏 1071

【毕业设计】基于雷达与深度学习的摔倒检测——雷达数据集处理

雷达原始数据是时域非平稳信号,快速傅里叶变换(Fast Fourier Transformation, FFT)不能很好地提取微多普勒效应的模式特征。因此短时傅里叶变换(Short Time Fourier Transformation, STFT)被应用于雷达信号的时频谱分析。本文主要介绍雷达数据集的预处理过程,包括时频谱图的中值滤波与 SVD 分解。

洋洋Young的博客 1808

大厂 Java 架构师面试题全解析

在竞争激烈的 Java 开发领域,想要晋升为架构师,面临的面试挑战不容小觑。大厂的面试官往往会从多个维度深入考察候选人的技术功底、架构设计能力、问题解决思维等。以下精心整理了 30 道大厂 Java 架构师面试题,助你一臂之力。

爱好技术的小老头 3540

RK3588部署YOLO模型 包含模型量化+npu轻量化+ubuntu+RGA图像加速和多线程模型加速 包源码

本专栏为深度学习部署全栈学习体系,包含68篇由浅入深的教程,专为零基础学习者设计。内容涵盖TensorRT与RK3588平台部署技术,包含Jetson系列和RK系列硬件部署实战,采用"理论+源码+实战"三位一体的教学模式。学习路径从基础环境搭建到模型优化、容器化部署、多硬件平台适配,最终掌握工业级AI部署能力。特色包括C++基础教学、Docker容器化、INT8量化、多线程优化等核心技术,并附带YOLOv5、人脸检测、车牌识别等多个实战项目源码。适合算法工程师转部署方向、嵌入式开发者及对

FJN110的博客 3731

2021年如何面试大厂?阿里架构师良心分享美团,滴滴Java岗面试真题

题记:本文会尽量模拟面试现场对话情景, 用口语而非书面语 ,采用问答形式来展现。另外每一个问题都附上“延伸”,这部分内容是帮助小伙伴们更深的理解一些底层细节的补充,在面试中可能很少直接涉及,权当是提高自身水平的知识储备吧。 一、Java基础 1. 问:List 和 Set 都有什么区别? 分析:这种问题面试官一般想考察的都是你对这两种数据结构的了解,已经使用时候的选择依据,所以可以从数据结构和一些使用案例入手分别做个介绍 答:List,列表,元素可重复。常用的实现ArrayList和.

weixin_59330273的博客 195

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Alibaba技术官良心分享Java最强题库

最近一个读者和我反馈,他坚持刷题 2 个月,终于去了他梦寐以求的大厂,薪资涨幅非常可观,我认识不少以前履历普通的,通过刷题改变了自己进入大厂的轨迹,从而走向更高的平台,刷题确实太重要了。 而今天要给读者分享的正是Alibaba架构师甩出的号称“史上最强”的“面试文档合集”,内容强大,覆盖面广,整个互联网公司面试都曾被问到

javaAnPou的博客 157

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

觉得自己学不到东西了,为啥面试却总通不过? | 答水友问

继续回答星球水友提问:“沈老师,一直在用Java技术栈,感觉没什么进步了,可跳槽面试又屡屡受挫,Java到底要学哪些东西,有没有针对Java面试的知识点建议?”今天简单说...

shenjian58的博客 642

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

通关宝典!Java 面试核心知识让你面试过,过,过!

​​​​​​​Java 基础+Spring 原理+微服务

guanshengg的博客 465

大厂公积金缴纳比例一览表

点击关注公众号:互联网架构师,后台回复2T获取2TB学习资源!上一篇:2T架构师学习资料干货分享大家好,我是互联网架构师!都说大厂的福利好,确实,光是在公积金这块就很好的提现了出来,公积金最高缴纳比例是12%,最低是5%,别看差的不多的样子,这可是一大笔钱,还是能提取出来的钱。大厂的公积金缴纳情况,你可能听说过,不同公司的公积金政策天差地别。咱们一起来详细看看大厂公积金比例大揭秘先来看看那些我们...

emprere的博客 1125

真是恍然大悟啊!看懂这份Android面经大厂真不是问题!送大厂面经一份!

导语 你想做安卓开发,怎么系统学习?你只需要看完这一篇就够了!!为什么只看这一篇就够了?现在优快云、知乎、掘金、GitHub上各路大佬层出不穷,他们深耕Android开发多年,总结出满满的学习干货。但同时也存在很多非良心的博主,要么活出了人类的本质,复读机一样到处转载; 要么纯粹自嗨型草草说了自己的工作经历,让读者无法从良莠不齐的资源海洋中高效高质地获取真正有用的信息。本文的目的很简单,一句话:用最少的时间,最高效率,让你清楚:想要做Android开发,你需要学什么?你该在哪学? 本文的特点在于将繁琐的知

m0_56130999的博客 164

Android性能优化总结,好文推荐

导语 你想做安卓开发,怎么系统学习?你只需要看完这一篇就够了!!为什么只看这一篇就够了?现在优快云、知乎、掘金、GitHub上各路大佬层出不穷,他们深耕Android开发多年,总结出满满的学习干货。但同时也存在很多非良心的博主,要么活出了人类的本质,复读机一样到处转载; 要么纯粹自嗨型草草说了自己的工作经历,让读者无法从良莠不齐的资源海洋中高效高质地获取真正有用的信息。本文的目的很简单,一句话:用最少的时间,最高效率,让你清楚:想要做Android开发,你需要学什么?你该在哪学? 本文的特点在于将繁琐的知

jixuczy的博客 150

太可惜了!与字节offer擦肩而过,竟然是因为一道“算法题”!

前言 算法,在行业里越来越重要,一线互联网公司也非常注重算法,所以在面试时基本上都有涉及到。字节跳动是出了名的爱问算法题,几乎每一面都要问到算法。实际上,现在很多公司都会问算法,尤其是对于应届生来说,要求更高,所以想要进大厂,搞定算法是很重要的。 前段时间,我就去面了一次字节跳动,好不容易进到第四面,眼看offer就要拿到手了,可惜竟然被一道“算法题”给拦截了,与字节的offer失之交臂。今天就分享一下这道算法题,让我们好好聊一聊,怎么搞定字节跳动的面试吧! 拦截我的offer,竟是这道算法题

Java_chain的博客 332

Github 疯传!史上最强!BAT 大佬「LeetCode刷题手册」电子书开放下载了!

Java架构学习技术内容包含有:Spring,Dubbo,MyBatis, RPC, 源码分析,高并发、高性能、分布式,性能优化,微服务 高级架构开发等等。还有Java核心知识点+全套架构师学习资料和视频+一线大厂面试宝典+面试简历模板可以领取+阿里美团网易腾讯小米爱奇艺快手哔哩哔哩面试题+Spring源码合集+Java架构实战电子书+2021年最新大厂面试题。《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!记+最新讲解视频+实战项目源码》

2401_83916030的博客 866

Android推送技术解析,好文推荐

导语 你想做安卓开发,怎么系统学习?你只需要看完这一篇就够了!!为什么只看这一篇就够了?现在优快云、知乎、掘金、GitHub上各路大佬层出不穷,他们深耕Android开发多年,总结出满满的学习干货。但同时也存在很多非良心的博主,要么活出了人类的本质,复读机一样到处转载; 要么纯粹自嗨型草草说了自己的工作经历,让读者无法从良莠不齐的资源海洋中高效高质地获取真正有用的信息。本文的目的很简单,一句话:用最少的时间,最高效率,让你清楚:想要做Android开发,你需要学什么?你该在哪学? 本文的特点在于将繁琐的知

m0_56252652的博客 151

Java面试题及答案整理( 2023年 6 月最新版,持续更新)

死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。

qq13321123的博客 4万+

JAVA架构师经典面试题一

Spring MVC:Spring MVC是基于Spring框架的MVC框架,它的核心是DispatcherServlet和HandlerMapping,能够方便地进行请求分发和响应。Java垃圾回收机制的主要优点是可以自动管理内存,从而减少了开发人员的工作量,并且可以帮助避免一些常见的内存管理错误,如内存泄漏和空指针异常。RabbitMQ:RabbitMQ是一款开源的消息队列系统,支持多种协议和语言,可用于消息中间件、任务队列、事件驱动等场景。以上是我使用过的缓存和消息队列技术及其应用场景和优缺点。

lonely_baby的博客 791

阿里资深架构师整理2021年最新Java核心技术全套60道面试题

大家想不想进入一线大厂来进行自我提升、涨薪跳槽呢? 今天就给大家分享一波阿里资深架构师整理分享出的60道必备的Java核心技术面试题及答案,希望大家能够喜欢!文末还有大量面试题分享,不止这60道!! 60道必备Java核心技术面试题及答案 1、作用域 public,private,protected,以及不写时的区别 答:区别如下: 作用域 当前类 同一 package 子孙类 其他 package public √ √ √ √ protected √ √ √ × friendly √ √

weixin_50666791的博客 1035
上一篇: 手写Spring事务框架,阿里架构师一文详解Spring-SpringAOP原理
下一篇: 互联网公司的中年人都去哪了?
Java_supermanNO1
博客等级 码龄7年 1170粉丝 329原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值