java基础
文章平均质量分 63
风月歌
90后程序员!
三分天注定,七分靠打拼,爱拼才会赢!
展开
-
数据库常见问题解答
视图是一种虚拟的表,具有和物理表相同的功能。可以对视图进行增,改,查,操作,视图通常是有一个表或者多个表的行或列的子集。对视图的修改不影响基本表。它使得我们获取数据更容易,相比多表查询。内联接(Inner Join):匹配2张表中相关联的记录。左外联接(Left Outer Join):除了匹配2张表中相关联的记录外,还会匹配左表中剩余的记录,右表中未匹配到的字段用NULL表示。原创 2023-02-28 21:14:34 · 246 阅读 · 1 评论 -
2023年springboot面试题集锦
Spring Boot而且内嵌了各种servlet容器,Tomcat、Jetty等,现在不再需要打成war包部署到容器中,Spring Boot只要打成一个可执行的jar包就能独立运行,所有的依赖包都在一个jar包内。Spring Boot能根据当前类路径下的类、jar包来自动配置bean,如添加一个spring-boot-starter-web启动器就能拥有web的功能,无需其他配置。Spring Boot官方的启动器都是以spring-boot-starter-命名的,代表了一个特定的应用类型。原创 2023-02-28 21:11:25 · 738 阅读 · 0 评论 -
2023年大数据面试开胃菜
Spark1.3中引入Direct方式,用来替代掉使用Receiver接收数据,这种方式会周期性地查询Kafka,获得每个topic+partition的最新的offset,从而定义每个batch的offset的范围。这样做的好处在于,在map端进行一次reduce之后,数据量会大幅度减小,从而减小传输,保证reduce端能够更快的进行结果计算。Kafka最核心的思想是使用磁盘,而不是使用内存,可能所有人都会认为,内存的速度一定比磁盘快,我也不例外。磁盘缓存由Linux系统维护,减少了程序员的不少工作。原创 2023-02-27 18:33:20 · 375 阅读 · 0 评论 -
2023年大数据面试开胃菜
接着运行combiner(如果设置了的话),combiner的本质也是一个Reducer,其目的是对将要写入到磁盘上的文件先进行一次处理,这样,写入到磁盘的数据量就会减少。Spark 有很多种模式,最简单就是单机本地模式,还有单机伪分布式模式,复杂的则运行在集群中,目前能很好的运行在 Yarn和 Mesos 中,当然Spark 还有自带的 Standalone 模式,对于大多数情况 Standalone 模式就足够了,如果企业已经有 Yarn 或者 Mesos 环境,也是很方便部署的。原创 2023-02-27 18:32:37 · 374 阅读 · 0 评论 -
【无标题】
2.类的加载是由类加载器完成的,类加载器包括:根加载器(BootStrap)、扩展加载器(Extension)、系统加载器(System)和用户自定义类加载器(java.lang.ClassLoader的子类)。抽象类中的成员可以是private、默认、protected、public的,而接口中的成员全都是public的。答:JVM 中类的装载是由类加载器(ClassLoader) 和它的子类来实现的,Java中的类加载器是一个重要的Java 运行时系统组件,它负责在运行时查找和装入类文件中的类。原创 2023-02-26 22:11:42 · 304 阅读 · 0 评论 -
2023年java初级面试题(5道)
答:方法的重载和重写都是实现多态的方式,区别在于前者实现的是编译时的多态性,而后者实现的是运行时的多态性。补充:Java中没有传引用实在是非常的不方便,这一点在Java 8中仍然没有得到改进,正是如此在Java编写的代码中才会出现大量的Wrapper类(将需要通过方法调用修改的引用置于一个Wrapper类中,再将Wrapper对象传入方法),这样的做法只会让代码变得臃肿,尤其是让从C和C++转型为Java程序员的开发者无法容忍。对象的属性可以在被调用过程中被改变,但对象的引用是永远不会改变的。原创 2023-02-26 22:08:31 · 3366 阅读 · 3 评论 -
2023年java初级面试题10道基础试水题
如果将对象的方法视为对象向外界提供的服务,那么运行时的多态性可以解释为:当A系统访问B系统提供的服务时,B系统有多种提供服务的方式,但一切对A系统来说都是透明的(就像电动剃须刀是A系统,它的供电系统是B系统,B系统可以使用电池供电或者用交流电,甚至还有可能是太阳能,A系统只会通过B类对象调用供电的方法,但并不知道供电系统的底层实现是什么,究竟通过何种方式获得了动力)。方法重载(overload)实现的是编译时的多态性(也称为前绑定),而方法重写(override)实现的是运行时的多态性(也称为后绑定)。原创 2023-02-25 21:22:21 · 601 阅读 · 0 评论 -
2023年java面试真题
擦除是指在一定程度无视类型参数 T,直接从 T 所在的类开始向上 T 的父类去擦除,如调用泛型方法,传入类型参数 T 进入方法内部,若没在声明时做类似 public T methodName(T extends Fathert){},Java 就进行了向上类型的擦除,直接把参数 t 当做 Object 类来处理,而不是传进去的 T。即在有泛型的任何类和方法内部,它都无法知道自己的泛型参数,擦除和转型都是在边界上发生,即传进去的参在进入类或方法时被擦除掉,但传出来的时候又被转成了我们设置的 T。原创 2023-02-25 21:14:23 · 1899 阅读 · 0 评论 -
2023年java开年面试题
擦除是指在一定程度无视类型参数 T,直接从 T 所在的类开始向上 T 的父类去擦除,如调用泛型方法,传入类型参数 T 进入方法内部,若没在声明时做类似 public T methodName(T extends Fathert){},Java 就进行了向上类型的擦除,直接把参数 t 当做 Object 类来处理,而不是传进去的 T。即在有泛型的任何类和方法内部,它都无法知道自己的泛型参数,擦除和转型都是在边界上发生,即传进去的参在进入类或方法时被擦除掉,但传出来的时候又被转成了我们设置的 T。原创 2023-02-22 10:52:41 · 286 阅读 · 0 评论 -
2023年开年java面试开胃菜
Integer 是 int 的包装类,int 则是 java 的一种基本数据类型,Integer 变量必须实例化才能使用,当 new一个 Integer 时,实际是生成一个指向此对象的引用,而 int 是直接存储数据的值,Integer 默认值是null,而int 默认值是0。Parcelable:与 Serializable 实现的效果相同,也是将一个对象转换成可传输的状态,但它的实现原理是将一个完整的对象进行分解,分解后的每一部分都是 Intent 所支持的数据类型,这样实现传递对象的功能。原创 2023-02-22 10:06:17 · 397 阅读 · 0 评论 -
多线程面试题开胃菜终章(5道)
每个线程都有自己的栈内存,用于存储本地变量,方法参数和栈调用,一个线程中存储的变量对其它线程是不可见的。对象都在堆里创建,为了提升效率线程会从堆中弄一个缓存到自己的栈,如果多个线程使用该变量就可能引发问题,这时 volatile 变量就可以发挥作用了,它要求线程从主存中读取变量的值。当线程数小于最大线程池数 maximumPoolSize 时就会创建新线程来处理,而线程数大于等于最大线程池数 maximumPoolSize 时就会执行拒绝策略。三、如何创建线程安全的单例模式?四、什么是阻塞式方法?原创 2023-02-17 09:52:16 · 244 阅读 · 0 评论 -
多线程面试题开胃菜10(5道)
回答这些问题的时候,你要说明为什么把这些方法放在 Object类里是有意义的,还有不把它放在 Thread 类里的原因。一个很明显的原因是JAVA 提供的锁是对象级的而不是线程级的,每个对象都有锁,通过线程获得。简单的说,由于 wait,notify 和 notifyAll 都是锁级别的操作,所以把他们定义在 Object 类中因为锁属于对象。因此,当一个等待线程醒来时,不能认为它原来的等待状态仍然是有效的,在 notify()方法调用之后和等待线程醒来之前这段时间它可能会改变。原创 2023-02-16 11:45:00 · 76 阅读 · 0 评论 -
多线程面试题开胃菜9(5道)
所以,这样就有问题了,可能线程A在执行Hashtable的put方法添加数据,线程B则可以正常调用size()方法读取Hashtable中当前元素的个数,那读取到的值可能不是最新的,可能线程A添加了完了数据,但是没有对size++,线程B就已经读取size了,那么对于线程B来说读取到的size一定是不准确的。方法区是可供各条线程共享的运行时内存区域。我们知道的JVM内存区域有:堆和栈,这是一种泛的分法,也是按运行时区域的一种分法,堆是所有线程共享的一块区域,而栈是线程隔离的,每个线程互不共享。原创 2023-02-16 11:15:00 · 305 阅读 · 0 评论 -
多线程面试题开胃菜8(5道)
由于 Java 采用抢占式的线程调度算法,因此可能会出现某条线程常常获取到 CPU控制权的情况,为了让某些优先级比较低的线程也能获取到 CPU 控制权,可以使用 Thread.sleep(0)手动触发一次操作系统分配时间片的操作,这也是平衡 CPU 控制权的一种操作。多线程的上下文切换是指 CPU 控制权由一个已经正在运行的线程切换到另外一个就绪并等待获取 CPU 执行权的线程的过程。不可变对象保证了对象的内存可见性,对不可变对象的读取不需要进行额外的同步手段,提升了代码执行效率。原创 2023-02-15 10:15:00 · 63 阅读 · 0 评论 -
多线程面试题开胃菜7(5道)
ReadWriteLock 是一个读写锁接口,ReentrantReadWriteLock 是 ReadWriteLock 接口的一个具体实现,实现了读写的分离,读锁是共享的,写锁是独占的,读和读之间不会互斥,读和写、写和读、写和写之间才会互斥,提升了读写的性能。FutureTask 表示一个异步运算的任务,FutureTask 里面可以传入一个 Callable 的具体实现类,可以对这个异步运算的任务的结果进行等待获取、判断是否已经完成、取消任务等操作。1、尽量缩小同步的范围,增加系统吞吐量。原创 2023-02-15 07:15:00 · 300 阅读 · 0 评论 -
多线程面试题开胃菜6(5道)
假设有三个操作数:内存值 V、旧的预期值 A、要修改的值 B,当且仅当预期值 A 和内存值 V 相同时,才会将内存值修改为 B 并返回 true,否则什么都不做并返回 false。当然 CAS 一定要 volatile变量配合,这样才能保证每次拿到的变量是主内存中最新的那个值,否则旧的预期值 A 对某条线程来说,永远是一个不会变的值 A,只要某次 CAS 操作失败,永远都不可能成功。1、当用在方法内的局部变量时,局部变量属于当前线程级别的变量,其他线程访问不了,所以这时也不存在线程安全不安全的问题了。原创 2023-02-14 09:15:00 · 301 阅读 · 0 评论 -
多线程面试题开胃菜5(5道)
它是一个静态方法而且只保证当前线程放弃 CPU 占用而不能保证使其它线程一定能占用 CPU,执行yield()的线程有可能在进入到暂停状态后马上又被执行。与守护线程相对应的就是用户线程,守护线程就是守护用户线程,当用户线程全部执行完结束之后,守护线程才会跟着结束。也就是守护线程必须伴随着用户线程,如果一个应用内只存在一个守护线程,没有用户线程,守护线程自然会退出。所谓重入锁,指的是以线程为单位,当一个线程获取对象锁之后,这个线程可以再次获取本对象上的锁,而其他的线程是不可以的。一、什么是守护线程?原创 2023-02-14 08:00:00 · 162 阅读 · 0 评论 -
多线程面试题开胃菜4(5道)
无锁,即没有对资源进行锁定,即所有的线程都能访问并修改同一个资源,但同时只有一个线程能修改成功。线程池的好处我们知道不用线程池的话,每个线程都要通过 new Thread(xxRunnable).start()的方式来创建并运行一个线程,线程少的话这不会是问题,而真实环境可能会开启多个线程让系统和程序达到最佳效率,当线程数达到一定数量就会耗尽系统的 CPU 和内存资源,也会造成 GC频繁收集和停顿,因为每次创建和销毁一个线程都是要消耗系统资源的,如果为每个任务都创建线程这无疑是一个很大的性能瓶颈。原创 2023-02-13 09:45:00 · 277 阅读 · 0 评论 -
多线程面试题开胃菜3(5道)
我们知道不用线程池的话,每个线程都要通过 new Thread(xxRunnable).start()的方式来创建并运行一个线程,线程少的话这不会是问题,而真实环境可能会开启多个线程让系统和程序达到最佳效率,当线程数达到一定数量就会耗尽系统的 CPU 和内存资源,也会造成 GC频繁收集和停顿,因为每次创建和销毁一个线程都是要消耗系统资源的,如果为每个任务都创建线程这无疑是一个很大的性能瓶颈。所以,线程池中的线程复用极大节省了系统资源,当线程一段时间不再有任务处理时它也会自动销毁,而不会长驻内存。原创 2023-02-13 07:30:00 · 212 阅读 · 0 评论 -
多线程面试题开胃菜2(5道)
表示线程处于无限制等待状态,等待一个特殊的事件来重新唤醒,如通过wait()方法进行等待的线程等待一个 notify()或者 notifyAll()方法,通过 join()方法进行等待的线程等待目标线程运行结而唤醒,一旦通过相关事件唤醒线程,线程就进入了 RUNNABLE 状态继续运行。这个问题常问,sleep 方法和 wait 方法都可以用来放弃 CPU 一定的时间,不同点在于如果线程持有某个对象的监视器,sleep 方法不会放弃这个对象的监视器,wait方法会放弃这个对象的监视器。原创 2023-02-12 19:50:35 · 600 阅读 · 0 评论 -
多线程面试题开胃菜1(5道)
随着工业的进步,现在的笔记本、台式机乃至商用的应用服务器至少也都是双核的,4 核、8 核甚至 16 核的也都不少见,如果是单线程的程序,那么在双核 CPU 上就浪费了 50%, 在 4 核 CPU 上就浪费了 75%。多线程可以防止这个问题,多条线程同时运行,哪怕一条线程的代码执行读取数据阻塞,也不会影响其它任务的执行。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。原创 2023-02-12 19:47:59 · 2200 阅读 · 0 评论 -
2023年java面试题之kafka(5道)
我们可以认为⼀个group是⼀个"订阅"者,⼀个Topic中的每个partions,只会被⼀个"订阅者"中的⼀个consumer消费,不过⼀个consumer可以消费多个partitions中的消息。--kafka使⽤场景,对于⼀些常规的消息系统,kafka是个不错的选择;partitons/replication和容错,可以使kafka具有良好的扩展性和性能优势.不过到⽬前为⽌,我们应该很清楚认识到,kafka并没有提供JMS中的"事务性""消息传输担保(消息确认机制)""消息分组"等企业级特性;原创 2023-02-10 11:27:15 · 742 阅读 · 0 评论 -
2023年rabbitMq面试题汇总4(7道)
使⽤topic交换器时,可以使⽤通配符,⽐如:“*” 匹配特定位置的任意⽂本, “.” 把路由键分为了⼏部分,“#” 匹配所有规则等。特别注意:发往topic交换器的消息不能随意的设置选择键(routing_key),必须是由"."隔开的⼀系列的标识符组成。然后只⽤⼀个消费者去消费该队列。2. direct交换器:direct类型的交换器路由规则很简单,它会把消息路由到哪些BindingKey和RoutingKey完全匹配的队列中;b. Exchange:消息交换机,它指定消息按什么规则,路由到哪个队列。原创 2023-02-09 11:05:15 · 522 阅读 · 0 评论 -
2023年rabbitMq面试题汇总3(5道)
RabbitMQ确保持久性消息能从服务器重启中恢复的⽅式是,将它们写⼊磁盘上的⼀个持久化⽇志⽂件,当发布⼀条持久性消息到持久交换器上时,Rabbit会在消息提交到⽇志⽂件后才发送响应(如果消息路由到了⾮持久队列,它会⾃动从持久化⽇志中移除)。消息持久化的前提是:将交换器/队列的durable属性设置为true,表示交换器/队列是持久交换器/队列,在服务器崩溃或重启之后不需要重新创建交换器/队列(交换器/队列会⾃动创建)。1.集群可以扩展消息通信的吞吐量,但是不会备份消息,备份消息要通过镜像队列的⽅式解决。原创 2023-02-09 09:25:03 · 292 阅读 · 1 评论 -
2023年rabbitMq面试题汇总2(5道)
在消息⽣产时,MQ内部针对每条⽣产者发送的消息⽣成⼀个inner-msg-id,作为去重和幂等的依据(消息投递失败并重传),避免重复的消息进⼊队列;在消息消费时,要求消息体中必须要有⼀个bizId(对于同⼀业务全局唯⼀,如⽀付ID、订单ID、帖⼦ID等)作为去重和幂等的依据,避免同⼀条消息被重复消费。每条消息只会分发给⼀个订阅的消费者(前提是消费者能够正常处理消息并进⾏确认)。2、如果消费者接收到消息却没有确认消息,连接也未断开,则RabbitMQ认为该消费者繁忙,将不会给该消费者分发更多的消息。原创 2023-02-09 09:17:51 · 258 阅读 · 0 评论 -
2023年rabbitMq面试题汇总1(5道)
发送⽅确认模式:将信道设置成confirm模式(发送⽅确认模式),则所有在信道上发布的消息都会被派⼀个唯⼀的ID。⼀旦消息被投递到⽬的队列后,或者消息被写⼊磁盘后(可持久化的消息),信道会发送⼀个确认给⽣产者(包含消息唯⼀ID)。2. 新建⼀个topic,partition是原来的10倍,建⽴临时queue,数量是原来的10倍或20倍;4)接着临时征⽤10倍的机器来部署consumer,每⼀批consumer消费⼀个临时queue的数据;3. 写临时consumer程序,临时征⽤10倍的机器去消费数据;原创 2023-02-08 12:28:23 · 1058 阅读 · 0 评论 -
spring 面试题第五天(10道开胃菜)
横切关注点是一个关注点,此关注点是整个应用都会使用的功能,并影响整个应用,比如日志,安全和数据传输,几乎应用的每个模块都需要的功能。连接点代表一个应用程序的某个位置,在这个位置我们可以插入一个 AOP 切面,它实际上是个应用程序执行 SpringAOP 的位置。面向切面的编程,或 AOP,是一种编程技术,允许程序模块化横向切割关注点,或横切典型的责任划分,如日志和事务管理。关注点是应用中一个模块的行为,一个关注点可能会被定义成一个我们想实现的一个功能。从客户端的角度看,代理对象和目标对象是一样的。原创 2023-02-07 09:30:00 · 267 阅读 · 0 评论 -
spring面试题第四天(10道开胃菜)
这个注解表明 bean 的属性必须在配置的时候设置,通过一个 bean 定义的显式的属性值或通过自动装配,若@Required 注解的 bean 属性未被设置,容器将抛出 BeanInitializationException。相对于 XML 文件,注解型的配置依赖于通过字节码元数据装配组件,而非尖括号的声明。当有多个相同类型的 bean 却只有一个需要自动装配时,将@Qualifier 注解和@Autowire 注解结合使用以消除这种混淆,指定需要装配的确切的 bean。六.什么是基于注解的容器配置?原创 2023-02-07 07:45:00 · 252 阅读 · 0 评论 -
spring面试题第三天(10道开胃菜)
比如,以 XML 文件中的形式定义。当一个 bean 仅被用作另一个 bean 的属性时,它能被声明为一个内部 bean,为了定义 innerbean,在 Spring 的基于 XML 的配置元数据中,可以在或元素内使用元素,内部 bean 通常是匿名的,它们的 Scope 一般是 prototype。一个 SpringBean 的定义包含容器必知的所有配置元数据,包括如何创建一个bean,它的生命周期详情及它的依赖。原创 2023-02-06 09:00:00 · 356 阅读 · 0 评论 -
spring面试题专场第二天(10道开胃菜)
另外,在容器或容器内的对象上执行的那些不得不由 bean 工厂以程序化方式处理的操作,可以在 Applicationcontexts 中以声明的方式处理。Setter 方法注入:Setter 方法注入是容器通过调用无参构造器或无参 static 工厂方法实例化 bean 之后,调用该 bean 的 setter 方法,即实现了基于 setter 的依赖注入。构造器依赖注入:构造器依赖注入通过容器触发一个类的构造器来实现的,该类有一系列参数,每个参数代表一个对其他类的依赖。原创 2023-02-06 07:15:00 · 284 阅读 · 0 评论 -
spring面试专场第一天(10题开胃菜)
通过使用 JDBC 抽象和 DAO 模块,保证数据库代码的简洁,并能避免数据库资源错误关闭导致的问题,它在各种不同的数据库的错误信息之上,提供了一个统一的异常访问层。这是基本的 Spring 模块,提供 spring 框架的基础功能,BeanFactory 是任何以 spring 为基础的应用的核心。Bean 工厂是工厂模式的一个实现,提供了控制反转功能,用来把应用的配置和依赖从正真的应用代码中分离。MVC 框架:Spring 的 WEB 框架是个精心设计的框架,是 Web 框架的一个很好的替代品。原创 2023-02-05 10:45:00 · 315 阅读 · 0 评论 -
2023年redis常考的汇总
假设采用的主存分离,读写分离的数据库,如果一个线程 A 先删除缓存数据,然后将数据写入到主库当中,这个时候,主库和从库同步没有完成,线程 B 从缓存当中读取数据失败,从从库当中读取到旧数据,然后更新至缓存,这个时候,缓存当中的就是旧的数据。3、选择性读主库,添加一个缓存,用来记录必须读主库的数据,将哪个库,哪个表,哪个主键,作为缓存的 key,设置缓存失效的时间为主从库同步的时间,如果缓存当中有这个数据,直接读取主库,如果缓存当中没有这个主键,就到对应的从库中读取。缺点:体积大,恢复速度慢。原创 2023-02-05 08:15:00 · 416 阅读 · 0 评论 -
2023年关于redis,常常靠常常忘的知识点
一般的缓存系统,都是按照 key 去缓存查询,如果不存在对应的 value,就应该去后端系统查找(比如DB)。2:做二级缓存,A1 为原始缓存,A2 为拷贝缓存,A1 失效时,可以访问 A2,A1 缓存失效时间设置为短期,A2 设置为长期。1:对查询结果为空的情况也进行缓存,缓存时间设置短一点,或者该 key 对应的数据 insert 了之后清理缓存。在消费者下线的情况下,生产的消息会丢失,得使用专业的消息队列如 rabbitmq 等。3:不同的 key,设置不同的过期时间,让缓存失效的时间点尽量均匀。原创 2023-02-04 09:00:00 · 480 阅读 · 0 评论 -
2023年redis面试题开胃菜3(7道)
一次请求/响应服务器能实现处理新的请求即使旧的请求还未被响应,这样就可以将多个命令发送到服务器,而不用等待回复,最后在一个步骤中读取该答复。比如你的 web 系统中有一个用户对象,不要为这个用户的名称,姓氏,邮箱,密码设置单独的 key,而是。事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行,事务在执行的过程中,不会。如果一个命令的结果导致大量内存被使用(例如很大的集合的交集保存到一个新的键),不用多久内存限。一个客户端运行了新的命令,添加了新的数据。二、Redis 中的管道有什么用?原创 2023-02-04 08:30:00 · 616 阅读 · 0 评论 -
2023年redis面试题开胃菜2(10道)
Redis 集群没有使用一致性 hash,而是引入了哈希槽的概念,Redis 集群有 16384 个哈希槽,每个 key 通过 CRC16 校验后对 16384 取模来决定放置哪个槽,集群的每个节点负责一部分 hash 槽。Agora Games 就是一个很好的例子,用 Ruby 实现的,它的排行榜就是使用 Redis 来存储数据的,你可以在这里看到。幸运的是,随着 Redis 这些年的改进,很容易找到怎么恰当的使用 Redis 来缓存会话的文档。当维护一个不是严格要求一致性的缓存时,如果用户的。原创 2023-02-03 11:11:18 · 304 阅读 · 0 评论 -
2023年redis面试题开胃菜(10道)
Redis 的主要缺点是数据库容量受到物理内存的限制,不能用作海量数据的高性能读写,因此 Redis 适合的场景主要局限在较小数据量的高性能操作和运算上。Redis 为了达到最快的读写速度将数据都读到内存中,并通过异步的方式将数据写入磁盘。这种方式对 hash 层代码要求比较高,考虑部分包括,节点失效后的替代算法方案,数据震荡后的自动脚本恢复,实例的监控,等等。2.目前用的最多的集群方案,基本和 twemproxy 一致的效果,但它支持在节点数量改变情况下,旧节点数据可恢复到新 hash 节点。原创 2023-02-03 11:07:07 · 2821 阅读 · 0 评论 -
2023年java面试常考知识点(12题)
b. LinkedList:内部使⽤双向链表的结构实现存储,LinkedList有⼀个内部类作为存放元素的单元,⾥⾯有三个属性,⽤来存放元素本身以及前后2个单元的引⽤,另外LinkedList内部还有⼀个header属性,⽤来标识起始位置,LinkedList的第⼀个单元和最后⼀个单元都会指向header,因此形成了⼀个双向的链表结构。因为是数组,所以ArrayList在初始化的时候,有初始⼤⼩10,插⼊新元素的时候,会判断是否需要扩容,扩容的步⻓是0.5倍原容量,原创 2023-02-02 17:16:17 · 298 阅读 · 0 评论 -
2023年java高频面试知识点
f. 作⽤域spring,如果是request⽅式,a依赖b,a是单例⽅式,b是request,回怎么样。e. 分布式锁,使⽤redis的⽅式,但是redis是集群的,会有不同步的问题,官⽅⽂档是怎么解决的。f. 如果在⼀个事务中,代码业务流程很⻓,会有什么问题吗?c. 多线程:volatile、java.util.concurrent包。b. 数据库隔离级别有哪些,并说下什么是脏读、不可重复读、幻读?i. java.util.concurrent包下有哪些类?c. 线程池原理,java有哪⼏种线程池?原创 2023-02-02 17:06:30 · 223 阅读 · 0 评论 -
设计模式之工厂模式浅析
在很久以前的三层架构编程时,都是控制层调用业务层,业务层调用数据访问层时,都是是直接new对象,耦合性大大提升,代码重复量很高,对象满天飞为了避免这种情况,Spring使用工厂模式编程,写一个工厂,由工厂创建Bean,以后我们如果要对象就直接管工厂要就可以,剩下的事情不归我们管了。不知道你们面试题问到过源码没有,你知道Spring的源码吗,MyBatis的源码吗,等等等 如果你想学习很多框架的源码,或者你想自己开发自己的框架,就必须先掌握设计模式(工厂设计模式用的是非常非常广泛的)原创 2023-02-01 08:45:00 · 258 阅读 · 0 评论 -
什么是单例设计模式
如果实例化的对象长时间不被利用,系统会认为是垃圾而被回收,这将导致对象状态的丢失。1. 在单例模式中,活动的单例只有一个实例,对单例类的所有实例化得到的都是相同的一个实例。1. 不适用于变化的对象,如果同一类型的对象总是要在不同的用例场景发生变化,单例就会引起数据的错误,不能保存彼此的状态。3. 饿单例模式和懒单例模式构造方法都是私有的,因而是不能被继承的,有些单例模式可以被继承(如登记式模式)3. 静态内部方式:结合了懒汉式和饿汉式各自的优点,真正需要对象的时候才会加载,加载类是线程安全的。原创 2023-02-01 07:30:00 · 212 阅读 · 0 评论