HDFSAPI

HDFS文件上传

  1. Java代码
    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
    public void putFileToHDFS() throws URISyntaxException, IOException, InterruptedException {

    //1、创建配置信息对象

    Configuration conf = new Configuration();//hjhj

    //2、设置部分参数
    conf.set("dfs.replication","2");

    //3、找到HDFS地址
    //final URI uri, final Configuration conf, String user
    FileSystem fs = FileSystem.get(new URI("hdfs://vmaster:9000"), conf, "root");

    //4、上传本地文件路径
    Path src = new Path("F:\\Course\\aliyun\\transaction_details.csv");

    //5、要上传的HDFS的路径
    Path dest = new Path("hdfs://vmaster:9000/");

    //6、以拷贝的方式上传,从src -> dest
    fs.copyFromLocalFile(src,dest);

    //7、关闭
    fs.close();

    //
    System.out.println("OK了");
    }

环境配置

maven环境配置

位置在于下载好的maven目录下apache-maven-3.5.2\conf

  1. 更改本地库位置(防止C盘撑爆)搜索即可找到
    1
    <localRepository>D:\Repository</localRepository>
  2. 换阿里云镜像(加速下载)在mirrors下
    1
    2
    3
    4
    5
    6
    <mirror>
    <id>nexus-aliyun</id>
    <mirrorOf>*</mirrorOf>
    <name>Nexus aliyun</name>
    <url>http://maven.aliyun.com/nexus/content/groups/public</url>
    </mirror>
  3. 配置JDK版本,profiles下
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <profile>
    <id>jdk18</id>
    <activation>
    <jdk>1.8</jdk>
    <activeByDefault>true</activeByDefault>
    </activation>
    <properties>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
    <maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
    </properties>
    </profile>
  4. 配置环境变量
    文件夹->此电脑右键->属性->高级系统设置->环境变量->新建系统环境变量

  5. IDEA中的Maven配置

CentOS配置

连网配置

防火墙

  • 关闭防火墙:systemctl stop firewalld.service
  • 禁用防火墙:systemctl disable firewalld.service
  • 查看防火墙:systemctl status firewalld.service
1
2
关闭Selinux:vi /etc/selinux	/config
将SELINUX=enforcing改为SELINUX=disabled

软件测试方法

等价类划分

属于黑盒测试,它将不能穷举的测试过程进行分类,从而保证完整性和代表性;思考步骤:

  1. 确定有效等价类和无效等价类
  2. 有效等价类划分(题目条件,还要注意边界值(极值),中间甲堕意找个值)
  3. 无效等价类划分(跟有效等价类相反,其他特殊的情况【中文、英文、特殊符号、空格、空】)

注意: 两个框要一个正确,一个错误,这样才能准确的判断;一定要根据需求来判断预期结

创建型设计模式

单例模式

单例设计模式介绍

所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法(静态方法)。
比如Hibernate的SessionFactory,它充当数据存储源的代理,并负责创建Session对象。 SessionFactory并不是轻量级的,一般情况下,一个项目通常只需要一个SessionFactory就够,这是就会使用到单例模式。

1
2
3
4
5
6
7
8
9
单例模式有八种方式:
1) 饿汉式(静态常量)
2) 饿汉式(静态代码块)
3) 懒汉式(线程不安全)
4) 懒汉式(线程安全,同步方法)
5) 懒汉式(线程安全,同步代码块)
6) 双重检查
7) 静态内部类
8) 枚举

饿汉式(静态常量)

  1. 构造器私有化
  2. 类的内部创建对象
  3. 向外暴露一个静态的公共方法
    1
    2
    3
    4
    5
    6
    7
    8
    class Singleton {
    private Singleton() {
    }
    private final static Singleton instance = new Singleton();
    public static Singleton getInstance() {
    return instance;
    }
    }

优缺点说明:

  1. 优点:这种写法比较简单,就是在类装载的时候就完成实例化。避免了线程同步问题。
  2. 缺点:在类装载的时候就完成实例化,没有达到Lazy Loading的效果。如果从始至终从未使用过这个实例,则会造成内存的浪费
  3. 这种方式基于classloder机制避免了多线程的同步问题,不过, instance在类装载时就实例化,在单例模式中大多数都是调用getInstance方法, 但是导致类装载的原因有很多种, 因此不能确定有其他的方式(或者其他的静态方法)导致类装载,这时候初始化instance就没有达到lazy loading的效果
  4. 结论:这种单例模式可用, 可能造成内存浪费

饿汉式(静态代码块)应用实例

1
2
3
4
5
6
7
8
9
10
11
12
class Singleton {
private Singleton() {
}

private static Singleton instance;
static {
instance = new Singleton();
}
public static Singleton getInstance() {
return instance;
}
}

优缺点说明:

1) 这种方式和上面的方式其实类似,只不过将类实例化的过程放在了静态代码块中,也是在类装载的时候,就执行静态代码块中的代码,初始化类的实例。优缺点和上面是一样的。
2) 结论: 这种单例模式可用,但是可能造成内存浪费

懒汉式(线程不安全)

1
2
3
4
5
6
7
8
9
10
11
12
class Singleton {
private static Singleton instance;

private Singleton() {}

public static Singleton getInstance() {
if(instance == null) {
instance = new Singleton();
}
return instance;
}
}

优缺点说明:

1) 起到了Lazy Loading的效果,但是只能在单线程下使用。
2) 如果在多线程下,一个线程进入了if (singleton == null)判断语句块,还未来得及往下执行,另一个线程也通过了这个判断语句,这时便会产生多个实例。所以在多线程环境下不可使用这种方式
3) 结论:在实际开发中,不要使用这种方式

懒汉式(线程安全,同步方法)

1
2
3
4
5
6
7
8
9
10
class Singleton {
private static Singleton instance;
private Singleton() {}
public static synchronized Singleton getInstance() {
if(instance == null) {
instance = new Singleton();
}
return instance;
}
}

优缺点说明:

1) 解决了线程不安全问题
2) 效率太低了,每个线程在想获得类的实例时候,执行getInstance()方法都要进行同步。而其实这个方法只执行一次实例化代码就够了,后面的想获得该类实例,直接return就行了。方法进行同步效率太低
3) 结论: 在实际开发中, 不推荐使用这种方式

懒汉式(线程安全,同步代码块)

1
2
3
4
5
6
7
8
9
10
11
12
class Singleton {
private static Singleton instance;
private Singleton() {}
public static synchronized Singleton getInstance() {
if(instance == null) {
synchronized (Singleton.class) {
instance = new Singleton();
}
}
return instance;
}
}

优缺点说明:

1) 这种方式,本意是想对第四种实现方式的改进,因为前面同步方法效率太低,改为同步产生实例化的的代码块
2) 但是这种同步并不能起到线程同步的作用。跟第3种实现方式遇到的情形一致,假如一个线程进入了if (singleton == null)判断语句块,还未来得及往下执行,另一个线程也通过了这个判断语句,这时便会产生多个实例
3) 结论:在实际开发中, 不能使用这种方式

双重检查

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Singleton {
private static volatile Singleton instance;
private Singleton() {}
public static Singleton getInstance() {
if(instance == null) {
synchronized (Singleton.class) {
if(instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}

volatile关键字在Java中,实现变量共享,当一个变量被多个线程使用时,且有一个线程修改,会立刻刷新到主存中,已达到数据同步的效果

优缺点说明:

1) Double-Check概念是多线程开发中常使用到的, 如代码中所示,我们进行了两次if (singleton == null)检查,这样就可以保证线程安全了。
2) 这样,实例化代码只用执行一次,后面再次访问时,判断if (singleton == null),直接return实例化对象,也避免的反复进行方法同步.
3) 线程安全;延迟加载;效率较高
4) 结论:在实际开发中,推荐使用这种单例设计模式

静态内部类

1
2
3
4
5
6
7
8
9
10
class Singleton {
private static Singleton instance;
private Singleton() {}
private static class SingletonInstance {
private static final Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance() {
return SingletonInstance.INSTANCE;
}
}

优缺点说明:

1) 这种方式采用了类装载的机制来保证初始化实例时只有一个线程。
2) 静态内部类方式在Singleton类被装载时并不会立即实例化,而是在需要实例化时,调用getInstance方法,才会装载SingletonInstance类,从而完成Singleton的实例化。
3) 类的静态属性只会在第一次加载类的时候初始化,所以在这里, JVM帮助我们保证了线程的安全性,在类进行初始化时,别的线程是无法进入的。
4) 优点:避免了线程不安全,利用静态内部类特点实现延迟加载,效率高
5) 结论:推荐使用

枚举

1
2
3
4
5
enum Singleton {
public void sayHello() {
System.out.println("Hello");
}
}

优缺点说明:

1) 这借助JDK1.5中添加的枚举来实现单例模式。不仅能避免多线程同步问题,而且还能防止反序列化重新创建新的对象
2) 这种方式是Effective Java作者Josh Bloch 提倡的方式
3) 结论:推荐使用

单例模式在JDK中的应用

我们JDK中, java.lang.Runtime就是经典的单例模式(饿汉式)

单例模式注意事项和细节说明

1) 单例模式保证了 系统内存中该类只存在一个对象,节省了系统资源,对于一些需要频繁创建销毁的对象,使用单例模式可以提高系统性能
2) 当想实例化一个单例类的时候,必须要记住使用相应的获取对象的方法,而不使用new
3) 单例模式使用的场景:需要频繁的进行创建和销毁的对象创建对象时耗时过或耗费资源过多(即:重量级对象), 但又经常用到的对象、工具类对象、频繁访问数据库或文件的对象(比如数据源、 session工厂等)

Java设计模式之设计模式七大原则

单一职责原则

基本介绍

对类来说的,即一个类应该只负责一项职责。如类A负责两个不同职责:职责1,职责2。
当职责1需求变更而改变A时,可能造成职责2执行错误, 所以需要将类A的粒度分解为A1, A2

Java设计模式面试题

  1. 有请使用UML类图画出原型模式核心角色
  2. 原型设计模式的深拷贝和浅拷贝是什么,并写出深拷贝的两种方式的源码(重写
    clone方法实现深拷贝、 使用序列化来实现深拷贝)
  3. 在Spring框架中哪里使用到原型模式,并对源码进行分析

    beans.xml

    1
    <bean id="id01" class="com.atguigu.spring.bean.Monster" scope="prototype"/>

56. Merge Intervals

56. Merge Intervals

题目

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
  public int[][] merge(int[][] a) {
//1. 先去除a为空的情况
if(a.length==0)return new int[][]{};
Integer[][] intervals = new Integer[a.length][a[0].length];
//2. 为了方便排序,将其转换为Integer数组
cpy(a, intervals);

//3. 排序
Arrays.sort(intervals, new Comparator<Integer[]>() {

@Override
public int compare(Integer[] x, Integer[] y) {
if(x[0] < y[0]){
return -1;
} else if(x[0] > y[0]){
return 1;
} else {
return 0;
}
}

});
//4. 遍历查找是否相交
ArrayList<Integer[]> list = new ArrayList<>();
for(int i=0;i<intervals.length;i++) {
int j = i;
Integer[] tIntegers = new Integer[2];
tIntegers[0] = intervals[i][0];
tIntegers[1] = intervals[i][1];
//有相交的情况
while(i+1<=intervals.length-1&&intervals[i+1][0]<=tIntegers[1]) {
if(intervals[i+1][1]>tIntegers[1]) {
tIntegers[1] = intervals[i+1][1];
}
i++;
}

list.add(tIntegers);
}
//5. 转换为int[][]返回
int[][] res = new int[list.size()][2];
for(int i=0;i<list.size();i++) {
Integer[] integers = list.get(i);
res[i][0] = integers[0];
res[i][1] = integers[1];
}
return res;
}

Leetcode/55. Jump Game

55. Jump Game

题目

解题思路

  1. 判断是否到达或者不能到达
  2. 继续遍历
    1. 如果当前位置到当前位置可到达最远位置之间,所有点都满足这种情况,就跳到可以跳到的最远位置
    2. 不满足,则找最后一个满足的点,这点就是下一步的点
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Solution {
public boolean canJump(int[] nums) {
return jump(nums, 0);
}
private boolean jump(int[] nums, int current) {

if(current+nums[current]>=nums.length-1) {
return true;
}
if(nums[current]==0)return false;
//找最大
int maxi = current+1;
while(maxi+nums[maxi]<current+nums[current])maxi++;

if(maxi<current+nums[current]) {
return jump(nums, maxi);
}else {
return jump(nums, current+nums[current]);
}
}

}

54. Spiral Matrix

54. Spiral Matrix

题目

解题思路

直接模拟

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
class Solution {
public List<Integer> spiralOrder(int[][] matrix) {
ArrayList<Integer> list = new ArrayList<>();

int i=0,j=0;
int n=matrix.length;
if(n==0)return list;
int m = matrix[0].length;
int cnt = 0,loop=0;
while(cnt<m*n) {
while(cnt<n*m&&j<m-loop) {
list.add(matrix[i][j]);
cnt++;
j++;
}

j--;
i++;

while(cnt<m*n&&i<n-loop) {
list.add(matrix[i][j]);

i++;
cnt++;
}

i--;
j--;

while(cnt<m*n&&j>=loop) {
list.add(matrix[i][j]);
cnt++;
j--;
}
j++;
i--;

while(cnt<m*n&&i>loop) {
list.add(matrix[i][j]);
i--;
cnt++;
}
i++;
j++;
loop++;
//System.out.println(list);
}

return list;

}
}

整理后

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
  public List<Integer> spiralOrder(int[][] matrix) {
ArrayList<Integer> list = new ArrayList<>();

int i=0,j=0;
int m=matrix.length;
if(m==0)return list;
int n = matrix[0].length;
int cnt = 0,loop=0;
while(cnt<m*n) {
i=loop;
j=loop;
for(int k=j; k<n-loop;k++,cnt++) {
list.add(matrix[i][k]);
}
j += n-loop-1;

for(int k=i+1;k<m-loop;k++,cnt++) {
list.add(matrix[k][j]);
}
i += m-loop-1;
for(int k=j-1; k>=loop;k--,cnt++) {
list.add(matrix[i][k]);
}
j = loop;
for(int k=i-1;k>loop;k--,cnt++) {
list.add(matrix[k][j]);
}

loop++;
//System.out.println(list);
}

return list;

}

直接使用一个循环

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
  public List<Integer> spiralOrder(int[][] matrix) {
ArrayList<Integer> list = new ArrayList<>();

int i=0,j=0;
int m=matrix.length;
if(m==0)return list;
int n = matrix[0].length;

int[][] dirs = {{0,1},{1,0},{0,-1},{-1,0}};
int idx = 0;
for(int k=0;k<m*n;k++) {

list.add(matrix[i][j]);
matrix[i][j] = 1000;
int x = i + dirs[idx][0];
int y = j + dirs[idx][1];
if(x<0 || y<0 || x>=m || y>=n || (matrix[x][y]^1000)==0) {
idx = (idx + 1)%4;
x = i + dirs[idx][0];
y = j + dirs[idx][1];
}
i=x;
j=y;
}

return list;

}
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×