tonglin0325的个人主页

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
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
59
60
61
import java.util.Arrays;

class Arrays_Insert{
private int[] arrays;
private int curNum;

public Arrays_Insert(int max) { //建立一个max长度的空数组
super();
arrays = new int[max];
curNum = 0;
}

public void insert(int value){ //往空的数组里面增加元素
arrays[curNum] = value;
curNum++;
}

public void display(){ //显示数组
System.out.println(Arrays.toString(arrays));
}

private void swap(int one,int two){ //交换
int temp = arrays[one];
arrays[one] = arrays[two];
arrays[two] = temp;
}

public void InsertSort(){
int out,in;

for(out=1;out<curNum;out++){ //从第2个开始,和第1个比较
int temp = arrays[out];
in = out;                        //in等于out,比较从in-1开始
while(in>0 &amp;&amp; arrays[in-1] >= temp){ //如果大于temp,就往右移动
arrays[in] = arrays[in-1];        例如:2 3 1 temp=1 -> 2 3 3 temp=1 -> 2 2 3 temp=1 -> 1 2 3 temp=1
--in;
}
arrays[in] = temp;
}
}

}

public class Insert_Sort {

public static void main(String[] args) {
// TODO 自动生成的方法存根
int maxSize = 100;
Arrays_Insert arrays_demo = new Arrays_Insert(maxSize);
arrays_demo.insert(58);
arrays_demo.insert(57);
arrays_demo.insert(56);
arrays_demo.insert(60);
arrays_demo.insert(59);
arrays_demo.display();
arrays_demo.InsertSort();
arrays_demo.display();
}

}

全文 >>

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
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
59
60
61
62
63
64
class PriorityQueue{
private int maxSize; //队列的长度
private long[] queueArray; //创建队列的数组的引用
private int curNum; //创建当前元素的个数

public PriorityQueue(int s) { //构造函数
this.maxSize = s;
queueArray = new long[maxSize]; //创建对象
curNum = 0; //当前的元素的个数是0
}

public void insert(long item){
int j;
if(curNum == 0){ //输入1个数,就是1个数
queueArray[curNum++] = item;
}else{ //左边是rear,右边是front,左边总比右边大
for(j=curNum-1;j>=0;j--){ //当有2个数时,若第2个数比第1个数大,则交换
if(item>queueArray[j]){ //j在-1的时候停止,rear=0,front=curNum-1
queueArray[j+1] = queueArray[j]; // 1 2 -> 1 1 -> 2 1
}else{break;} // 2 1 3 -> 2 1 1 -> 2 2 1 -> 3 2 1
}
queueArray[j+1] = item;
curNum++;
}

}

public long remove(){
return queueArray[--curNum];
}

public long peekFront(){
return queueArray[curNum-1];
}

public boolean isEmpty(){
return (curNum==0);
}

public boolean isFull(){
return (curNum==maxSize);
}


}

public class PriorityQueue_demo {

public static void main(String[] args) {
// TODO 自动生成的方法存根
PriorityQueue queue_demo = new PriorityQueue(5);
queue_demo.insert(30);
queue_demo.insert(10);
queue_demo.insert(50);
queue_demo.insert(40);
queue_demo.insert(20);
while( !queue_demo.isEmpty()){
long value = queue_demo.remove();
System.out.println(value+"、");
}
}

}

全文 >>

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
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
59
60
61
62
63
64
65
66
67
68
69
class Queue{
private int maxSize; //队列的长度
private long[] queueArray; //创建队列的数组的引用
private int front; //创建队头的引用
private int rear; //创建队尾的引用
private int curNum; //创建当前元素的个数

public Queue(int s) { //构造函数
this.maxSize = s;
queueArray = new long[maxSize]; //创建对象
front = 0; //队头等于0
rear = -1; //队尾等于-1
curNum = 0; //当前的元素的个数是0
}

public void insert(long j){
if(rear == maxSize-1){ //如果队尾是队列的最大值-1,则队尾等于-1
rear = -1;
}
queueArray[++rear] = j; //先自加为0,然后给队尾的元素赋值
curNum++; //当前的元素的个数加1
}

public long remove(){
long temp = queueArray[front++]; //取得队头的元素,然后自加
if(front == maxSize){
front =0;
}
curNum--; //当前的元素的个数减1
return temp;
}

public long peekFront(){
return queueArray[front];
}

public boolean isEmpty(){
return (curNum==0);
}

public boolean isFull(){
return (curNum==maxSize);
}

public int Size(){ //返回当前队列元素的个数
return curNum;
}

}

public class Queue_demo {

public static void main(String[] args) {
// TODO 自动生成的方法存根
Queue queue_demo = new Queue(5);
queue_demo.insert(50);
queue_demo.insert(60);
queue_demo.insert(70);
queue_demo.insert(80);
queue_demo.remove();
queue_demo.insert(50);

while( !queue_demo.isEmpty()){
long value = queue_demo.remove();
System.out.print(value+"、");
}
}
}

全文 >>

SpringBoot学习笔记——filter和interceptor

Servlet API中提供了一个Filter接口,Filter接口在javax.servlet.Filter包下面。开发web应用时,如果编写的Java类实现了这个接口,则把这个java类称之为过滤器Filter

通过Filter技术,开发人员可以实现用户在访问某个目标资源之前,对访问的请求和响应进行拦截,如下所示:

WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能。

例如实现URL级别的权限访问控制、乱码问题过滤敏感词汇压缩响应信息等一些高级功能。

filter在开发中的常见应用:

全文 >>

广告系统当中的ID

在广告系统当中,ID是标识用户比较重要的手段,

1.安卓端

AdID:又称为Google advertising ID,海外安卓平台常用的设备标识符,每一台 Android设备都会被分配一个唯一的标识符,海外安卓平台的广告投放归因也主要依赖AdID。在国内,因google play在大陆地区无法使用,故google推动的adid也无法使用。且在android12开始,所有在设备设置中选择退出个性化广告的用户,其广告 ID 会变为一串零 (0),这将会影响android广告的归因。参考:移动广告流量中那些ID的坑Google 宣布移除限制广告跟踪用户的安卓广告 ID

IMEI(International Mobile EquipmentIdentity,移动设备国际识别码,又称为国际移动设备标识),即手机的卡槽号ID,可见这种ID是用户无法关闭或重置的,严格意义上来说在个人信息隐私保护方面存在不合规的高风险,所以采集时要经过用户的授权同意,存储使用时也一定要进行加密处理(MD5摘要加密),匿名化处理。也正是IMEI对个人信息隐私保护方面存在不合规性的高风险,所以从Android Q 开始,IMEI等ID的获取将受到非常大的安全限制,需用户每次授权。故国产手机纷纷开始推广OAID体系。参考:穿山甲——如何获取设备ID

OAID:OAID全称是Open Anonymous Device Identifier,中文名是匿名设备标识符。 OAID是一种非永久性设备标识符,最长64位,在系统首次启动的时候生成。 因此OAID可在保护用户个人数据隐私安全的前提下,用于向用户提供个性化广告,用户统计,同时三方监测平台也可以向广告主提供转化归因分析。支持OAID的条件:1)安卓设备系统版本10及以上; 2)设备品牌:HUAWEI/OPPO/VIVO/XIAOMI

ANID:ANDROID_ID android设备的唯一识别码,在设备首次启动时,系统会随机生成一个64位的数字,并把这个数字以16进制字符串的形式保存下来,这个16进制的字符串就是ANDROID_ID,当设备被wipe后该值会被重置。

2.IOS端

IDFA:IOS系统下的广告流量主ID相对于Android的情况要好很多了,基本统一使用IDFA(Identifier For Advertising)

全文 >>