令人窒息的百度面试题(正值换工作季,还不收藏???)

news2024/11/14 20:48:57

最近去网上找了一些百度的面经,冥冥之中在众多的面试题中打开了下边两个面试题:

2021百度前端社招面经

百度前端面试题分享,带答案

看完之后我直呼“哇哦~”,全部在我的射程范围之内。我该不会如此幸运到问的全会吧。

是的,答案就是不会,我就是没有幸运到全会。

话不多说,接下来就回顾下面试题。

如何实现新手指引

关于这个问题我写过使用driver.js库和Vue Tour实现的新手指引。

使用js实现如下:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>新手指引功能</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }

        body {
            box-sizing: border-box;
        }

        .stepBlock {
            background-color: burlywood;
            margin-right: 20px;
        }

        .positionStyle{
            position: absolute;
            z-index: 200;
        }

        /* 蒙层样式 */
        .overlay {
            position: fixed;
            top: 0;
            left: 0;
            right: 0;
            bottom: 0;
            background-color: rgba(0, 0, 0, .5);
            z-index: 100;
        }
    </style>
</head>

<body>
    <section id="mask">
        <section class="positionStyle" id="tip"></section>
        <section class="positionStyle" id="curStepMask"></section>
    </section>

    <section style="margin:200px;">
        <span id="first" class="stepBlock">
            第一步
        </span>
        <span id="second" class="stepBlock">
            第二步
        </span>
        <span id="third" class="stepBlock">
            第三步
        </span>
    </section>

    <section style="margin-top:30px">
        <button onclick="setMask()">开始指引</button>
    </section>

    <script>
        const tipDict = [
            { id: 'first', content: '这里是第1步哦' },
            { id: 'second', content: '这里是第2步哦' },
            { id: 'third', content: '这里是最后一步哦,点击完成按钮结束新手指引' },
        ]
        let flag = 0;

        function setMask() {
            // 添加蒙层
            let mask = document.getElementById('mask')
            mask.setAttribute('class', 'overlay')
            setTip()
        }

        function removeMask() {
            // 移除蒙层
            let mask = document.getElementById('mask')
            mask.setAttribute('class', '')

            // 移除tip提示的子元素
            removeTip()
            removeStepMask()
        }

        function setTip() {
            if (flag < tipDict.length) {
                // 获取当前步骤的元素,以及元素的位置信息,供后续定位提示信息和覆盖信息使用
                const curStepEle = document.getElementById(tipDict[flag].id)
                const bound = curStepEle.getBoundingClientRect()

                // 找到id为tip的元素
                let ele = document.getElementById("tip")

                // 如果存在子元素,先移除
                removeTip()
                removeStepMask()

                // 创建提示信息和下一步的统一父元素,方便后续移除元素
                let node = document.createElement('div')
                // 创建提示信息
                let tipText = document.createTextNode(tipDict[flag].content)
                // 将提示信息插入到父元素
                node.appendChild(tipText)
                // 创建“下一步”按钮
                let nextBtn = document.createElement('button')
                nextBtn.innerHTML = flag === tipDict.length - 1 ? '完成' : '下一步';
                nextBtn.onclick = setTip;
                // 将按钮插入到父元素
                node.appendChild(nextBtn)
                // 设置统一父元素的位置


                ele.style.left = bound.x + 'px'
                ele.style.top = bound.y + 20 + 'px'
                // 将统一的父元素插入到id为tip的元素
                ele.appendChild(node)

                // 将当前步骤高亮显示
                let tag = flag - 1
                if (tag >= 0) {
                    document.getElementById(tipDict[tag].id).style = ''
                }
                // const curStepEle = document.getElementById(tipDict[flag].id)
                // const bound = curStepEle.getBoundingClientRect()

                const curStepMask = document.getElementById('curStepMask')
                curStepMask.style.left = bound.x + 'px'
                curStepMask.style.top = bound.y + 'px'

                const curStepEleClone = curStepEle.cloneNode(true)
                curStepMask.appendChild(curStepEleClone)

                flag++
            } else {
                flag = 0;
                removeMask()
            }
        }
        function removeStepMask() {
            let ele = document.getElementById('curStepMask')
            let child = ele.lastElementChild
            if (child) {
                ele.removeChild(child)
            }
        }
        function removeTip() {
            let ele = document.getElementById("tip")
            let child = ele.lastElementChild
            if (child) {
                ele.removeChild(child)
            }
        }
    </script>
</body>

</html>

// 注意元素中包含如下结构:

<section id="mask"> 
    <section class="positionStyle" id="tip"></section> 
    <section class="positionStyle" id="curStepMask"></section>
</section>

实现思路是:

  • 点击“开始指引”:找到id为mask的元素,为该元素添加蒙层样式(setMask)
  • 添加提示信息:找到id为tip的元素,将提示信息添加为该元素的子元素(setTip)
  • 高亮当前步骤元素:找到当前目标元素,克隆目标元素,然后将克隆后的目标元素添加为curStepMask的子元素(setTip)
  • 定位tip和curStepMask的元素:curStepMask元素在当前目标元素的正上方,tip元素根据情况而定
  • 每次添加当前提示信息时要移除上一次添加的提示信息和覆盖元素(removeTip,removeStepMask)
    getBoundingClientRect

返回值是一个 DOMRect[3] 对象,是包含整个元素的最小矩形(包括 padding 和 border-width)。该对象使用 left、top、right、bottom、x、y、width 和 height 这几个以像素为单位的只读属性描述整个矩形的位置和大小。除了 width 和 height 以外的属性是相对于视图窗口的左上角来计算的。–MDN

在这里插入图片描述

图片上有一个人脸,除了脸部以外加上蒙层

方案一:

添加遮罩层,在图片上方添加一张只有人脸的图片:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>图片添加蒙层</title>
    <style type="text/css">
        img {
            position: absolute;
            top: 50%;
            left: 50%;
            width: 300px;
        }

        .overlay {
            position: fixed;
            top: 0;
            right: 0;
            bottom: 0;
            left: 0;
            background-color: rgba(0, 0, 0, .5);
            z-index: 100;
        }
    </style>
</head>

<body>
    <div class="overlay">
        <img src="../images/mask.png" style="width:200px" />
    </div>
    <img src="../images/cat.png" />
</body>

</html>

最终实现效果:(没有用一模一样的图片,只是模拟了类似的效果)

图片
image.png

上述是在整个页面添加蒙层,若想只在图片部分添加蒙层:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>图片添加蒙层</title>
    <style type="text/css">
        img {
            width: 300px;
        }

        .overlay {
            position: absolute;
            top: 0;
            right: 0;
            bottom: 0;
            left: 0;
            background-color: rgba(0, 0, 0, .5);
            z-index: 100;
        }
    </style>
</head>

<body>
    <div style="position: relative;width: 300px;">
        <div class="overlay">
            <img src="../images/kid.png" style="width:200px" />
        </div>
        <img src="../images/cat.png" />
    </div>
</body>

</html>

效果:

图片
image.png

echarts实现原理

整个ECharts库都是以canvas为基础的!canvas是一个可以在页面上固定的画图区域建立坐标系,然后通过JavaScript脚本在坐标系中绘制圆、盒、文字等
Echarts拿到数据后,通过一系列的计算,算出canvas绘制图案时所需要的数据(坐标、高度、宽度等);最终通过canvas,绘制出各色图表。
在这里插入图片描述

了解canvas吗

HTML5 元素用于图形的绘制,通过脚本 (通常是JavaScript)来完成。

标签只是图形容器,必须使用脚本来绘制图形。

可以通过多种方法使用 canvas 绘制路径,盒、圆、字符以及添加图像。

如何实现组件滑动切换效果

不使用react-transition-group

对语义化的理解
语义化就是正确的标签做正确的事。语义化的好处在于:

  • 对于开发团队而言,代码更加容易维护
  • 在css没有加载出来的情况下也能很好的展示结构
  • 有利于SEO优化
  • 更好地支持各种终端,例如无障碍阅读和有声小说等

HTML5有哪些语义化标签

常用的语义化标签有:

  • header:定义页眉信息
  • nav:导航栏
  • section:页面的组成部分
  • footer:脚注信息
  • aside:侧边栏信息,比如菜单或者广告等

less 多处用到px转换为vw 如何实现

sass中可以定义函数,接收参数并且返回计算值:

/*比如:在父元素字体大小为 12px 的容器内绘制图形交互*/
@function pxToEm ($px) {
  @return ($px/12) + em;
}

# Sass
.box {
    width: pxToEm(36);
}

# CSS
.box {
    width: 3em;
}

less中函数是内置的不能够自定义,所以可以使用混入:


/*
将宽度为 375px 的 UI 设计稿转换成使用单位 vw 来适配移动端的网页。
避免编译:~' 值 '
*/

.pxToVW (@px, @attr: width) {
    @vw: (@px / 375) * 100;
    @{attr}: ~"@{vw}vw"; 
}

# Less
.box {
    .pxToVW(75);
    .pxToVW(150, height);
}

# CSS
.box {
    width: 20vw;
    height: 40vw;
}

vue-router中router和route的区别

  • router是路由实例对象,包含一些路由跳转方法,比如push。

  • route是路由信息对象,包含和路由相关的一些信息,比如params,location等。

vue单页面应用无刷新更新组件怎么实现的

一般被询问的点在于vue-router两种模式下如何实现的url到组件的映射。

hash模式

hash模式是vue-router的默认模式。hash指的是url描点,当描点发生变化的时候,浏览器只会修改访问历史记录,不会访问服务器重新获取页面。因此可以监听描点值的变化,根据描点值渲染指定dom。

  • 改变描点
    可以通过location.hash = "/hashpath"的方式修改浏览器的hash值。

  • 监听描点变化
    可以通过监听hashchange事件监听hash值的变化。

window.addEventListener('hashchange', () => {
   const hash = window.location.hash.substr(1)
   // 根据hash值渲染不同的dom
})

history模式

通过mode选项开启history模式,history 模式和 hash 模式的区别在于:

  1. history模式中不带有“#”,更加美观
  2. history模式当用户刷新或直接输入地址时会向服务器发送一个请求,所以history模式需要服务端同学进行支持,将路由都重定向到根路由
  • 改变url
    H5的history对象提供了pushState和replaceState两个方法,当调用这两个方法的时候,url会发生变化,浏览器访问历史也会发生变化,但是浏览器不会向后台发送请求。
// 第一个参数:data对象,在监听变化的事件中能够获取到
// 第二个参数:title标题
// 第三个参数:跳转地址
history.pushState({}, "", '/a')
  • 监听url变化
    可以通过监听popstate事件监听history变化,也就是点击浏览器的前进或者后退功能时触发。
window.addEventListener("popstate", () => {
    const path = window.location.pathname
    // 根据path不同可渲染不同的dom
})

从某种程度来说,调用 pushState() 和 window.location = "#foo"基本上一样,他们都会在当前的 document 中创建和激活一个新的历史记录。但是 pushState() 有以下优势:

  • 新的 URL 可以是任何和当前 URL 同源的 URL。但是设置 window.location[6] 只会在你只设置锚的时候才会使当前的 URL。

  • 非强制修改 URL。相反,设置 window.location = “#foo”; 仅仅会在锚的值不是 #foo 情况下创建一条新的历史记录。

  • 可以在新的历史记录中关联任何数据。window.location = "#foo"形式的操作,你只可以将所需数据写入锚的字符串中。

注意: pushState() 不会造成 hashchange[7] 事件调用,即使新的 URL 和之前的 URL 只是锚的数据不同。----MDN

vue在页面中如何监听回到上一步的操作

挂载完成后,判断浏览器是否支持popstate

mounted(){
  if (window.history && window.history.pushState) {
    history.pushState(null, null, document.URL);
    window.addEventListener('popstate', this.goBack, false);
  }
},

页面销毁时,取消监听。否则其他vue路由页面也会被监听

destroyed(){
  window.removeEventListener('popstate', this.goBack, false);
},

页面跳转函数

methods:{
  goBack(){
    this.$router.replace({path: '/'});
    //replace替换原路由,作用是避免回退死循环
  }
}

代码题:回文字符串

function checkStr(str) {
    return str === str.split('').reverse().join('')
}

场景提:一个公告栏,每一天都可以展示,当用户点击关闭后今天不再显示,明天(过了今天零点)还会显示

我想到的方案就是在localStorage中存储用户关闭公告栏的时间戳,等再次进入页面的时候判断是不是存在localStorage:

  • 若不存在则证明从来没有关闭过公告栏,那就显示;
  • 若存在,就判断时间戳和当前时间是否是同一天,不是同一天就显示

代码题:命名方式中划线改小驼峰

方案一:

function transName(arr) {
    let res = arr.map(e => {
        let items = e.split('-').map((item, index) => {
            if (index) {
                let first = item.substring(0,1)
                let rest = item.substring(1)
                return first.toUpperCase()+rest
            }else{
                return item.toLowerCase()
            }
        })
        return items.join('')
    })
    return res
}
console.log(transName(['A-b-cee', 'ca-de-ea', 'e-fe-eaa','f-g','mn']))

方案二:

function turnName(str){
    return str.replace(/-[a-zA-Z]/g,match=>match.replace('-','').toUpperCase())
}

代码题:命名方式小驼峰改中划线

let s1 = 'aBBcdE';

let t = s1.replace( /[A-Z]/g, match=>'-'+match.toLowerCase());
console.log(t);

git commit之后修改上一次commit的信息

刚commit还没有push

git commit --amend

会进入vim编辑器,点击i,修改commit信息后,点击esc,输入ZZ退出。

git log 可以看见最近commit信息

刚push,修改最近一次commit

git commit --amend

会进入vim编辑器,点击i,修改commit信息后,点击esc,输入ZZ退出。

git log 可以看见最近commit信息,pull后再push到远程(但是每次pull后再push会导致覆盖原来的更改,后来直接强制推送成功了:git push origin HEAD:master --force)

修改历史push的commit信息

git rebase -i HEAD~3

表示要修改当前版本的倒数第三次状态.

这个命令出来之后,会出来三行东东:

pick:*******

pick:*******

pick:*******

如果你要修改哪个,就把那行的pick改成edit,然后保存退出(点击esc,输入ZZ退出)

这时通过git log你可以发现,git的最后一次提交已经变成你选的那个了,这时再使用:

git commit --amend 来对commit进行修改。

修改完成后使用git rebase --continue

然后将变化push到远程:git push origin HEAD:master --force

前端性能优化

页面渲染优化

Webkit 渲染引擎流程:

  • 处理 HTML 并构建 DOM 树
  • 处理 CSS 构建 CSS 规则树(CSSOM)
  • DOM Tree 和 CSSOM Tree 合成一棵渲染树 Render Tree。
  • 根据渲染树来布局,计算每个节点的位置
  • 调用 GPU 绘制,合成图层,显示在屏幕上
  1. 避免css阻塞:css影响renderTree的构建,会阻塞页面的渲染,因此应该尽早(将 CSS 放在 head 标签里)和尽快(启用 CDN 实现静态资源加载速度的优化)的将css资源加载

  2. 避免js阻塞:js可以修改CSSOM和DOM,因此js会阻塞页面的解析和渲染,并且会等待css资源的加载。也就是说js会抢走渲染引擎的控制权。所以我们需要给js资源添加defer或者async,延迟js脚本的执行。

  3. 使用字体图标 iconfont 代替图片图标:

  • 图片会增加网络请求次数,从而拖慢页面加载时间
  • iconfont可以很好的缩放并且不会添加额外的请求
  1. 降低css选择器的复杂度:浏览器读取选择器,遵循的原则是从选择器的右边到左边读取。
  • 减少嵌套:最多不要超过三层,并且后代选择器的开销较高,慎重使用
  • 避免使用通配符,对用到的元素进行匹配即可
  • 利用继承,避免重复匹配和定义
  • 正确使用类选择器和id选择器
  1. 减少重绘和回流:

CSS

JavaScript

  • 避免频繁操作样式,最好一次性重写style属性,或者将样式列表定义为class并一次性更改class属性。
  • 避免频繁操作DOM,创建一个documentFragment,在它上面应用所有DOM操作,最后再把它添加到文档中。
  • 为元素设置display: none,操作结束后再把它显示出来。因为在display属性为none的元素上进行的DOM操作不会引发- - 回流和重绘。用一次回流替代多次回流
  • 避免频繁读取会引发回流/重绘的属性,如果确实需要多次使用,就用一个变量缓存起来。
  • 对具有复杂动画的元素生成一个新图层
  • 避免使用table布局。
  • 尽可能在DOM树的最末端改变class。
  • 避免设置多层内联样式。
  • 将动画效果应用到position属性为absolute或fixed的元素上。
  • 避免使用CSS表达式(例如:calc())。

JS中的性能优化

  • 使用事件委托
  • 防抖和节流
  • 尽量不要使用JS动画[9],css3动画[10]和canvas动画[11]都比JS动画性能好

图片的优化

  • 雪碧图:借助减少http请求次数来进行优化
  • 图片懒加载:在图片即将进入可视区域的时候进行加载(后边有判断即将进入可视区域的方法)
  • 使用CSS3代替图片:有很多图片使用 CSS 效果(渐变、阴影等)就能画出来,这种情况选择 CSS3 效果更好

webpack优化

  • 代码压缩:html,css,js文件压缩
  • Tree shaking 去除死代码
  • babel-plugin-transform-runtime减少ES6转化ES5的冗余
  • 提升打包速度

vue

  • 路由懒加载
  • 合理使用computed和watch
  • v-for添加key
  • v-for的同时避免使用v-if
  • destory时销毁事件:比如addEventListener添加的事件、setTimeout、setInterval、bus.$on绑定的监听事件等
    第三方插件按需引入

react

  • map循环展示添加key
  • 路由懒加载
  • 使用scu,memo或者pureComponent避免不必要的渲染

前端的缓存机制

分为强缓存和协商缓存。

强缓存不需要客户端向服务端发送请求,有两种响应头实现方案:

  • Expires:值是一个绝时间,在这个时间前缓存有效,但是如果本地时间被修改,会导致缓存失效

  • Cache-control:值是一个相对时间,单位为秒,资源在这个时间内有效
    强缓存过期之后会使用协商缓存,协商缓存需要客户端向服务端发送请求,资源未过期则服务端返回304否则返回新的资源。协商缓存也有两种实现方案:

  • Last-Modified 和 If-Modified-Since:Last-Modified 表示本地文件最后修改日期,If-Modified-Since 会将 Last-Modified 的值发送给服务器,询问服务器在该日期后资源是否有更新,有更新的话就会将新的资源发送回来。但是如果本地文件被打开,会导致Last-Modified 被修改。

  • ETag 和 If-None-Match:ETag 类似于文件指纹,If-None-Match 会将当前 ETag 发送给服务器,询问该资源 ETag 是否变动,有变动的话就将新的资源发送回来。并且 ETag 优先级比 Last-Modified 高。

如何判断图片即将进入可视区域

方案1:clientHeight+scroolTop>offsetTop

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>图片加载优化</title>
</head>

<body>
    <div style="background-color: green;width:100vw;height:8000px">
    </div>
    <div id="yellow" style="background-color: yellow;width:100vw;height:800px">
    </div>

    <script>
        document.addEventListener('scroll', () => {
            const clientH = document.documentElement.clientHeight//获取屏幕可视区域的高度
            const scrollT = document.documentElement.scrollTop//获取浏览器窗口顶部与文档顶部之间的距离,也就是滚动条滚动的距离
            const offsetTop = document.getElementById('yellow').offsetTop//获取元素相对于文档顶部的高度
            if (clientH + scrollT > offsetTop) {
                console.log('进入可视区域啦!!')
            }
        })
    </script>
</body>

</html>

方案2:下滑过程中bound.top会越来越小

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>图片加载优化</title>
</head>

<body>
    <div style="background-color: green;width:100vw;height:8000px">
    </div>
    <div id="yellow" style="background-color: yellow;width:100vw;height:800px">
    </div>

    <script>
        document.addEventListener('scroll', () => {
            var bound = document.getElementById('yellow').getBoundingClientRect(); 获取元素的大小及位置
            var clientHeight = window.innerHeight;
            if (bound.top <= clientHeight) {
                console.log('进入可视区域啦')
            }
        })
    </script>
</body>

</html>

先整理这么多,可以关注我看更多经典面试题

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/188047.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

横扫150道MySQL大厂面试题【视频+文档】

MySQL是程序员面试的必考题&#xff0c;因其体系庞大&#xff0c;架构设计复杂&#xff0c;是面试的重点与难点。教程基于大厂面试的充分调研&#xff0c;深度挖掘用人企业的标准与要求&#xff0c;针对MySQL知识体系和高频面试题&#xff0c;把内容分为五大部分&#xff1a;My…

如何保障MES系统实施?实现“大物流、小生产”

MES系统的成功应用不只是单单将软件系统开发出来&#xff0c;然后直接安装应用就可以进行运行做工。MES系统的运行需要从多个方面出发&#xff0c;确保软件系统的成功实施部署&#xff0c;然后在生产当中发挥自己的作用。实际情况开发为了确保MES系统的正常运行&#xff0c;必须…

一年测试经验,终于找到大厂的工作了

前两天有个小伙伴在后台留言&#xff0c;最近的面试越来越难了&#xff0c;尤其是技术面&#xff0c;考察得越来越细&#xff0c;庆幸的是最终顺利找到了某大厂工作。 一般技术面试官都会通过自己的方式去考察程序员的技术功底与基础理论知识 比如果这样的问题&#xff1a; 所…

Springboot+vue+vue在线日程管理系统 java

&#xff08;1&#xff09;应用主类SpringbootApplication应该放于根目录下springboot下&#xff0c;通常我们会在主类中做一些框架配置 扫描等配置&#xff0c;SpringbootApplication放在根目录下可以可以帮助程序减少手工配置来加载到我们希望被Spring加载的内容。   &…

调试日志:RK3568 配置GC2053摄像头驱动

在设备树文件代码中添加 gc2053 设备节点 &i2c2 {status "okay";pinctrl-0 <&i2c2m1_xfer>;/* split mode: lane0/1 */gc2053: gc205337 {status "okay";compatible "galaxycore,gc2053";// 需要与驱动中的匹配字符串一致reg …

2-3-1-2、MySQL中的目录和文件

目录bin 目录服务器程序mysqldmysqld_safemysql.servermysqld_multi客户端程序mysqladminmysqldumpmysqlbackup启动选项和参数配置参数文件参数的查看和修改数据目录MySQL 中的数据目录表在文件系统中的表示lnnoDB 是如何存储表数据的系统表空间(system tablespace)独立表空间(…

macOS 配置flutter 环境

flutter 中文网 https://book.flutterchina.club 官方 :https://docs.flutter.dev/get-started/install/macos (本文基于此) 1. 本文在 MacOS 环境下配置 2. 要安装和运行Flutter&#xff0c;您的开发环境必须满足以下最低要求: 操作系统:macOS 磁盘空间:2.8 GB(不包括IDE/to…

哪款无线耳机音质好又便宜?性价比高音质好的蓝牙耳机推荐

无线蓝牙耳机发展至今&#xff0c;在各种性能的表现上越来越稳定、先进。人们在选择蓝牙耳机时可以根据自身需求来选择最适合的那款&#xff0c;而性价比和音质也成为了大多数人选择的关键要素之一。那么&#xff0c;哪款无线耳机音质好又便宜&#xff1f;下面&#xff0c;我来…

26.注解、动态代理

目录 一.注解 1.1 注解概述 1.2 注解的作用 1.3 自定义注解 1.3.1 什么是自定义注解 1.3.2 自定义注解格式 1.3.3 注意事项 1.3.4 代码示例 1.4 元注解 1.4.1 什么是元注解 1.4.2 种类 1.5 注解解析 1.5.1 什么是注解解析 1.5.2 相关接口 1.5.3 注意事项&#x…

Java配置45-idea 与 maven 版本兼容问题

昨天帮助同事安装开发环境&#xff0c;下载项目之后 idea 报错Unable to import maven project: See logs for details这是 idea 与 maven 版本不兼容引起的。同事安装的 idea 为 2019 版本&#xff0c;maven 为 3.8.5 版本。查看 maven官网&#xff1a;https://maven.apache.o…

Java对象分配过程以及面试题

public static void main(String[] args) {Math math new Math();math.compute(); } 对于Math类来说&#xff0c;他还有一个类对象, 如下代码所示&#xff1a; Class<? extends Math> mathClass math.getClass(); 这个类对象是存储在哪里的呢&#xff1f;这个类对象…

将nodejs文件打包成exe, 并设置开机自启动(没有黑窗口)

nodejs打包成exe 使用node的pkg包 # 安装pkg npm install -g pkg # 使用pkg打包, 该命令会同时编译 linux, win, mac 版的exe pkg server.js # 只打包win版 pkg -t win server.js如果安装pkg后提示 pkg不是内部命令, 重新打开cmd窗口再试,如果还提示,则需要配置环境变量 查看…

力扣刷题记录——796. 旋转字符串、884. 两句话中的不常见单词、1046. 最后一块石头的重量

本专栏主要记录力扣的刷题记录&#xff0c;备战蓝桥杯&#xff0c;供复盘和优化算法使用&#xff0c;也希望给大家带来帮助&#xff0c;博主是算法小白&#xff0c;希望各位大佬不要见笑&#xff0c;今天要分享的是——《力扣刷题记录——796. 旋转字符串、884. 两句话中的不常…

五金行业:强行业性的进销存系统具体看三项

很多五金的中小企业&#xff0c;都是从小作坊、个体户做大&#xff0c;普遍有着规模小&#xff0c;管理方式传统&#xff0c;行业内部管理水平偏低等缺陷。从年初忙到年尾&#xff0c;经营者也不清楚是赚是亏&#xff0c;竞争力不强&#xff0c;很多五金企业只要用上管理软件&a…

【HBase高级】1.重要工作机制(1)——读数据流程、数据存储流程

1. 重要工作机制 1.1 读数据流程 1.从zookeeper找到meta表的region的位置&#xff0c;然后读取meta表中的数据。而meta中又存储了用户表的region信息 ZK&#xff1a;/hbase/meta-region-server&#xff0c;该节点保存了meta表的region server数据 2.根据namespace、表名和row…

Elasticsearch:理解 query_string 和 simple_query_string 查询

针对很多的开发者来说&#xff0c;如果你不是很熟悉 DSL 查询&#xff0c;那么在有些情况下&#xff0c;query_string 及 simple_query_string 变得非常灵活及方便。在今天的文章中&#xff0c;我来比较一下这两种查询的方法。 准备数据 我们先使用 _bulk 命令创建如下的一个索…

Go语言入门学习(一)——变量,类型,运算符

Go语言入门学习&#xff08;一&#xff09;——变量&#xff0c;类型&#xff0c;运算符 最近看了蔡超老师与极客邦合作的Go语言学习教程&#xff0c;让我这个之前学java一知半解的我收获颇丰&#xff0c;所以想借此机会把自己的学习历程记录下来&#xff0c;以供后续的查阅 一…

【HoloLens 2 应用开发】自定义手部骨架可视化

推荐微信阅读&#xff1a;【HoloLens 2 应用开发】自定义手部骨架可视化 关闭默认可视化 首先关闭默认的手部可视化&#xff0c;详见上文。 添加预制件 首先&#xff0c;在场景中添加一个 sphere 的 GameObject 对象作为手部关节的预制件。 然后&#xff0c;在场景中添加一个…

CentOS7 网卡bondvlan bond

网卡bonding简介网卡绑定就是把多张物理网卡通过软件虚拟成一个虚拟的网卡&#xff0c;配置完毕后&#xff0c;所有的物理网卡的ip和mac将会变成相同的。多网卡同时工作可以提高网络速度&#xff0c;还可以实现网卡的负载均衡、冗余。bonding模式round-robin(mode0)轮转策略&am…

Docker - 3. 镜像常用命令 docker images、search、pull、rmi

目录 1. 帮助命令 2. 镜像命令 2.1 docker images [选项]&#xff1a;查看所有镜像、仓库、标签和大小 2.2 docker search [选项] 镜像名字&#xff1a;在 Docker Hub 中搜索镜像 2.3 docker pull 镜像名字[:tag]&#xff1a;下载镜像&#xff0c;tag为指定的版本 2.4 d…