不喧嚣自有声

it's better to burn out than to fade away

0%

基本概念

  1. IOC是什么? IOC(Inversion of Control)控制反转,IOC是一种新的Java编程模式,目前很多轻量级容器都在广泛使用的模式。
  2. IOC解决了什么问题? 在IOC出现以前,组件之间的协调关系是由程序内部代码来控制的,或者说,以前我们使用New关键字来实现两组间之间的依赖关系的。 这种方式就造成了组件之间的互相 耦合。IOC(控制反转)就是来解决这个问题的,它将实现组件间的关系从程序内部提到外部容器来管理。 也就是说,由容器在运行期将组件间的某种依赖关系动态的注入组件中。
  3. IOC的实现方式 1. **依赖查找(Dependency Lookup)**:容器中的受控对象通过容器的API来查找自己所依赖的资源和协作对象。这种方式虽然降低了对象间的依赖,但是同时也使用到了容器的API,造成了我们无法在容器外使用和测试对象。 依赖查找是一种更加传统的IOC实现方式。 2. **依赖注入(Dependency Injection)**:这就是DI,字面上理解,依赖注入就是将服务注入到使用它的地方。对象只提供普通的方法让容器去决定依赖关系,
  4. IOC与DI的区别 对于IOC来说,DI更像是一个用来控制容器的工具,之所以依赖,是根据容器里各个组件之间的关系来决定。
  5. Spring中的IOC和DI IOC是Spring的核心,贯穿始终。对于Spring框架来说,就是由Spring来负责控制对象的生命周期对象间的关系。 Spring中DI有两种实现方式—Setter方式(传值方式)和构造器方式(引用方式)。

IOC

​ 假设一种情况,我们要做一个图书馆里系统,我们要定义一个书的Bean类,里面有书的id书名作者出版社….等等属性,在一个对象中,如果要使用另外的对象,就必须得到它(自己new一个,或者从JNDI中查询一个),使用完之后还要将对象销毁(比如Connection等),对象始终会和其他的接口或类藕合起来。 而spring中是如何实现的呢?相当于一个图书管理员,它负责管理很多很多书籍的信息,你只需要提供你想要借哪本书、或者说哪种类型的书,那么它就会提供给你,如果不是我们想要的书,我们就抛出异常反馈给它。整个过程不再是我们自己控制的了,我们想要什么书,不用我们去找,也不用我们去造。所有的类都在spring这个容器内登记,我们只需要请求。所有类让spring创建、销毁,也就是说控制对象生存周期的不再是引用它的对象,而是spring。对于某个具体的对象而言,以前是它控制其他对象,现在是所有对象都被spring控制,所以这叫控制反转。 所以由上面看,spring的解决方案就是面向接口的编程,对对象的控制直接调用接口就可以实现了。(前提是配置好了。🙃)

spring跟传统做法的区别:

阅读全文 »

IOC

概念

    Inversion of Control ,翻译为”控制反转“,别名”依赖注入“(Dependency Injection)。

    关键在于四个问题:谁控制谁,控制什么,反转是什么,哪些方面反转了

所谓IOC,就是由Spring IOC容器来负责对象的生命周期和对象之间的关系。

阅读全文 »

八大排序算法

冒泡排序

一、算法思想 它重复地走访要排序地数列,一次比较两个元素,如果他们的顺序有误就把他们交换一下。走访数列的工作是重复地进行直到没有再需要交换,即该数列已经排序完成。 动态效果示意图: 冒泡示意图 假设有一个大小为 N 的无序序列。以升序冒泡排序为例,冒泡排序就是要每趟排序过程中通过两两比较相邻元素,将小的数字放到前面,大的数字放在后面。 二、代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58

#include <iostream>
#include <vector>

using namespace std;

vector<int> bubbleSort(vector<int> list){
vector<int> result;
if (list.empty()){
return result;
}

result = list;
int temp;
// 要遍历的次数
for (int i = 0; i < result.size() - 1; ++i){
cout << "第" << i + 1 << "趟排序:" << endl;;
// 从后向前依次的比较相邻两个数的大小
for (int j = 0; j < result.size() - 1; j++){
// 如果后面的元素小,则交换它们的位置
if (result[j + 1] < result[j]){
temp = result[j + 1];
result[j + 1] = result[j];
result[j] = temp;
}
cout << "排序中:";
for (int s = 0; s < result.size(); s++){
cout << result[s] << " ";
}
cout << endl;
}
cout << "排序结果:";
for (int s = 0; s < result.size(); s++){
cout << result[s] << " ";
}
cout << endl;
}
return result;
}

void main(){
int arr[] = { 6, 4, 8, 1, 2, 3, 9 };
vector<int> test(arr, arr + sizeof(arr) / sizeof(arr[0]));
cout << "排序前" << endl;
for (int i = 0; i < test.size(); i++){
cout << test[i] << " ";
}
cout << endl;
vector<int> result;
result = bubbleSort(test);
cout << "排序后" << endl;
for (int i = 0; i < result.size(); i++){
cout << result[i] << " ";
}
cout << endl;
system("pause");
}

简单的来说,代码就是用两个for嵌套循环遍历数列,然后两两比较,交换顺序。所以很明显,时间复杂度为O(n^2)。

阅读全文 »

Python进阶学习——机器学习入门路线

一、引言

套用一下大神们对机器学习的定义,机器学习研究的是计算机怎样模拟人类的学习行为,以获取新的知识或技能,并重新组织已有的知识结构使之不断改善自身。简单一点说,就是计算机从数据中学习出规律和模式,以应用在新数据上做预测的任务。近年来互联网数据大爆炸,数据的丰富度和覆盖面远远超出人工可以观察和总结的范畴,而机器学习的算法能指引计算机在海量数据中,挖掘出有用的价值,也使得无数学习者为之着迷。

二、解决的问题
  1. 分类问题(有限个类别)

    • 垃圾邮件分类
    • 文本情感分类
    • 图像内容识别
  2. 回归问题

    • 电影票房预测
    • 房价预测
  3. 聚类问题(相近\相关的样本抱团)

    • 用户群体划分
    • 电影划分
    实际应用
  4. 计算机视觉

    • 人脸识别车牌识别扫描文字
  5. 自然语言处理

    • 搜索引擎匹配文本理解文本情绪判断
  6. 社会网络分析

    • 用户画像欺诈作弊发现、热点发现
  7. 产品推荐

    • 音乐的”歌曲推荐“、某宝/某东的“商品推荐”
阅读全文 »

使用 TensorFlow 的基本步骤

学习目标:

  • 学习基本的 TensorFlow 概念
  • 在 TensorFlow 中使用 LinearRegressor 类并基于单个输入特征预测各城市街区的房屋价值中位数
  • 使用均方根误差 (RMSE) 评估模型预测的准确率
  • 通过调整模型的超参数提高模型准确率

数据基于_加利福尼亚州 1990 年的人口普查数据_。

1. 设置

阅读全文 »