进阶_python 进阶 - CSDN
  • 一、合理利用watch的immediate属性 例如在组件创建时需要获取一次数据列表,然后监听数据的变化,根据数据改变重新获取列表。通常这么写: created(){ this.fetchPostList() }, watch: { changeValue(){ ...

    优雅永不过时

    ​ ——卡密尔

    以下不讨论加入TypeScript 和 JSX/TSX

    一、使用 require.context 实现前端工程自动化

    require.context 是一个 Webpack 提供的Api,通过执行require.context函数获取一个特定的上下文,主要是用于实现自动化导入模块。

    什么时候用? 当一个js文件里面需要手动引入过多的其他文件时,就可以使用。

    在Vue项目开发过程中,我们可能会遇到这些可能会用到require.context的场景

    1. 当页面内容较多,我们把页面细化为多个组件,然后再通过 import 引入到 index.js 主入口文件中的时候。
    2. 开发了一些基础组件,然后把所有组件都导入到 index.js 中,然后再将所有组件进行全局注册的时候。
    3. vuex 分割模块后,将各模块引入到 index.js 主文件中的时候。

    对于上述的几个场景,如果我们要导入的文件比较少的情况下,通过 import 一个一个去导入还可以接受,但对于量比较大的情况,就变成了纯体力活,并且每次修改都需要在主入口文件内进行调整。这样做一点都不优雅,这时候我们就可以通过 require.context 去简化这个过程。

    以第2条为例,讲一下 require.context 的用法

    常规用法

    在这里插入图片描述

    组件通过常规方式全局注册(组件越多越繁琐)

    // index.js
    import Vue from 'vue'
    import BaseIcon from './BaseIcon.vue'
    import BaseButton from './BaseButton.vue'
    import BaseInput from './BaseInput.vue'
    import BaseLoading from './BaseLoading.vue'
    
    const components = [
      BaseIcon,
      BaseButton,
      BaseInput,
      BaseLoading
    ]
    
    components.forEach((component) => {
      Vue.component(component.name, component)
    })
    
    // --------------分割线--------------
    // 而更多的同学可能会像下面这样进行注册
    Vue.component('base-icon', BaseIcon)
    Vue.component('base-button', BaseButton)
    Vue.component('base-input', BaseInput)
    

    使用 require.context

    require.context 基本语法

    require.context(directory, useSubdirectories, regExp);
    

    directory:要搜索的文件夹目录

    useSubdirectories:是否还去搜索它的子级目录

    regExp:一个匹配要搜索文件的正则表达式。

    通过 require.context 注册组件

    import Vue from 'vue'
    // 这里暂不考虑 JSX 和 TSX
    const context = require.context('./'false/\.vue$/)
    
    context.keys().forEach((key) => {
      const component = context(key).default
      Vue.component(component.name, component)
    })
    

    context.keys() 会返回一个数组,包含所有匹配到的文件的路径

    context(key)可以获取到对应的文件 .default表示 export default 导出的内容

    现在代码简洁了很多,也更加优雅。

    二、 v-model 原来可以这么用

    v-model 属于语法糖

    在用Vue开发前端时,不论使用原生还是封装好的UI库,对于表单组件,一般都会使用到 v-model ,而为了更好的表达 value 属性的用处(类似于单选框、复选框),也会进行适当的自定义。但是对于自定义组件同样可以使用 v-model

    vue 对 v-model 的基本定义

    一个组件上的 v-model 默认是在组件上面定义一个名为 value 的 prop ,同时对外暴露一个名为 input 的事件。

    像这样:

    <template>
      <div class="base-input">
        <input type="text" :value="value" @change="handleChange" />
      </div>
    </template>
    <script>
    export default {
      name: 'BaseInput',
      props: {
        // 名为value 的属性
        value: {
          type: String,
          default: '',
        },
      },
      methods: {
        handleChange(e) {
          // 暴露一个input时间
          this.$emit('input', e.target.value)
        },
      },
    }
    </script>
    

    用起来就是这样:

    <BaseInput v-model="something" />
    

    v-model 进行自定义

    通过设置 model 选项, 以自定义开关组件为例

    <template>
      <div :class="['base-switch', active && 'base-switch-active']" @click="handleClick">
        <div class="base-switch-pie"></div>
      </div>
    </template>
    
    <script>
    export default {
      name: 'BaseSwitch',
      // 通过model属性自定义 属性名和事件名
      model: {
        event: 'change',
        prop: 'active',
      },
      props: {
        // 虽然自定义了 active属性,仍然要在 props 选项里面声明
        active: {
          type: Boolean,
          default: false,
        },
      },
      methods: {
        handleClick() {
          // 暴露change事件
          this.$emit('change', !this.active)
        },
      },
    }
    </script>
    

    这么用:

    <BaseSwitch v-model="isActive" />
    

    这样的开关组件是不是更简洁了。

    三、使用 .sync ,更优雅的实现数据“双向绑定”

    在 Vue 中,props 属性是单向数据传输的,父级的 prop 的更新会影响到子组件,但是反过来不行。可是有些情况,我们需要对prop进行“双向绑定”。

    上面,我们提到了使用 v-model 实现“双向绑定”。但有时候我们希望一个组件可以实现多个数据的“双向绑定”,而在 Vue2.x 中 v-model 一个组件只能有一个,这时候就需要使用到 .sync

    .syncv-model 的异同

    相同点:

    • 两者的本质都是语法糖,目的都是实现组件与外部数据的“双向绑定”
    • 两者都是通过 属性+事件 来实现的

    不同点:

    • 一个组件只能定义一个 v-model ,但可以定义多个.sync
    • 定义方式不同,v-model 默认事件为 input ,可以通过配置 model 选项来修改,.sync事件名称固定为update:属性名

    使用 .sync

    比如写一个遮罩层

    <template>
      <div class="base-mask" v-if="showMask" @click.stop="handleClickMask">
        <slot></slot>
      </div>
    </template>
    <script>
    export default {
      name: 'BaseMask',
      props: {
        showMask: {
          type: Boolean,
          default: false,
        },
      },
      methods: {
        handleClickMask() {
          this.$emit('update:showMask', !this.showMask)
        },
      },
    }
    </script>
    

    这样去使用

    <template>
      <div class="about">
        <BaseSwitch v-model="isActive" />
        <BaseMask :show-mask.sync="isActive">这里可以加一些东西</BaseMask>
      </div>
    </template>
    
    <script>
    export default {
      data() {
        return {
          isActive: false,
        }
      },
    }
    </script>
    

    代码简洁的同时,也更加优雅

    四、动态组件,更优雅的按条件渲染页面

    有这么一个场景,需要根据条件(多条件),在页面显示相应的内容,如果用 v-if 来判断要显示哪个组件,那就会是这个样子:

    <template>
      <div>
        <ComponentA v-if="type === 'a'" />
        <ComponentB v-else-if="type === 'b'" />
        <ComponentC v-else-if="type === 'c'" />
        <!-- 这里还有 v-else-if -->
        <ComponentG v-else />
      </div>
    </template>
    

    条件越多,上面代码中那一堆 v-ifv-else-if 就越繁琐,时刻记得要优雅,这时候就该动态组件上场了。

    <template>
      <div>
        <button v-for="type in types" :key="type" @click="currentType = type">
          {{ type }}
        </button>
        <component :is="currentComponent"></component>
      </div>
    </template>
    
    <script>
    // 组件不多的情况下手动引入即可
    const context = require.context('./', false, /\.vue$/)
    let components = {}
    context.keys().forEach((key) => {
      if (key.includes('index')) return
      const component = context(key).default
      components[component.name] = component
    })
    
    export default {
      components,
      data() {
        return {
          typeComponents: components,
          types: {},
          currentType: '',
        }
      },
      computed: {
        currentComponent() {
          return this.typeComponents[this.currentType]
        },
      },
      created() {
        this.types = Object.keys(this.typeComponents)
        this.currentType = this.types[0] // 默认第一个选项
      },
    }
    </script>
    

    五、 mixins ,更高效的实现组件内容的复用

    mixinsVue 提供的一种混合混入机制,可以更高效的实现组件内容的复用。

    场景示例

    在h5页面开发中,安卓端可以通过app提供的api实现像IOS那样,软键盘弹起时不遮挡底部内容,但是并不是任何页面都适用这种情况,所以就可以在需要的页面使用这个功能,并在离开这个页面的时候,关闭这个功能。

    但是如果在每个需要的组件里面都去实现一段监听代码,代码重复太多了,此时就可以使用混入来解决这个问题

    // 混入代码 upward-mixins.js 简例
    
    export default {
      beforeCreate() {
        // ...省略
        this.$util.needUpwardOnAndroid(true)
      },
      beforeDestroy() {
        // ...省略
        this.$util.needUpwardOnAndroid(false)
      }
    }
    

    在需要使用这种功能的组件中使用即可

    <template>
      <div></div>
    </template>
    <script>
    import upwardMixins from '../mixins/upward-mixins'
    export default {
      // mixins 传入一个数组,可以有多个混入对象
      mixins: [upwardMixins]// ...省略
    }
    </script>
    

    混入规则

    Vue 中,一个混入对象可以包含任意组件选项,但是对于不同的组件选项,会有不同的使用策略。

    1. data 选项,在混入时会进行递归合并,如果两个属性发生冲突,则以组件本身为主

      const mixin1 = {
        data() {
          return {
            a: 1,
            b: 2
          }
        }
      }
      
      export default {
        mixins: [mixin1],
        data() {
          return {
            a: 2
          }
        },
        created() {
          console.log(this.a, this.b)  // 输出 2,2
        }
      }
      
    2. 生命周期钩子函数

      对于生命周期钩子函数,混入时会依次执行。混入对象里面的钩子函数会优先于组件的钩子函数执行。如果一个组件混入了多个对象,对于混入对象里面的同名钩子函数,将按照数组顺序依次执行:

      const mixin1 = {
        created() {
          console.log('第一个输出')
        }
      }
      
      const mixin2 = {
        created() {
          console.log('第二个输出')
        }
      }
      export default {
        mixins: [mixin1, mixin2]created() {
          console.log('第三个输出')
        }
      }
      
    3. 其他选项,对于值为对象的选项,如methodscomponentsfilterdirectivesprops 等等,会被合并为同一个对象。两个对象键名冲突时,取组件本身对象的键值对。

    全局混入

    混入也可以进行全局注册。一旦使用全局混入,那么混入的选项将在所有的组件内生效,代码简例:

    // 仅作简单的示例
    const someMixin = {
      // ...一些内容
    }
    
    Vue.mixin(someMixin)
    

    请谨慎使用全局混入,因为它会影响每个单独创建的 Vue 实例 (包括第三方组件)。

    简例代码: https://github.com/ahh666/vue-base-templet

    展开全文
  • C语言进阶(一)

    万次阅读 2018-03-04 22:10:18
    1、内存是线性的。 2、数据类型分类:基本数据类型,构造数据类型。 基本数据类型分为:整型,实型。 整型分为:char,short,int,long int, 实型分为:float,double,long double。 构造数据类型分为:结构体,...

    1、内存是线性的。
    2、数据类型分类:基本数据类型,构造数据类型。
    基本数据类型分为:整型,实型。
    整型分为:char,short,int,long int,
    实型分为:float,double,long double。

    构造数据类型分为:结构体,共用体,数组,枚举,指针,构造类型。


    补码
    1、同样是1个字节8个位,原码表示数值范围是0-255,补码表示范围是-128-127,这说明,不同的编码规则导致不同的数据范围。
    2、补码编码规则,0表示正数,1表示负数,正数的补码是他本身,负数的补码是原码各位取反后加1,-128的补码是1000 0000,-1的补码是1111 1111。
    3、因为补码符号位可以和普通位参与运算,所以一般数据类型有符号数在内存都是补码形式,方便参与算术运算。
    4、补码转换成10进制,只要各位取反然后按2进制计算即可。


    数据类型转换

    规则:
    小数据赋给大数据,系统为保证数据完整性,采用符号扩充行为,
    大数据赋给小数据,会发生截断行为,有可能造成数据丢失。
    注意,数据在内存形式是补码形式,所以下面显示的二进制数据也是补码
    小数据赋给大数据:
    这里写图片描述
    大数据赋给小数据(没发生数据缺失的情况):
    这里写图片描述
    大数据赋给小数据(发生数据缺失的情况):
    这里写图片描述

    基本类型之间的转换:
    这里写图片描述

    一般数据类型小要往大的那方转换,还有要注意unsigned int 和int 数据一起运算时,要转成unsigned int
    相应习题:
    这里写图片描述
    打印结果是:xxxxxxx
    解题思路:
    首先b要转换成unsigned int,b的补码形式是
    1000 0000 0000 0000 0000 0000 0110 0100
    上面的数据按无符号数计算,结果为非常大的正整数所以再加上a结果肯定大于a.
    这里写图片描述
    打印结果是:ooooooo
    解题思路:
    和上面类似,-1的补码是 ff ff ff ff,在加上a会溢出变为负数,所以结果比a小。


    展开全文
  • JS进阶

    2018-07-10 11:51:44
    JS进阶

    JS进阶(一)

    一些铺垫:

         每一个对象都有__proto__属性,主要用来继承,每一个函数都有prototype属性,上面挂载属性、方法,注意一下函数里面的prototype.constructor属性,跟对象、字符串等的constructor不一样。

            函数里面的prototype.constructor是指向函数的一个引用,而对象等的constructor输出的话可以看到是ƒ Object() { [native code] }这样的形式,这个是js底层的一些设计。

            我们实现继承时将constructor纠正,其实只是更规范一点,能够看到这个函数的引用,相当于一个提示,避免造成误导,constructor属性没什么实际性作用,只有很少的机会我们会利用他,比如会利用他给增加一些方法,如下:
    function fun(){};
    var res = new fun();
    res.constructor.prototype.add = function(){}
    //因为res.constructor是指向fun的,所以我们可以给fun增加方法通过这种方式。

    typeof instanceof

    typeof "123"//string
    typeof true//boolean
    typeof 1//number
    typeof undefined//undefined
    typeof new Data()//object
    typeof [1,2]//object
    typeof function(){}//function
    typeof null//object

           从上边的栗子可以看出来,typeof可以准确识别,string,number,boolean,undefined,function,但是无法区别数组、null、object、date,其中null是由于历史原因遗留下来的,返回object。所以我们判断 这几种的时候需要注意是否能区分。想要准确识别的话,可以像这样:

    Object.prototype.toString.call([1,2,3])//"[object Array]"

           通过对结果正则匹配,可以准确得到数据类型,具体代码,可以去另一篇《我的JS库》里面找,getParamType方法,不再一一列举,下面介绍instanceof:

    function fun(){}
    var res = new fun();
    res instanceof fun//true
    Object.getPrototypeOf(res) === fun.prototype//true

          在使用instanceof时,相当于执行了 Object.getPrototypeOf(res) === fun.prototype,是在判断构造函数的prototype是不是在实例的原型链上,有点绕,关键看代码理解。

    展开全文
  • HTML知识点补充一 HTML基础 HTML学习规划: HTML XHTML CSS CSS3 JavaScript JQuery HTML5 一 HTML基础 IDAE常用快捷键: (1)注释:Ctrl+/ (2)移动:Alt+↓或Alt+↑...head标签:定义语言,编码格式,styl...

    HTML进阶

    HTML学习规划:

    1. HTML
    2. XHTML
    3. CSS
    4. CSS3
    5. JavaScript
    6. JQuery
    7. HTML5
      在这里插入图片描述

    一 HTML基础

    • IDAE常用快捷键:
      (1)注释:Ctrl+/
      (2)移动:Alt+↓或Alt+↑
      (3)代码提示:Alt+/
      (4)快速复制:Ctrl+Alt+↓
      (5)删除一行:Ctrl+D

    • head标签:定义语言,编码格式,style等全局变量。

    • h1~h6标签:标题

    • p标签:定义段落,开启新行。

    • a标签:定义超链接。

    • img标签:定义图像,注意路径。

    • align属性:对齐方式,居左,居中,居右。默认居左。

    • a标签中name属性定于文档内部的跳转,在一个a中设置name的名,另外一个a的标签的href设置为【#name名】。

    • border属性:定义边框。

    • body标签:margin属性使从左顶点开始,去掉小白条。margin: 0px;

    • HTML布局;
      (1)使用<div>布局:

      1. float: left;<!–从左到右的排序方式 -->
      2. clear: both;<!–清除上面设置的浮动 -->

      (2)使用<table>布局:类似表格的布局方式。

    • 表单与PHP的交互:
      (1)<form>标签中的action属性设置提交的服务器,method属性设置提交方式(POST,GET)

      1. GET:在URL中会显示信息。可以作资源定位
      2. POST:则不会在URL中显示信息。 更安全一点。GET和POST要和PHP文件中的对应一直。

      (2)action属性:设置服务器地址,比如:
      <form action="http://localhost/Myfirst/myphp.php" method="POST">

    • 框架标签(frame):(HTML5中已经过时)

    • 框架集标签(frameset):(HTML5中已经过时)不能创建在body标签中。
      (1)定义任何将窗口分隔为框架,每个frameset定义了一系列行和列,rows/cols的值规定了每行或列占据屏幕的面积。

    • 内联框架:iframe。(HTML5仍在使用)
      (1)例:<iframe src="Demo1.html" frameborder="0px"></iframe>,src指定页面,frameborder是取消边框。也可以设置宽和高属性。
      (2)target属性,在何处打开链接,其中parent和top是在嵌套页面时的父框架中打开和打开到最顶层。

    • 颜色:由十六进制符号来定义。最小值为#00,最大值为#FF。
      (1)红色:#FF0000
      (2)绿色:#00FF00
      (3)蓝色:#0000FF

    • XHTML:指的是可扩展超文本标记语言,与HTML4.01的语法几乎一样。
      (1)XHTML是更严格更纯净的HTML版本,是以XML应用的方式定义的HTML。
      (2)XHTML语法规范:

      1. 标签必须正确嵌套。
      2. 元素必须始终关闭。
      3. 元素必须小写。
      4. 必须有跟元素。
      5. 属性的值必须在引号中。(HTML5则可以省略引号)
    • HTML5中具有Boolean值的属性:
      (1)当具有布尔类型值的属性不指定属性值的时候,默认为true。不写该属性,则为false。
      (2)将属性名设置为属性值,则为true。字符串为空也是true。

    概述:
    HTML5新增的元素:

    1. 结构元素
      section、article、 aside、 header、 hgroup、 footer、 nav、figure
    2. 其他元素
      video、audio、 embed、 mark、 progress、 meter、 time、 ruby、 rt、rp、wbr、canvas、command、 details、 datalist、 datagrid、 keygen、 output、source、menu
    3. input元素的类型
      email、url、number、 range、 Date Pickers
    • HTML5结构元素简介:
      (1)section元素:表示页面中的内容块,比如:章节,页眉,页脚。与h1~h6等元素结合使用,表示文档的结构。

      1. section元素用于对网站页面进行分块。对一段内容分段。
      2. 通常由内容及其标题组成。
      3. 但section元素并非普通容器,当一个容器需要被直接定义样式或通过脚本定义行为时,应该使用div。
      4. section元素可以嵌套在article元素中。

      (2)article元素:表示页面中的一块与上下文不相关的独立内容,比如:博客中的一片文章。

      1. 包裹一段代码,其中可以有头部(header)尾部(footer),就相当于将页面进行分割。代替div元素。
      2. article元素可以嵌套。 可以表示一个插件,类似内嵌页面。
      3. article可以看做是一个特殊的section,只不过它更强调独立性。

      (3)aside元素:表示article元素之外的,与article元素相关的辅助信息。

      1. aside元素用来表示当前页面或文章的附属信息部分,它可以包含与当前页面或主要内容相关的引用、侧边栏、广告、导航条,以及其他类似的有区别于主要内容的部分。

      (4)header元素:表示页面中的一个内容区域块。表示标题。

      (5)hgroup元素:用于对整个页面或页面中的一个内容块的标题进行结合。通常会将h1~h6元素进行分组。

      (6)footer元素:表示页面中的一个部分,通常是底部。承载作者,日期,版权信息等。

      (7)nav元素:页面内的导航链接。

      1. nav元素是一个可以用作页面导航的连接组,其中的导航元素链接到其他页面或当前页面的其他部分

      2. 并不是所有的连接组都要被放进nav元素,只需要将主要的、基本的连接组放进nav元素即可。

      3. nav元素应用场景:

        ●传统导航条
        ●侧边栏导航
        ●页内导航
        ●翻页操作

      (8)figure元素:表示一段独立的内容,一般表示文档主题内容中的一个独立的单元。
      (9)address元素:用来在文档中呈现联系信息,比如:名字,邮箱,地址,电话等
      (10)<hr>元素:画一条线段。

    • HTML5其他元素简介:
      (1)video、audio元素:视频、音频。
      (2)canvas元素:定义画布。(重点)仅提供一块画布。

    • HTML5input元素的类型:
      (1)email属性:输入必须是email地址。
      (2)url属性:表示文本框输入的一个地址。
      (3)number属性:只能输入数字。将typ设置为number,就只能输入数字。
      (4)range属性:输入的数字的范围值。
      (5)Date Pickers属性:日期,时间。

    • 表单新增元素和属性:

      (1)form属性:包含整个表单。

      (2)formaction属性:可以提交到不同的页面。而HTML4只在form中设置一个action,只能提交到一个页面。

      (3)formenctype属性:一个如何对表单数据进行编码。该属性有三个值:

      1. text/plain:表单数据中的空格被转换为加号,但不对特殊字符进行编码
      2. multipart/form-data:不对字符进行编码,上传文件是必须使用该值。
      3. application/x-www-form-urlencoded:在发送前编码所有字符,

      (4)formtarget属性:为每个提交设置在何处打开加载页面。

      (5)autofocus属性:为文本框,选择框或按钮自动获得焦点。

      (6)required属性:规定在提交时,如果输入内容为空则不允许提交,同时在浏览器中显示提示文字。

      (7)labels属性:~~待更

      (8)formmethod属性:设置每个元素的提交方式,比如:POST,GET。

      (9)标签的control属性:可以在标签内部放一个表单元素,并且通过该标签的control属性来访问该表单元素。

      (10)文本框的placeholder属性:指文本框处于未输入状态时显示的提示。

      (11)文本框的list属性:带类似下拉框的输入框,可以选,也可以自己输入。<datalist>标签搭配使用。

      (12)文本框的AutoComplete属性:~~待更

      (13)文本框的pattern属性:对输入的内容进行检查,不符合给定格式,则不允许提交。正则表达式。

      (14)文本框SelectionDirection属性:获取用户的操作

      (15)复选框的indeterminate属性:复选框的三种状态,即:未操作、未选中、选中

      (16)image提按钮的height和width属性:照片按钮的宽和高。

    • 全局属性:
      (1)contentEditable属性:

      1. 功能:允许用户编辑元素中的内容,所以该元素必须是可以获得到焦点的元素。布尔值类型。遵循上面说明的。
      2. 如果未指定是否可编辑,则由该元素的父元素决定。

      (2)designMode属性:

      (3)hidden属性:所以的元素都可以使用hidden属性。

      1. 功能:使该元素处于不可见状态。布尔值,true为不可见状态。

      (4)spellcheck属性:针对input元素和textarea元素的输入框提供的新属性。

      1. 功能:对用户输入的文本内容进行拼写和语法检查。

      (5)tabindex属性:

      1. 功能:用户按下Tab键,页面键的访问顺序。默认情况下,只有连接元素和表单元素,用户按Tab键才可获得焦点。

    【传送门】

    HTML基础

    展开全文
  • Android进阶二部曲第一部《Android进阶之光》介绍 :点击这里 ...Android进阶二部曲包括《Android进阶之光》和本书,因此写这本书的原因和《Android进阶之光》有些关联,主要有以下几点: 《Android进阶之...
  • python进阶到高阶大全(强烈推荐)

    万次阅读 多人点赞 2018-09-26 15:15:11
    关键字is 和 == 的区别 a = 'hello world' b = 'hello world' a == b #返回True a is b #返回False ...注意:is 判断是否是一个ID, == 判断内容是否一致。...b = a #浅拷贝,a,b同时指向一个id,当其中一个修改时,...
  • Java进阶过程

    千次阅读 2018-01-09 08:59:41
    先是JAVA基本语法、面向对象基础、JAVA高级、关系型数据库(MY SQL /ORCLE)、JDBC、网页基础(html+css+cdth)、ajax、js框架(jquery、esayui),spring+springmvc+mybatis。然后会穿插两期项目练习,还有一些比如...
  • 反射进阶,编写反射代码值得注意的诸多细节

    万次阅读 多人点赞 2018-04-02 09:06:57
    前面一段时间,我编写了一篇关于 Java 反射基础知识的博文,内容挺多的,涉及到了 Class 的获取,Field、Method、Constructor、Array 及 Enum 的获取与操作。如果学会了这些知识,就能阅读或者是编写大多数反射相关...
  • java进阶知识点

    千次阅读 2017-10-16 16:25:02
    ThreadLocal(线程变量副本) Synchronized实现内存共享,ThreadLocal为每个线程维护一个本地变量。 采用空间换时间,它用于线程间的数据隔离,为每一个使用该变量的线程提供一个副本,每个线程都可以独立地改变自己...
  • 2016年我开始建立了自己的知识体系,所有的文章都是围绕着这个体系来写,随着这个体系的慢慢成长,开始有很多出版社联系我写书,因为比较看好电子工业出版社,就顺理成章的开始了《Android进阶之光》这本书的编写。...
  • 《iOS开发进阶》分工具、实践、理论三大部分。第一部分介绍iOS 开发的常用工具,第二部分介绍iOS开发中的一些常见的实践经验,第三部分介绍iOS 开发中涉及的原理。 如果把成为iOS 开发高手的过程比作武侠小说中的...
  • C语言程序设计--进阶篇教学视频

    万人学习 2018-12-27 14:10:09
    该课程为“C语言及程序设计”系列课程中的第三部“进阶篇”。作为终结篇C语言教程,介绍了在实际应用中应用广泛的结构体数据表示和处理、利用文件进行输入输出、利用多文件组织项目开发,并结合对程序设计的进一步...
  • 动力节点JavaSE进阶

    2020-07-17 17:52:36
    教程名称: 动力节点JavaSE进阶001.Java教程_Java概述_学习前的准备002.Java教程_Java概述_计算机语言_J003.Java教程_Java概述_Java语言特004.Java教程_Java概述_Java的加载005.Java教程_Java概述_安装JDK以及006....
  • 1.第三本书《进阶指北》今天完稿了 耗时1年半,我的第三本书《进阶指北》终于在今天完稿了。前两本书每本都是耗时1年左右,完成这本书的时间增加了些,主要还是自己懒癌犯了,这里跟大家说声抱歉,让大家久等了。...
  • 架构 | 大众点评账号业务高可用进阶之路 作者:MeituanTech 在任何一家互联网公司,不管其主营业务是什么,都会有一套自己的账号体系。账号既是公司所有业务发展留下的最宝贵资产,它可以用来衡量业务指标,例如...
  • 软件测试进阶之1——测试进阶方向

    千次阅读 2018-05-23 15:11:04
    欢迎大佬们一起分享说到功能测试进阶方向,这是每个测试从业者都会经历的一个阶段个人把测试进阶分为两大类:业务测试 和 技术测试业务测试:顾名思义就是对当前从事的业务知识非常熟习,了解产品的显示、隐示需求...
  • 教程名称:由尚德Linux内核编程进阶视频教程(29集)课程目录:【】linux内核编程(进阶篇)1【】linux内核编程(进阶篇)2【】linux内核编程(进阶篇)3【】linux内核编程(进阶篇)4【】linux内核编程(进阶篇)5...
  • Java都有什么进阶技术? 私以为,一些人对JAVA进阶的理解片面了,JAVA不过也是一门语言,提升和进阶还是内功的体现。就像那位答主所说,进阶的第一步就是编码风格和规范。我深表同意。 只是会用,这还远远不够~当然...
  • 教程名称:Oracle数据库进阶教学视频(12集)课程目录:【】Oracle数据库进阶教学视频(01-02)【】Oracle数据库进阶教学视频(03-04)【】Oracle数据库进阶教学视频(05-06)【】Oracle数据库进阶教学视频(07-08)...
  • 教程名称:2017最新Java基础入门与进阶全套视频课程目录:【】01.基础语法环境搭建【】02.基础语法-数据类型【】03.基础语法-运算符【】04.基础语法-选择、循环结构【】05.基础语法-方法、数组【】06.基础语法-数组...
1 2 3 4 5 ... 20
收藏数 263,954
精华内容 105,581
关键字:

进阶