2017JAVA面试题附答案

2017JAVA面试题附答案声明 本人能力有限 只是列出来参考 不对之处欢迎指正 JAVA 基础 JAVA 中的几种基本类型 各占用多少字节 下图单位是 bit 非字节 1B 8bitString 能被继承吗 为什么 不可以 因为 String 类有 final 修饰符 而 final 修饰的类是不能被继承的 实现细节不允许改变 平常我们定义的 Stringstr a 其实和 Stringstr n

声明,本人能力有限,只是列出来参考,不对之处欢迎指正。

本人没有什么公众号,评论里面有人冒充我,大家注意甄别

JAVA基础

JAVA中的几种基本类型,各占用多少字节?

这里写图片描述
下图单位是bit,非字节 1B=8bit
这里写图片描述




String能被继承吗?为什么?

不可以,因为String类有final修饰符,而final修饰的类是不能被继承的,实现细节不允许改变。平常我们定义的String str=”a”;其实和String str=new String(“a”)还是有差异的。

ArrayList 和 LinkedList 有什么区别。

讲讲类的实例化顺序,比如父类静态数据,构造函数,字段,子类静态数据,构造函数,字段,当 new 的时候, 他们的执行顺序。

用过哪些 Map 类,都有什么区别,HashMap 是线程安全的吗,并发下使用的 Map 是什么,他们内部原理分别是什么,比如存储方式, hashcode,扩容, 默认容量等。

有没有有顺序的 Map 实现类, 如果有, 他们是怎么保证有序的。

抽象类和接口的区别,类可以继承多个类么,接口可以继承多个接口么,类可以实现多个接口么。

继承和聚合的区别在哪。

参考:http://www.cnblogs.com/jiqing9006/p/5915023.html

讲讲你理解的 nio和 bio 的区别是啥,谈谈 reactor 模型。

反射的原理,反射创建类实例的三种方式是什么

参照:http://www.jianshu.com/p/3ea4a6b57f87?amp

http://blog.csdn.net/yongjian1092/article/details/

反射中,Class.forName 和 ClassLoader 区别。

https://my.oschina.net/gpzhang/blog/

描述动态代理的几种实现方式,分别说出相应的优缺点。

为什么 CGlib 方式可以对接口实现代理。

同上

final 的用途

写出三种单例模式实现。

如何在父类中为子类自动完成所有的 hashcode 和 equals 实现?这么做有何优劣。

请结合 OO 设计理念,谈谈访问修饰符 public、private、protected、default 在应用设计中的作用。

访问修饰符,主要标示修饰块的作用域,方便隔离防护

同一个类 同一个包 不同包的子类 不同包的非子类 

深拷贝和浅拷贝区别。

http://www.oschina.net/translate/java-copy-shallow-vs-deep-in-which-you-will-swim

数组和链表数据结构描述,各自的时间复杂度

http://blog.csdn.net/snow_wu/article/details/

error 和 exception 的区别,CheckedException,RuntimeException 的区别

http://blog.csdn.net/woshixuye/article/details/

请列出 5 个运行时异常。

同上

在自己的代码中,如果创建一个 java.lang.String 对象,这个对象是否可以被类加载器加载?为什么

说一说你对 java.lang.Object 对象中 hashCode 和 equals 方法的理解。在什么场景下需要重新实现这两个方法。

参考上边试题

在 jdk1.5 中,引入了泛型,泛型的存在是用来解决什么问题。

这样的 a.hashcode() 有什么用,与 a.equals(b)有什么关系。

通常这个值是对象头部的一部分二进制位组成的数字,具有一定的标识对象的意义存在,但绝不定于地址。

作用是:用一个数字来标识对象。比如在HashMap、HashSet等类似的集合类中,如果用某个对象本身作为Key,即要基于这个对象实现Hash的写入和查找,那么对象本身如何实现这个呢?就是基于hashcode这样一个数字来完成的,只有数字才能完成计算和对比操作。

有没有可能 2 个不相等的对象有相同的 hashcode。

Java 中的 HashSet 内部是如何工作的。

JVM 知识

什么情况下会发生栈内存溢出。

JVM 的内存结构,Eden 和 Survivor 比例。

这里写图片描述
eden 和 survior 是按8比1分配的
http://blog.csdn.net/lojze_ly/article/details/49456255




jvm 中一次完整的 GC 流程是怎样的,对象如何晋升到老年代,说说你知道的几种主要的jvm 参数。

你知道哪几种垃圾收集器,各自的优缺点,重点讲下 cms,包括原理,流程,优缺点

垃圾回收算法的实现原理。

http://www.importnew.com/13493.html

当出现了内存溢出,你怎么排错。

JVM 内存模型的相关知识了解多少,比如重排序,内存屏障,happen-before,主内存,工作内存等。

简单说说你了解的类加载器。

讲讲 JAVA 的反射机制。

你们线上应用的 JVM 参数有哪些。

g1 和 cms 区别,吞吐量优先和响应优先的垃圾收集器选择。

tomcat 如何调优,涉及哪些参数。

讲讲 Spring 加载流程。

讲讲 Spring 事务的传播属性。

Spring 如何管理事务的。

Spring 怎么配置事务(具体说出一些关键的 xml 元素)。

同上

说说你对 Spring 的理解,非单例注入的原理?它的生命周期?循环注入的原理, aop 的实现原理,说说 aop 中的几个术语,它们是怎么相互工作的。

Springmvc 中 DispatcherServlet 初始化过程。

操作系统

Linux 系统下你关注过哪些内核参数,说说你知道的。

这里写图片描述
Tcp/ip io cpu memory
net.ipv4.tcp_syncookies = 1
#启用syncookies
net.ipv4.tcp_max_syn_backlog = 8192
#SYN队列长度
net.ipv4.tcp_synack_retries=2
#SYN ACK重试次数
net.ipv4.tcp_fin_timeout = 30
#主动关闭方FIN-WAIT-2超时时间
net.ipv4.tcp_keepalive_time = 1200
#TCP发送keepalive消息的频度
net.ipv4.tcp_tw_reuse = 1
#开启TIME-WAIT重用
net.ipv4.tcp_tw_recycle = 1
#开启TIME-WAIT快速回收
net.ipv4.ip_local_port_range = 1024 65000
#向外连接的端口范围
net.ipv4.tcp_max_tw_buckets = 5000
#最大TIME-WAIT数量,超过立即清除
net.ipv4.tcp_syn_retries = 2
#SYN重试次数
echo “fs.file-max=65535” >> /etc/sysctl.conf
sysctl -p














































http://www.haiyun.me/category/system/

Linux 下 IO 模型有几种,各自的含义是什么。

epoll 和 poll 有什么区别。

select的本质是采用32个整数的32位,即3232= 1024来标识,fd值为1-1024。当fd的值超过1024限制时,就必须修改FD_SETSIZE的大小。这个时候就可以标识32max值范围的fd。
对于单进程多线程,每个线程处理多个fd的情况,select是不适合的。
1.所有的线程均是从1-32*max进行扫描,每个线程处理的均是一段fd值,这样做有点浪费
2.1024上限问题,一个处理多个用户的进程,fd值远远大于1024
所以这个时候应该采用poll,
poll传递的是数组头指针和该数组的长度,只要数组的长度不是很长,性能还是很不错的,因为poll一次在内核中申请4K(一个页的大小来存放fd),尽量控制在4K以内
epoll还是poll的一种优化,返回后不需要对所有的fd进行遍历,在内核中维持了fd的列表。select和poll是将这个内核列表维持在用户态,然后传递到内核中。但是只有在2.6的内核才支持。
epoll更适合于处理大量的fd ,且活跃fd不是很多的情况,毕竟fd较多还是一个串行的操作
https://yq.aliyun.com/articles/10525
















平时用到哪些 Linux 命令。

用一行命令查看文件的最后五行。

Tail -n 5 filename

用一行命令输出正在运行的 java 进程。

ps -ef|grep Java

介绍下你理解的操作系统中线程切换过程。

进程和线程的区别。

Linux 实现并没有区分这两个概念(进程和线程)

  1. 进程:程序的一次执行
  2. 线程:CPU的基本调度单位
    一个进程可以包含多个线程。

http://www.ruanyifeng.com/blog/2013/04/processes_and_threads.html

多线程

多线程的几种实现方式,什么是线程安全。

volatile 的原理,作用,能代替锁么。

画一个线程的生命周期状态图。

sleep 和 wait 的区别。

Lock 与 Synchronized 的区别。

synchronized 的原理是什么,解释以下名词:重排序,自旋锁,偏向锁,轻量级锁,可重入锁,公平锁,非公平锁,乐观锁,悲观锁。

用过哪些原子类,他们的原理是什么。

用过线程池吗,newCache 和 newFixed 有什么区别,他们的原理简单概括下,构造函数的各个参数的含义是什么,比如 coreSize,maxsize 等。

newSingleThreadExecutor返回以个包含单线程的Executor,将多个任务交给此Exector时,这个线程处理完一个任务后接着处理下一个任务,若该线程出现异常,将会有一个新的线程来替代。

newFixedThreadPool返回一个包含指定数目线程的线程池,如果任务数量多于线程数目,那么没有没有执行的任务必须等待,直到有任务完成为止。

线程池的关闭方式有几种,各自的区别是什么。

假如有一个第三方接口,有很多个线程去调用获取数据,现在规定每秒钟最多有 10 个线程同时调用它,如何做到。

Java线程池架构(二)多线程调度器

spring 的 controller 是单例还是多例,怎么保证并发的安全。

用三个线程按顺序循环打印 abc 三个字母,比如 abcabcabc。

ThreadLocal 用过么,用途是什么,原理是什么,用的时候要注意什么。

如果让你实现一个并发安全的链表,你会怎么做。

有哪些无锁数据结构,他们实现的原理是什么。

讲讲 java 同步机制的 wait 和 notify。

多线程如果线程挂住了怎么办。

countdowlatch 和 cyclicbarrier 的内部原理和用法,以及相互之间的差别。

使用 synchronized 修饰静态方法和非静态方法有什么区别。

简述 ConcurrentLinkedQueue LinkedBlockingQueue 的用处和不同之处。

  1. 互斥条件:一个资源每次只能被一个线程使用。
  2. 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
  3. 不剥夺条件:进程已获得的资源,在未使用完之前,不能强行剥夺。
  4. 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。
    只要破坏死锁 4 个必要条件之一中的任何一个,死锁问题就能被解决。
    https://www.ibm.com/developerworks/cn/java/j-lo-deadlock/




非常多个线程(可能是不同机器),相互之间需要等待协调,才能完成某种工作,问怎么设计这种协调方案。

此问题的本质是保持顺序执行。可以使用executors

#TCP 与 HTTP

http1.0 和 http1.1 有什么区别。

TCP 三次握手和四次挥手的流程,为什么断开连接要 4 次,如果握手只有两次,会出现什么。

  • 第一次握手(SYN=1, seq=x):

    客户端发送一个 TCP 的 SYN 标志位置1的包,指明客户端打算连接的服务器的端口,以及初始序号 X,保存在包头的序列号(Sequence Number)字段里。

    发送完毕后,客户端进入 SYN_SEND 状态。

  • 第二次握手(SYN=1, ACK=1, seq=y, ACKnum=x+1):
  • 第三次握手(ACK=1,ACKnum=y+1)

    客户端再次发送确认包(ACK),SYN 标志位为0,ACK 标志位为1,并且把服务器发来 ACK 的序号字段+1,放在确定字段中发送给对方,并且在数据段放写ISN的+1

发送完毕后,客户端进入 ESTABLISHED 状态,当服务器端接收到这个包时,也进入 ESTABLISHED 状态,TCP 握手结束。

第一次挥手(FIN=1,seq=x)

假设客户端想要关闭连接,客户端发送一个 FIN 标志位置为1的包,表示自己已经没有数据可以发送了,但是仍然可以接受数据。

发送完毕后,客户端进入 FIN_WAIT_1 状态。

第二次挥手(ACK=1,ACKnum=x+1)

服务器端确认客户端的 FIN 包,发送一个确认包,表明自己接受到了客户端关闭连接的请求,但还没有准备好关闭连接。

发送完毕后,服务器端进入 CLOSE_WAIT 状态,客户端接收到这个确认包之后,进入 FIN_WAIT_2 状态,等待服务器端关闭连接。

第三次挥手(FIN=1,seq=y)

服务器端准备好关闭连接时,向客户端发送结束连接请求,FIN 置为1。

发送完毕后,服务器端进入 LAST_ACK 状态,等待来自客户端的最后一个ACK。

第四次挥手(ACK=1,ACKnum=y+1)

客户端接收到来自服务器端的关闭请求,发送一个确认包,并进入 TIME_WAIT状态,等待可能出现的要求重传的 ACK 包。

服务器端接收到这个确认包之后,关闭连接,进入 CLOSED 状态。

TIME_WAIT 和 CLOSE_WAIT 的区别。

说说你知道的几种 HTTP 响应码,比如 200, 302, 404。

当你用浏览器打开一个链接的时候,计算机做了哪些工作步骤。

Dns解析–>端口分析–>tcp请求–>服务器处理请求–>服务器响应–>浏览器解析—>链接关闭

TCP/IP 如何保证可靠性,说说 TCP 头的结构。

https://zh.bywiki.com/zh-hans/传输控制协议

如何避免浏览器缓存。

简述 Http 请求 get 和 post 的区别以及数据包格式。

这里写图片描述

这里写图片描述
http://www.w3school.com.cn/tags/html_ref_httpmethods.asp
http://www.360doc.com/content/12/0612/14/8093902_217673378.shtml




简述 HTTP 请求的报文格式。

参考上面

HTTPS 的加密方式是什么,讲讲整个加密解密流程。

常见的缓存策略有哪些,你们项目中用到了什么缓存系统,如何设计的。

用 java 自己实现一个 LRU。

分布式集群下如何做到唯一序列号。

设计一个秒杀系统,30 分钟没付款就自动关闭交易。

如何使用 redis 和 zookeeper 实现分布式锁?有什么区别优缺点,分别适用什么场景。

首先分布式锁实现常见的有数据库锁(表记录),缓存锁,基于zk(临时有序节点可以实现的)的三种

锁无法释放?使用Zookeeper可以有效的解决锁无法释放的问题,因为在创建锁的时候,客户端会在ZK中创建一个临时节点,一旦客户端获取到锁之后突然挂掉(Session连接断开),那么这个临时节点就会自动删除掉。其他客户端就可以再次获得锁。

非阻塞锁?使用Zookeeper可以实现阻塞的锁,客户端可以通过在ZK中创建顺序节点,并且在节点上绑定监听器,一旦节点有变化,Zookeeper会通知客户端,客户端可以检查自己创建的节点是不是当前所有节点中序号最小的,如果是,那么自己就获取到锁,便可以执行业务逻辑了。

不可重入?使用Zookeeper也可以有效的解决不可重入的问题,客户端在创建节点的时候,把当前客户端的主机信息和线程信息直接写入到节点中,下次想要获取锁的时候和当前最小的节点中的数据比对一下就可以了。如果和自己的信息一样,那么自己直接获取到锁,如果不一样就再创建一个临时的顺序节点,参与排队。

单点问题?使用Zookeeper可以有效的解决单点问题,ZK是集群部署的,只要集群中有半数以上的机器存活,就可以对外提供服务。

分布式锁的几种实现方式~

如果有人恶意创建非法连接,怎么解决。

可以使用filter过滤处理

分布式事务的原理,优缺点,如何使用分布式事务。

什么是一致性 hash。

什么是 restful,讲讲你理解的 restful。

如何设计建立和保持 100w 的长连接。

服务器内核调优(tcp,文件数),客户端调优,框架选择(netty)

如何防止缓存雪崩。

http://www.cnblogs.com/jinjiangongzuoshi/archive/2016/03/03/5240280.html

解释什么是 MESI 协议(缓存一致性)。

MESI是四种缓存段状态的首字母缩写,任何多核系统中的缓存段都处于这四种状态之一。我将以相反的顺序逐个讲解,因为这个顺序更合理:

说说你知道的几种 HASH 算法,简单的也可以。

什么是 paxos 算法。

Paxos算法是莱斯利·兰伯特(Leslie Lamport,就是 LaTeX 中的”La”,此人现在在微软研究院)于1990年提出的一种基于消息传递的一致性算法。

整个ZAB协议主要包括消息广播和崩溃恢复两个过程,进一步可以分为三个阶段,分别是:

线上系统突然变得异常缓慢,你如何查找问题。

逐级排查(网络,磁盘,内存,cpu),数据库,日志,中间件等也可通过监控工具排查。

说说你平时用到的设计模式。

Dubbo 的原理,数据怎么流转的,怎么实现集群,负载均衡,服务注册和发现。重试转发,快速失败的策略是怎样的。

Dubbo[]是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。

https://my.oschina.net/u//blog/

一次 RPC 请求的流程是什么。

异步模式的用途和意义。

编程中自己都怎么考虑一些设计原则的,比如开闭原则,以及在工作中的应用。

设计一个社交网站中的“私信”功能,要求高并发、可扩展等等。 画一下架构图。

聊了下曾经参与设计的服务器架构。

应用服务器怎么监控性能,各种方式的区别。

如何设计一套高并发支付方案,架构如何设计。

如何实现负载均衡,有哪些算法可以实现。

Zookeeper 的用途,选举的原理是什么。

Mybatis 的底层实现原理。

请思考一个方案,设计一个可以控制缓存总体大小的自动适应的本地缓存。

请思考一个方案,实现分布式环境下的 countDownLatch。

后台系统怎么防止请求重复提交。

描述一个服务从发布到被消费的详细过程。

讲讲你理解的服务治理。

如何做到接口的幂等性。

#算法

10 亿个数字里里面找最小的 10 个。

有 1 亿个数字,其中有 2 个是重复的,快速找到它,时间和空间要最优。

2 亿个随机生成的无序整数,找出中间大小的值。

给一个不知道长度的(可能很大)输入字符串,设计一种方案,将重复的字符排重。

遍历二叉树。

有 3n+1 个数字,其中 3n 个中是重复的,只有 1 个是不重复的,怎么找出来。

写一个字符串反转函数。

常用的排序算法,快排,归并、冒泡。 快排的最优时间复杂度,最差复杂度。冒泡排序的优化方案。

二分查找的时间复杂度,优势。

一个已经构建好的 TreeSet,怎么完成倒排序。

什么是 B+树,B-树,列出实际的使用场景。

数据库知识

·提交读(Read Committed):只能读取到已经提交的数据。Oracle等多数数据库默认都是该级别 (不重复读)

·可重复读(Repeated Read):可重复读。在同一个事务内的查询都是事务开始时刻一致的,InnoDB默认级别。在SQL标准中,该隔离级别消除了不可重复读,但是还存在幻象读

·串行读(Serializable):完全串行化的读,每次读都需要获得表级共享锁,读写相互都会阻塞

MYSQL默认是RepeatedRead级别

MYSQL 有哪些存储引擎,各自优缺点。

高并发下,如何做到安全的修改同一行数据。

乐观锁和悲观锁是什么,INNODB 的行级锁有哪 2 种,解释其含义。

SQL 优化的一般步骤是什么,怎么看执行计划,如何理解其中各个字段的含义。

数据库会死锁吗,举一个死锁的例子,mysql 怎么解决死锁。

产生死锁的原因主要是:

如果系统资源充足,进程的资源请求都能够得到满足,死锁出现的可能性就很低,否则就会因争夺有限的资源而陷入死锁。其次,进程运行推进顺序与速度不同,也可能产生死锁。

产生死锁的四个必要条件:

MYsql 的索引原理,索引的类型有哪些,如何创建合理的索引,索引如何优化。

数据库中 BTREE 和 B+tree 区别。

ACID 是什么。

如何写 sql 能够有效的使用到复合索引。

由于复合索引的组合索引,类似多个木板拼接在一起,如果中间断了就无法用了,所以要能用到复合索引,首先开头(第一列)要用上,比如index(a,b) 这种,我们可以select table tname where a=XX 用到第一列索引 如果想用第二列 可以 and b=XX 或者and b like‘TTT%’

mysql 中 in 和 exists 区别。

mysql中的in语句是把外表和内表作hash 连接,而exists语句是对外表作loop循环,每次loop循环再对内表进行查询。一直大家都认为exists比in语句的效率要高,这种说法其实是不准确的。这个是要区分环境的。

2.IN当遇到包含NULL的情况,那么就会返回UNKNOWN。

数据库自增主键可能的问题。

MQ 系统的数据如何保证不丢失。

基本都是对数据进行持久化,多盘存储

rabbitmq 如何实现集群高可用。

集群是保证服务可靠性的一种方式,同时可以通过水平扩展以提升消息吞吐能力。RabbitMQ是用分布式程序设计语言erlang开发的,所以天生就支持集群。接下来,将介绍RabbitMQ分布式消息处理方式、集群模式、节点类型,并动手搭建一个高可用集群环境,最后通过java程序来验证集群的高可用性。

1. 三种分布式消息处理方式

RabbitMQ分布式的消息处理方式有以下三种:

1、Clustering:不支持跨网段,各节点需运行同版本的Erlang和RabbitMQ, 应用于同网段局域网。

2、Federation:允许单台服务器上的Exchange或Queue接收发布到另一台服务器上Exchange或Queue的消息, 应用于广域网,。

3、Shovel:与Federation类似,但工作在更低层次。

#Redis,Memcached

redis 的 list 结构相关的操作。

Redis 的数据结构都有哪些。

redis2 和 redis3 的区别,redis3 内部通讯机制。

当缓存使用 持久化使用

Memcache 的原理,哪些数据适合放在缓存中。

redis 和 memcached 的内存管理的区别。

Redis 的并发竞争问题如何解决,了解 Redis 事务的 CAS 操作吗。

Redis为单进程单线程模式,采用队列模式将并发访问变为串行访问。Redis本身没有锁的概念,Redis对于多个客户端连接并不存在竞争,但是在Jedis客户端对Redis进行并发访问时会发生连接超时、数据转换错误、阻塞、客户端关闭连接等问题,这些问题均是由于客户端连接混乱造成。对此有2种解决方法:

1.客户端角度,为保证每个客户端间正常有序与Redis进行通信,对连接进行池化,同时对客户端读写Redis操作采用内部锁synchronized。

2.服务器角度,利用setnx实现锁。

MULTI,EXEC,DISCARD,WATCH 四个命令是 Redis 事务的四个基础命令。其中:

如果在计时器超时前,节点收到多数节点的同意投票,就转换成Leader。同时向所有其他节点发送AppendEntries,告知自己成为了Leader。

每个节点在一个term内只能投一票,采取先到先得的策略,Candidate前面说到已经投给了自己,Follower会投给第一个收到RequestVote的节点。每个Follower有一个计时器,在计时器超时时仍然没有接受到来自Leader的心跳RPC, 则自己转换为Candidate, 开始请求投票,就是上面的的竞选Leader步骤。

如果多个Candidate发起投票,每个Candidate都没拿到多数的投票(Split Vote),那么就会等到计时器超时后重新成为Candidate,重复前面竞选Leader步骤。

Raft协议的定时器采取随机超时时间,这是选举Leader的关键。每个节点定时器的超时时间随机设置,随机选取配置时间的1倍到2倍之间。由于随机配置,所以各个Follower同时转成Candidate的时间一般不一样,在同一个term内,先转为Candidate的节点会先发起投票,从而获得多数票。多个节点同时转换为Candidate的可能性很小。即使几个Candidate同时发起投票,在该term内有几个节点获得一样高的票数,只是这个term无法选出Leader。由于各个节点定时器的超时时间随机生成,那么最先进入下一个term的节点,将更有机会成为Leader。连续多次发生在一个term内节点获得一样高票数在理论上几率很小,实际上可以认为完全不可能发生。一般1-2个term类,Leader就会被选出来。

Sentinel的选举流程

Sentinel集群正常运行的时候每个节点epoch相同,当需要故障转移的时候会在集群中选出Leader执行故障转移操作。Sentinel采用了Raft协议实现了Sentinel间选举Leader的算法,不过也不完全跟论文描述的步骤一致。Sentinel集群运行过程中故障转移完成,所有Sentinel又会恢复平等。Leader仅仅是故障转移操作出现的角色。

选举流程

redis 的持久化的机制,aof 和 rdb 的区别。

redis 的集群怎么同步的数据的。

redis replication redis-migrate-tool等方式

#搜索

elasticsearch 了解多少,说说你们公司 es 的集群架构,索引数据大小,分片有多少,以及一些调优手段。elasticsearch 的倒排索引是什么。

ElasticSearch(简称ES)是一个分布式、Restful的搜索及分析服务器,设计用于分布式计算;能够达到实时搜索,稳定,可靠,快速。和Apache Solr一样,它也是基于Lucence的索引服务器,而ElasticSearch对比Solr的优点在于:

轻量级:安装启动方便,下载文件之后一条命令就可以启动。 Schema free:可以向服务器提交任意结构的JSON对象,Solr中使用schema.xml指定了索引结构。 多索引文件支持:使用不同的index参数就能创建另一个索引文件,Solr中需要另行配置。 分布式:Solr Cloud的配置比较复杂。 

lucence 内部结构是什么

最后

作者:ricky

交流群:

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/204995.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 下午7:03
下一篇 2026年3月19日 下午7:03


相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号