精选8道ES高频面试题和答案,后悔没早点看。
不要再干巴巴的背诵八股文了,一定要结合具体场景回答面试问题!
前言
我们在回答面试题的时候,不能干巴巴的去背八股文,一定要结合应用场景,最好能结合过去做过的项目,去和面试官沟通。
这些场景题虽然不要求我们手撕代码,但是解决思路和关键方法还是要烂熟于心的。
这篇文章不仅给出了常见的面试题和答案,并且给出了这些知识点的应用场景、也给出了解决这些问题的思路,并且结合这些思路提供了关键代码。这些代码段都是可以直接CV到本地运行起来的,并且都写清楚了注释,欢迎大家动起手来操练起来,不要死记硬背八股文。
1.模糊搜索
如何在Elasticsearch中执行模糊搜索(Fuzzy Search)?
解答:
在Elasticsearch中,可以使用模糊搜索(Fuzzy Search)来查找与给定术语相似的文档。模糊搜索是一种基于编辑距离的近似匹配方法,可以处理拼写错误或相似词的情况。
在一个电商平台的商业项目中,可以使用模糊搜索来改善商品搜索功能。例如,当用户输入一个关键词时,可以使用模糊搜索来查找与该关键词相似的商品,以提供更全面的搜索结果。
代码示例:
下面是一个简单的代码示例,演示如何在Elasticsearch中执行模糊搜索:
package main
import (
"bytes"
"context"
"encoding/json"
"fmt"
"github.com/elastic/go-elasticsearch/v8"
"github.com/elastic/go-elasticsearch/v8/esapi"
"log"
)
func main() {
// 创建Elasticsearch客户端
cfg := elasticsearch.Config{
Addresses: []string{"http://localhost:9200"},
}
client, err := elasticsearch.NewClient(cfg)
if err != nil {
log.Fatalf("Error creating the client: %s", err)
}
// 构建模糊搜索请求
var (
buf bytes.Buffer
res *esapi.Response
search = map[string]interface{}{
"query": map[string]interface{}{
"fuzzy": map[string]interface{}{
"title": map[string]interface{}{
"value": "iphone",
"fuzziness": "AUTO",
},
},
},
}
)
// 将搜索请求转换为JSON格式
err = json.NewEncoder(&buf).Encode(search)
if err != nil {
log.Fatalf("Error encoding the search query: %s", err)
}
// 发送模糊搜索请求
res, err = client.Search(
client.Search.WithContext(context.Background()),
client.Search.WithIndex("products"),
client.Search.WithBody(&buf),
client.Search.WithTrackTotalHits(true),
client.Search.WithPretty(),
)
if err != nil {
log.Fatalf("Error sending the search request: %s", err)
}
defer res.Body.Close()
// 解析搜索结果
var result map[string]interface{}
if err := json.NewDecoder(res.Body).Decode(&result); err != nil {
log.Fatalf("Error parsing the search response: %s", err)
}
// 处理搜索结果
// ...
fmt.Println(result)
}
通过上述代码示例,我们可以看到如何使用Elasticsearch客户端构建模糊搜索请求,并处理返回的搜索结果。
这个例子展示了如何在商业项目中使用模糊搜索来改善商品搜索功能,提供更全面的搜索体验。
2.倒排索引
什么是倒排索引?它在Elasticsearch中的作用是什么?
解答:
倒排索引是一种数据结构,用于加速文本搜索。它将每个文档中的每个词映射到包含该词的文档列表中。
在商业项目中,例如新闻发布平台,Elasticsearch的倒排索引可以将每个关键词映射到包含该关键词的新闻文章列表中,以实现快速的关键词搜索。
举个栗子:
以下是一个基于Go语言的简单倒排索引示例代码:
package main
import (
"fmt"
"strings"
)
type InvertedIndex map[string][]int
func BuildInvertedIndex(docs []string) InvertedIndex {
index := make(InvertedIndex)
for docID, doc := range docs {
words := strings.Fields(doc)
for _, word := range words {
word = strings.ToLower(word)
if _, ok := index[word]; !ok {
index[word] = []int{}
}
index[word] = append(index[word], docID)
}
}
return index
}
func main() {
docs := []string{
"Hello world",
"Hello Go",
"Go programming language",
"World of Go",
}
index := BuildInvertedIndex(docs)
// 搜索示例
query := "Go"
query = strings.ToLower(query)
if postings, ok := index[query]; ok {
fmt.Printf("Documents containing '%s':\n", query)
for _, docID := range postings {
fmt.Println(docs[docID])
}
} else {
fmt.Printf("No documents containing '%s' found.\n", query)
}
}
在上述代码中,我们定义了一个InvertedIndex
类型,它是一个映射,将每个单词映射到包含该单词的文档ID列表。
BuildInvertedIndex
函数用于构建倒排索引,它遍历每个文档,将文档中的单词添加到倒排索引中。最后,我们可以使用倒排索引进行搜索,找到包含特定单词的文档。
3.聚合操作
如何在Elasticsearch中执行复杂的聚合操作?
解答:
在Elasticsearch中,可以使用聚合操作对数据进行统计和分析。
例如,在一个社交媒体平台的商业项目中,可以使用Elasticsearch的聚合功能来进行用户行为分析。通过聚合操作,可以计算用户的活跃度、点赞和评论数量、用户关注的话题等。这些统计数据可以帮助平台了解用户行为模式,优化推荐算法和个性化内容展示。
代码示例:
以下是一个基于Go语言的复杂聚合操作示例代码,用于在社交媒体平台的商业项目中进行用户行为分析:
package main
import (
"bytes"
"context"
"encoding/json"
"fmt"
"github.com/elastic/go-elasticsearch/v8"
"github.com/elastic/go-elasticsearch/v8/esapi"
"log"
)
type UserStats struct {
Username string `json:"username"`
TotalLikes int `json:"total_likes"`
TotalComments int `json:"total_comments"`
TotalFollowers int `json:"total_followers"`
}
func main() {
// 创建Elasticsearch客户端
cfg := elasticsearch.Config{
Addresses: []string{"http://localhost:9200"},
}
client, err := elasticsearch.NewClient(cfg)
if err != nil {
log.Fatalf("Error creating the client: %s", err)
}
// 构建聚合操作请求
var (
buf bytes.Buffer
res *esapi.Response
search = map[string]interface{}{
"size": 0,
"aggs": map[string]interface{}{
"user_stats": map[string]interface{}{
"terms": map[string]interface{}{
"field": "username.keyword",
"size": 10,
},
"aggs": map[string]interface{}{
"total_likes": map[string]interface{}{
"sum": map[string]interface{}{
"field": "likes",
},
},
"total_comments": map[string]interface{}{
"sum": map[string]interface{}{
"field": "comments",
},
},
"total_followers": map[string]interface{}{
"sum": map[string]interface{}{
"field": "followers",
},
},
},
},
},
}
)
// 将聚合操作请求转换为JSON格式
if err := json.NewEncoder(&buf).Encode(search); err != nil {
log.Fatalf("Error encoding the search query: %s", err)
}
// 发送聚合操作请求
res, err = client.Search(
client.Search.WithContext(context.Background()),
client.Search.WithIndex("social_media"),
client.Search.WithBody(&buf), client.Search.WithTrackTotalHits(true), client.Search.WithPretty())
if err != nil {
log.Fatalf("Error sending the search request: %s", err)
}
defer res.Body.Close()
// 解析聚合操作的响应
var result map[string]interface{}
if err := json.NewDecoder(res.Body).Decode(&result); err != nil {
log.Fatalf("Error parsing the search response: %s", err)
}
// 处理聚合操作的结果
aggregations := result["aggregations"].(map[string]interface{})
userStatsBucket := aggregations["user_stats"].(map[string]interface{})["buckets"].([]interface{})
userStats := make([]UserStats, len(userStatsBucket))
for i, bucket := range userStatsBucket {
b := bucket.(map[string]interface{})
userStats[i] = UserStats{
Username: b["key"].(string),
TotalLikes: int(b["total_likes"].(map[string]interface{})["value"].(float64)),
TotalComments: int(b["total_comments"].(map[string]interface{})["value"].(float64)),
TotalFollowers: int(b["total_followers"].(map[string]interface{})["value"].(float64)),
}
}
// 打印用户行为统计结果
for _, stats := range userStats {
fmt.Printf("Username: %s\n", stats.Username)
fmt.Printf("Total Likes: %d\n", stats.TotalLikes)
fmt.Printf("Total Comments: %d\n", stats.TotalComments)
fmt.Printf("Total Followers: %d\n", stats.TotalFollowers)
fmt.Println("-----------------------")
}
}
在上述代码中,我们使用Elasticsearch的聚合操作来计算用户的活跃度、点赞和评论数量以及关注者数量。通过构建聚合操作请求,并解析返回的聚合结果,我们可以获取用户行为的统计数据。
4.数据冗余和高可用
如何处理Elasticsearch中的数据冗余和高可用性?
解答:
在商业项目中,例如在线电商平台,可以使用Elasticsearch的数据冗余和高可用性机制来确保订单数据的安全和可靠。
通过配置适当数量的副本,可以实现数据的冗余存储和高可用性。当主分片不可用时,副本可以接管服务,确保订单数据的持续访问和处理。
代码示例:
package main
import (
"context"
"fmt"
"log"
"github.com/elastic/go-elasticsearch/v8"
"github.com/elastic/go-elasticsearch/v8/esapi"
)
func main() {
// 创建Elasticsearch客户端
cfg := elasticsearch.Config{
Addresses: []string{"http://localhost:9200"},
}
client, err := elasticsearch.NewClient(cfg)
if err != nil {
log.Fatalf("Error creating the client: %s", err)
}
// 设置索引的副本数
req := esapi.IndicesPutSettingsRequest{
Index: []string{"orders_index"},
Body: map[string]interface{}{
"settings": map[string]interface{}{
"index": map[string]interface{}{
"number_of_replicas": 2,
},
},
},
}
// 发送设置副本数的请求
res, err := req.Do(context.Background(), client)
if err != nil {
log.Fatalf("Error setting the number of replicas: %s", err)
}
defer res.Body.Close()
// 检查响应状态
if res.IsError() {
log.Fatalf("Error setting the number of replicas: %s", res.Status())
}
// 打印设置副本数成功的消息
fmt.Println("Number of replicas set successfully for orders_index")
}
在上述代码中,我们使用Elasticsearch的Indices Put Settings API来设置索引的副本数。在示例中,我们将订单数据的索引名称设置为orders_index,并将副本数设置为2。这样,Elasticsearch将为该索引创建两个副本,实现数据的冗余存储和高可用性。
5. 性能优化
如何优化Elasticsearch的性能?
解答:
- 硬件优化:配置适当的硬件资源,如增加内存、优化磁盘I/O性能等,以提高Elasticsearch的整体性能。
- 分片和副本优化:根据数据量和查询负载的需求,调整分片和副本的数量和分布,以平衡数据分布和查询负载。
- 索引和映射优化:设计合理的索引和映射,选择合适的字段类型、分析器和分词器,以提高搜索和聚合的性能。
- 查询和过滤器优化:使用合适的查询和过滤器,避免全文搜索和聚合操作的过度使用,以提高查询性能。
- 缓存和预热优化:使用缓存机制,如Elasticsearch的请求缓存或外部缓存,缓存频繁查询的结果,以减少重复计算的开销。预热机制可以在系统启动时加载常用数据,提前准备好热门查询的结果。
- 索引生命周期管理:根据数据的使用情况,定期删除过期的数据和索引,以减少存储和查询负载。
- 监控和调优:使用Elasticsearch的监控工具和指标,监控集群的健康状态、节点的负载、响应时间和资源利用率等
举个例子:
package main
import (
"context"
"fmt"
"log"
"time"
"github.com/elastic/go-elasticsearch/v8"
"github.com/elastic/go-elasticsearch/v8/esapi"
)
func main() {
// 创建Elasticsearch客户端
cfg := elasticsearch.Config{
Addresses: []string{"http://localhost:9200"},
}
client, err := elasticsearch.NewClient(cfg)
if err != nil {
log.Fatalf("Error creating the client: %s", err)
}
// 配置索引的刷新间隔
req := esapi.IndicesPutSettingsRequest{
Index: []string{"my_index"},
Body: map[string]interface{}{
"index": map[string]interface{}{
"refresh_interval": "30s",
},
},
}
// 发送设置刷新间隔的请求
res, err := req.Do(context.Background(), client)
if err != nil {
log.Fatalf("Error setting the refresh interval: %s", err)
}
defer res.Body.Close()
// 检查响应状态
if res.IsError() {
log.Fatalf("Error setting the refresh interval: %s", res.Status())
}
// 打印设置刷新间隔成功的消息
fmt.Println("Refresh interval set successfully for my_index")
// 等待一段时间,以便索引刷新
time.Sleep(5 * time.Second)
// 构建搜索请求
reqSearch := esapi.SearchRequest{
Index: []string{"my_index"},
Body: map[string]interface{}{
"query": map[string]interface{}{
"match": map[string]interface{}{
"title": "example",
},
},
},
}
// 发送搜索请求
resSearch, err := reqSearch.Do(context.Background(), client)
if err != nil {
log.Fatalf("Error sending the search request: %s", err)
}
defer resSearch.Body.Close()
// 解析搜索结果
// ...
fmt.Println("Search request completed successfully")
}
在上述代码中,我们使用Elasticsearch的Indices Put Settings API来设置索引的刷新间隔,通过设置较长的刷新间隔(例如30秒),可以减少刷新操作的频率,从而提高性能。然后,我们发送一个搜索请求来验证性能优化的效果。
6.数据一致性
如何处理Elasticsearch中的数据一致性?
解答:
在商业项目中,例如在线支付平台,数据一致性是至关重要的。为了处理Elasticsearch中的数据一致性,可以采取以下方法:
- 使用事务机制:在进行涉及多个文档的操作时,使用事务机制来确保数据的一致性。例如,在一个在线支付平台的商业项目中,当用户发起支付请求时,可以使用事务来同时更新订单状态和用户账户余额,以保证数据的一致性。
- 使用乐观并发控制:在并发写入场景下,使用乐观并发控制机制来处理数据一致性。例如,在一个社交媒体平台的商业项目中,当多个用户同时对同一篇文章进行点赞操作时,可以使用乐观并发控制来确保点赞数的一致性。
- 使用版本控制:在更新文档时,使用版本控制机制来处理并发写入冲突。例如,在一个博客平台的商业项目中,当多个用户同时对同一篇文章进行编辑时,可以使用版本控制来处理并发写入冲突,保证数据的一致性。
- 使用分布式锁:在分布式环境下,使用分布式锁机制来处理并发写入冲突。例如,在一个在线预订平台的商业项目中,当多个用户同时对同一份资源进行预订时,可以使用分布式锁来保证预订的一致性。
举个例子:
以下是一个明确的代码示例,展示如何使用Go语言和Elasticsearch的API来处理数据一致性:
package main
import (
"context"
"fmt"
"log"
"time"
"github.com/elastic/go-elasticsearch/v8"
"github.com/elastic/go-elasticsearch/v8/esapi"
)
func main() {
// 创建Elasticsearch客户端
cfg := elasticsearch.Config{
Addresses: []string{"http://localhost:9200"},
}
client, err := elasticsearch.NewClient(cfg)
if err != nil {
log.Fatalf("Error creating the client: %s", err)
}
// 定义事务操作
transaction := func() error {
// 开始事务
reqBegin := esapi.XPackSecurityAuthenticateRequest{}
resBegin, err := reqBegin.Do(context.Background(), client)
if err != nil {
return fmt.Errorf("Error beginning the transaction: %s", err)
}
defer resBegin.Body.Close()
// 执行事务操作
// ...
// 提交事务
reqCommit := esapi.XPackSecurityInvalidateTokenRequest{}
resCommit, err := reqCommit.Do(context.Background(), client)
if err != nil {
return fmt.Errorf("Error committing the transaction: %s", err)
}
defer resCommit.Body.Close()
return nil
}
// 执行事务
err = transaction()
if err != nil {
log.Fatalf("Error executing the transaction: %s", err)
}
fmt.Println("Transaction executed successfully")
}
在上述代码中,我们定义了一个transaction函数,用于执行事务操作。在事务中,我们可以执行一系列的操作,例如更新多个文档或执行复杂的业务逻辑。在示例中,我们使用了Elasticsearch的XPack Security API来模拟事务的开始和提交操作。
7. 数据安全性
如何保护Elasticsearch中的数据安全性?
解答:
保护Elasticsearch中的数据安全性是商业项目中的重要任务之一。以下是一些保护数据安全性的方法:
- 访问控制:使用Elasticsearch的安全特性,如访问控制列表(ACL)和角色基于访问控制(RBAC),限制对敏感数据的访问权限。例如,在一个医疗保健应用的商业项目中,可以设置只有授权的医生才能访问患者的病历数据。
- 数据加密:使用SSL/TLS加密通信,确保数据在传输过程中的安全性。例如,在一个金融应用的商业项目中,可以使用SSL/TLS加密用户的交易数据,以保护用户的隐私和安全。
- 数据备份和恢复:定期备份数据,并确保备份数据的安全存储。在商业项目中,例如一个在线存储平台,可以定期备份用户的文件数据,并采取措施确保备份数据的完整性和可靠性。
- 审计日志:记录和监控对Elasticsearch的访问和操作,以便及时发现和应对潜在的安全威胁。例如,在一个企业协作平台的商业项目中,可以记录用户的登录、文件访问和编辑操作,以便审计和追踪数据的使用情况。
举个例子:
以下代码示例,展示如何使用Go语言和Elasticsearch的API来实现访问控制和数据加密:
package main
import (
"context"
"fmt"
"log"
"github.com/elastic/go-elasticsearch/v8"
"github.com/elastic/go-elasticsearch/v8/esapi"
)
func main() {
// 创建Elasticsearch客户端
cfg := elasticsearch.Config{
Addresses: []string{"http://localhost:9200"},
Username: "admin",
Password: "password",
}
client, err := elasticsearch.NewClient(cfg)
if err != nil {
log.Fatalf("Error creating the client: %s", err)
}
// 设置索引的访问控制列表(ACL)
reqACL := esapi.SecurityPutRoleMappingRequest{
Name: "doctor_role_mapping",
Body: map[string]interface{}{
"roles": []string{"doctor_role"},
"users": []string{"doctor_user"},
},
}
// 发送设置访问控制列表的请求
resACL, err := reqACL.Do(context.Background(), client)
if err != nil {
log.Fatalf("Error setting the ACL: %s", err)
}
defer resACL.Body.Close()
// 检查响应状态
if resACL.IsError() {
log.Fatalf("Error setting the ACL: %s", resACL.Status())
}
// 打印设置访问控制列表成功的消息
fmt.Println("ACL set successfully")
// 设置索引的SSL/TLS加密
reqTLS := esapi.IndicesPutSettingsRequest{
Index: []string{"patient_data_index"},
Body: map[string]interface{}{
"settings": map[string]interface{}{
"index": map[string]interface{}{
"number_of_replicas": 1,
"number_of_shards": 5,
"refresh_interval": "1s",
"codec": "best_compression",
},
},
},
}
// 发送设置SSL/TLS加密的请求
resTLS, err := reqTLS.Do(context.Background(), client)
if err != nil {
log.Fatalf("Error setting the TLS encryption: %s", err)
}
defer resTLS.Body.Close()
// 检查响应状态
if resTLS.IsError() {
log.Fatalf("Error setting the TLS encryption: %s", resTLS.Status())
}
// 打印设置TLS加密成功的消息
fmt.Println("TLS encryption set successfully")
}
在上述代码中,我们使用Elasticsearch的Security API来设置访问控制列表(ACL)和索引的SSL/TLS加密。在示例中,我们设置了一个名为doctor_role_mapping
的角色映射,将医生用户与医生角色关联起来,并设置了一个名为patient_data_index
的索引的SSL/TLS加密。
8.数据同步和复制
如何处理Elasticsearch中的数据同步和复制?
解答:
在商业项目中,例如一个多地区的电子商务平台,数据同步和复制是至关重要的。为了处理Elasticsearch中的数据同步和复制,可以采取以下方法:
- 使用Elasticsearch的副本机制:通过配置适当数量的副本,将数据复制到不同的节点上,以实现数据的冗余存储和高可用性。当主分片不可用时,副本可以接管服务,确保数据的持续访问和处理。
- 使用Elasticsearch的跨集群复制功能:通过设置跨集群复制,可以将数据复制到不同的集群中,实现跨地区的数据同步和复制。例如,在一个多地区的电子商务平台的商业项目中,可以将数据复制到不同的地理位置的集群中,确保数据在不同地区的节点上都有备份。这样可以提高数据的可用性和容灾能力,保证用户在不同地区的访问体验。
代码示例:
以下是一个简单的示例代码,展示了如何使用Elasticsearch的跨集群复制功能:
package main
import (
"context"
"fmt"
"log"
"github.com/elastic/go-elasticsearch/v8"
"github.com/elastic/go-elasticsearch/v8/esapi"
)
func main() {
// 创建源集群的Elasticsearch客户端
sourceCfg := elasticsearch.Config{
Addresses: []string{"http://source-cluster:9200"},
}
sourceClient, err := elasticsearch.NewClient(sourceCfg)
if err != nil {
log.Fatalf("Error creating the source client: %s", err)
}
// 创建目标集群的Elasticsearch客户端
targetCfg := elasticsearch.Config{
Addresses: []string{"http://target-cluster:9200"},
}
targetClient, err := elasticsearch.NewClient(targetCfg)
if err != nil {
log.Fatalf("Error creating the target client: %s", err)
}
// 设置跨集群复制的请求体
reqBody := `{
"remote_cluster": {
"remote_cluster_name": "source-cluster",
"seed_hosts": ["source-cluster:9300"]
},
"leader_index_patterns": ["index1-*"],
"follower_index_prefix": "replica-"
}`
// 发送跨集群复制的请求
res, err := targetClient.CrossClusterReplication.FollowIndex(
"follower-index",
reqBody,
targetClient.CrossClusterReplication.FollowIndex.WithContext(context.Background()),
)
if err != nil {
log.Fatalf(""Error sending the follow index request: %s", err)
}
// 解析跨集群复制的响应
defer res.Body.Close()
if res.IsError() {
log.Fatalf("Follow index request failed: %s", res.Status())
}
// 处理跨集群复制的响应
fmt.Println("Follow index request successful")
通过上述代码示例,我们可以看到如何使用Elasticsearch的跨集群复制功能来实现数据的同步和复制。在商业项目中,这种方法可以用于多地区的电子商务平台,确保数据在不同地区的节点上都有备份,提高数据的可用性和容灾能力。
总结
相信你看完这些面试题后,对我开篇讲的这些话有了更好的理解:
我们在回答面试题的时候,不能干巴巴的去背八股文,一定要结合应用场景,最好能结合过去做过的项目,去和面试官沟通。
这些场景题虽然不要求我们手撕代码,但是解决思路和关键方法还是要烂熟于心的。
这篇文章不仅给出了常见的面试题和答案,并且给出了这些知识点的应用场景、也给出了解决这些问题的思路,并且结合这些思路提供了关键代码。这些代码段都是可以直接CV到本地运行起来的,并且都写清楚了注释,欢迎大家动起手来操练起来,不要死记硬背八股文。
最后,整理不易,原创更不易,你的点赞、留言、转发是对我最大的支持!
全网搜索:王中阳Go
,获得更多面试题资料。
精选8道ES高频面试题和答案,后悔没早点看。的更多相关文章
- 100道Java高频面试题(阿里面试官整理)
我分享文章的时候,有个读者回复说他去年就关注了我的微信公众号,打算看完我的所有文章,然后去面试,结果我后来很长时间不更新了...所以为了弥补一直等我的娃儿们,给大家的金三银四准备了100道花时间准备的 ...
- 备战“金九银十”10道String高频面试题解析
前言 String 是我们实际开发中使用频率非常高的类,Java 可以通过 String 类来创建和操作字符串,使用频率越高的类,我们就越容易忽视它,因为见的多所以熟悉,因为熟悉所以认为它很简单,其实 ...
- 熟悉这几道 Redis 高频面试题,面试不用愁
1.说说 Redis 都有哪些应用场景? 缓存:这应该是 Redis 最主要的功能了,也是大型网站必备机制,合理地使用缓存不仅可以加 快数据的访问速度,而且能够有效地降低后端数据源的压力. 共享Ses ...
- 2019年12道RabbitMQ高频面试题你都会了吗?(含答案解析)
RabbitMQ 面试题 1.什么是 rabbitmq 2.为什么要使用 rabbitmq 3.使用 rabbitmq 的场景 4.如何确保消息正确地发送至 RabbitMQ? 如何确保消息接收方消费 ...
- 18道kafka高频面试题哪些你还不会?(含答案和思维导图)
前言 Kafka是最初由Linkedin公司开发,是一个分布式.支持分区的(partition).多副本的(replica),基于zookeeper协调的分布式消息系统,它的最大的特性就是可以实时的处 ...
- 金九银十已到!掌握这300道java高频面试题,助你面试BAT无忧!
前言 不知不觉已经到了九月了,回首看年初的时候简直像做梦一样.不得不说时间真的是无情一般的流逝,题外话就不多说了!回归正题,现在已经到了今年最后一波大好的跳槽涨薪的时机了,错过了这一次可能你就得等到明 ...
- 精选20道Java代码笔试题
1.运算符优先级问题,下面代码的结果是多少? public class Test { public static void main(String[] args) { int k = 0; int r ...
- 精选30道Java多线程面试题
1.线程和进程的区别 进程是应用程序的执行实例.比如说,当你双击的Microsoft Word的图标,你就开始运行的Word的进程.线程是执行进程中的路径.另外,一个过程可以包含多个线程.启动Word ...
- [刘阳Java]_精选20道Java多线程面试题
1. 多线程使用的优缺点? 优点: (1)多线程技术使程序的响应速度更快 (2)当前没有进行处理的任务可以将处理器时间让给其它任务 (3)占用大量处理时间的任务可以定期将处理器时间让给其它任务 (4) ...
- 【转】 71道经典Android面试题和答案,重要知识点都包含了
,,面试题1. 下列哪些语句关于内存回收的说明是正确的? (b ) A. 程序员必须创建一个线程来释放内存 B.内存回收程序负责释放无用内存 C.内存回收程序允许程序员直接释放内存 ...
随机推荐
- 成为钢铁侠!只需一块RTX3090,微软开源贾维斯(J.A.R.V.I.S.)人工智能AI助理系统
梦想照进现实,微软果然不愧是微软,开源了贾维斯(J.A.R.V.I.S.)人工智能助理系统,贾维斯(jarvis)全称为Just A Rather Very Intelligent System(只是 ...
- 系统建模之UML用例视图
<用例视图> 1 用例图的目标 who「参与者」:确定谁要使用系统 what「功能」:他们使用系统做什么? 2 用例图-四大主要组件 2.1 参与者 参与者:与应用程序或系统进行交互的用户 ...
- 四月二十一号Java知识基础
1.接口本身具有数据成员.抽象方法.默认方法.和静态方法,但它与抽象类不同 1)接口的数据成员都是静态的且必须初始化,即数据成员必须是静态常量 2)接口中除咯声明抽象方法外,还可以定义静态方法 和默认 ...
- Design as You See FIT 阅读笔记
Design as You See FIT 作者及会议名称:DATE 2009, Daniel Holcomb, UC Berkeley 本文的重点贡献:提出了一种新方法计算时序电路发生系统级故障对输 ...
- Java 框架面试题-Spring Boot自定义配置与自动配置共存
Spring Boot 是一个快速开发框架,可以简化 Spring 应用程序的开发,其中自定义配置是其中一个非常重要的特性. 在 Spring Boot 中,自定义配置允许开发者以自己的方式来配置应用 ...
- DG修复:修改密码文件导致归档不应用
问题描述:重启完备库,之后发现主备同步状态异常,mrp进程状态显示applying log,但是v$datagaurd_stats视图中查询到归档日志并没有在应用.主库切换归档,可以正常传输过来,但是 ...
- Qt开发技术:Q3D图表开发笔记(三):Q3DSurface三维曲面图介绍、Demo以及代码详解
前言 qt提供了q3d进行三维开发,虽然这个框架没有得到大量运用也不是那么成功,性能上也有很大的欠缺,但是普通的点到为止的应用展示还是可以的. 其中就包括华丽绚烂的三维图表,数据量不大的时候是可 ...
- c语言趣味编程(3)打鱼还是筛网
一.问题描述 中国有句俗语叫"三天打鱼两天晒网".某人从1990年1月1日起开始"三天打鱼两天晒网",问这个人在以后的以后的某一天中是打鱼还是晒网. 二.设计思 ...
- ES6之数组的Array.from()方法
Array.from()方法就是构造函数本身的方法 将一个类数组对象或者可遍历对象转换成一个真正的数组. 那么什么是类数组对象呢?所谓类数组对象,最基本的要求就是具有length属性的对象. 1.将类 ...
- 【Python基础】推导式(列表、字典、集合)
推导式是一种简洁.高效的语法,用于从一个可迭代对象中生成新的可迭代(iterable)对象. 通常情况下,在以下情况可以考虑使用推导式: 只需要简单的表达式来计算新的可迭代对象的元素. 可迭代对象不是 ...