我的工作笔记:

JAVA:
1.哈希表为数组加链表结构,把hashcode放入数组初始化的16个“桶”中,当链表超过8位时转变为红黑树,提高查询效率,map也是数组加链表结构,先通过key的hashcode找到数组的index,再通过key的equals再链表中得到value。
2.hashset中使用add方法时,会根据equals和hashcode判断元素是否相同,所以在使用hashset存储元素时需要重写hashcode和equals方法来保证元素唯一性。
3.new String(“a”)中做了2步操作:在堆中new一个新对象,把地址给栈里的元素,并在常量池中建立此string,方便下次调用。
java集合排序
实现comprable接口,重写compareTo方法.用collection调用
或者传new Comparator()重写
4.hashcode不同,2个元素肯定不相同,hashcode相同,再判断equals是否相同。
5.对于Map里面的键和值是否可以为空的问题,答案是:不一定。对于HashMap来说,可以存放null键和null值,而HashTable则不可以。HashTable是线程安全,方法上添加了synchronized同步修饰,HashMap非线程安全
Collections.synchronizedSet(Sets.newHashSet())是set的安全集合
6.编译行异常必须处理,运行时异常可处理可不处理。
7.子类重写父类方法时抛出的异常必须比父类的少。
8. 自定义异常解析:

  public class BizException extends Exception {
    // 定义版本id
    private static final long serialVersionUID = 1L;
    // 异常id
    private String exceptionID = "";
    // 错误代码
    private String errorCode = "";
    // 异常等级枚举类
    private ExceptionLevel exceptionLevel;
    // 内部异常
    private Exception innerException;
    // 跟踪id
    private String trackID;
    // 方法
    private String method;
    // 应用名
    private String applicationName;
    // 服务id
    private String serviceID;

    public String getTrackID() {
        return this.trackID;
    }

    public String getMethod() {
        return this.method;
    }
   // 得到栈追踪信息
    public String getStackTraceString() {
        String s = "";
        StringWriter sw = new StringWriter();
        this.printStackTrace(new PrintWriter(sw));
        s = sw.toString().replaceFirst(this.getMessage(), "["   this.errorCode   "]"   this.getMessage());
        if (this.innerException != null) {
            if (this.innerException.getClass().equals(SysException.class)) {
                s = s   ((SysException)this.innerException).getStackTraceString();
            } else {
                sw = new StringWriter();
                this.innerException.printStackTrace(new PrintWriter(sw));
                s = s   sw.toString();
            }
        }

        return s;
    }

    public String getExceptionID() {
        return this.exceptionID;
    }

    public String getErrorCode() {
        return this.errorCode;
    }

    protected void setErrorCode(String errorCode) {
        this.errorCode = errorCode;
    }

    public Exception getInnerException() {
        return this.innerException;
    }

    public String getApplicationName() {
        return this.applicationName;
    }

    public String getServiceID() {
        return this.serviceID;
    }

    public ExceptionLevel getExceptionLevel() {
        return this.exceptionLevel;
    }

    public BizException(String trackID, String method, ExceptionLevel exceptionLevel, Exception e, String message, String... paras) {
        super(message);
        this.exceptionLevel = ExceptionLevel.Error;
        this.innerException = null;
        this.trackID = "";
        this.method = "";
        this.applicationName = "";
        this.serviceID = "";
        this.exceptionID = KeyIDFactory.INSTANCE.NewKeyID("LogDB", "LogException");
        this.errorCode = this.errorCode;
        this.exceptionLevel = exceptionLevel;
        this.innerException = e;
        this.trackID = trackID;
        this.method = method;
    }

    public BizException(String trackID, String method, String message, Exception e) {
        super(message);
        this.exceptionLevel = ExceptionLevel.Error;
        this.innerException = null;
        this.trackID = "";
        this.method = "";
        this.applicationName = "";
        this.serviceID = "";
        this.exceptionID = KeyIDFactory.INSTANCE.NewKeyID("LogDB", "LogException");
        this.trackID = trackID;
        this.innerException = e;
        this.exceptionLevel = ExceptionLevel.Error;
        this.method = method;
        this.writeLog();
    }

    public void writeLog() {
        ILogger loggerException = LogFactory.getLoggerException();
        ExceptionLog logO1 = (ExceptionLog)loggerException.getLog();
        logO1.setException(this);
        loggerException.log();
    }
}

9.controller层默认为单列模式
10.多线程安全问题是因为有该线程失去cpu执行权,却已经进入判断条件而出现的错误。单列模式是把构造方法私有化。
11.volatile保证了线程的可见性,有序性(保证操作不能被打断),但不能保证原子性(要么全部失败,要么全部成功),要保证原子性,可以加锁,用原子类。
12.同步非静态方法的锁对象是当前对象,静态方法时当前对象的字节码对象,锁的原理,给共享资源加一个锁,没有线程访问时,锁就是空的,别的线程访问就等着,是同步的,与乐观锁相比减少了不必要的请求,但会出现死锁,可以像zk一样设置过期时间解决。
13.线程池的使用

    // 获取线程池
    ExecutorService executorService = Executors.newFixedThreadPool(2);
    // 创建线程任务,用线程池得到线程执行
    executorService.submit(()-> System.out.println(1));

14.常用的几种线程池
(1).newCachedThreadPool
创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
(2).newFixedThreadPool
创建一个指定工作线程数量的线程池。每当提交一个任务就创建一个工作线程,如果工作线程数量达到线程池初始的最大数,则将提交的任务存入到池队列中。
(3)newSingleThreadExecutor
创建一个单线程化的Executor,即只创建唯一的工作者线程来执行任务,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。如果这个线程异常结束,会有另一个取代它,保证顺序执行。
(4)newScheduleThreadPool
创建一个定长的线程池,而且支持定时的以及周期性的任务执行,支持定时及周期性任务执行。
15.怎么限制下载速度?
16.file类能够封装电脑上的文件和文件夹并对其操作
11.同步异步,阻塞非阻塞
我的理解: 普通soket中,一个用户需要等待服务器相应返回才能操作,并且多个用户得相互等待(同步阻塞),
加了多线程后,单个用户不用等待别的用户完成,但是自己必须等待自己的响应完成,单线程实现并发也是如此
(同步非阻塞)
aio是不用得带响应完成,肯定是不阻塞的。
(异步非阻塞)
(1) File 抽象、输入输出流,Socket、ServerSocket、HttpURLConnection等。交互方式是同步、阻塞的方式
(2)在 Java 1.4 中引入了 NIO 框架(java.nio 包),提供了 Channel、Selector、Buffer 等新的抽象,可以构建多路复用的、同步非阻塞 IO 程序,同时提供了更接近操作系统底层的高性能数据操作方式
(3)在 Java 7 中,NIO 有了进一步的改进,也就是 NIO 2,引入了异步非阻塞 IO 方式,也有很多人叫它 AIO(Asynchronous IO)
12.反射:将类的各个组成部分封装成其他对象
java的几个阶段:
硬盘上:源代码阶段(字节码文件) ----- 类加载器加载进内存(类对象) ----- 运行时阶段。
13.jdk中预定义的一些注解
@override: 重写
@deprecated 已过时
@surpressWarning 压制警告
注解格式:
元注解
public @interface name{}
本质上就是一个接口,改接口默认集成Annotation
四个元注解:
@Inherited
@Documented
@Retention
@Target
14. jdbc操作顺序
(1) 引包
(2) 注册驱动
(3) 获取连接对象
(4) 写sql
(5) 操作结果集
15.静态代理
代理一个类就必须写一个代理类
16.动态代理
对接口的类实现拦截加强,没有接口的类就没办法
17.cglib代理
JDK实现动态代理需要实现类通过接口定义业务方法,对于没有接口的类,如何实现动态代理呢,这就需要CGLib了。CGLib采用了非常底层的字节码技术,其原理是通过字节码技术为一个类创建子类,并在子类中采用方法拦截的技术拦截所有父类方法的调用,顺势织入横切逻辑。但因为采用的是继承,所以不能对final修饰的类进行代理。JDK动态代理与CGLib动态代理均是实现Spring AOP的基础。
加载spring容器,加载代理类,加载切面类
18.我的项目的登录逻辑:
用户访问登录网关,用accessFilter去记录登录人的方法和uri
用权限认证过滤器识别请求头里的token这个值是否存在,并且在redis是否存在,如果存在,那么写入用户信息
19.@Configuration启动容器 @Bean注册Bean,@Bean作用在方法上,把返回值注册进容器中
20.springmvc工作原理,先拦截所有请求,在用映射器找到控制器,再根据适配器来决定怎么调用控制器,是否生成modalandview
21.mysql中on和where2个地方写条件的不同
右表先通过on后面的过滤条件返回结果集为临时表,再将临时表和左表联合查询返回结果集。
22.You can’t specify target table for update in FROM clause错误的意思是说,不能先select出同一表中的某些值,再update这个表(在同一语句中)
23.每一个派生出来的表都必须有一个自己的别名
24.application/x-www-form-urlencoded
它是post的默认格式,将非ascii字符做百分号编码;将input的name、value用‘=’连接,不同的input之间用‘&’连接。
multipart/form-data
既可以上传键值对,也可以上传文件
25.Collections.sort可对里面元素排序,如果有对象实现comprable接口排序
26.连接查询中on和where的区别
其实以上结果的关键原因就是left join,right join,full join的特殊性,不管on上的条件是否为真都会返回left或right表中的记录,full则具有left和right的特性的并集。 而inner jion没这个特殊性,则条件放在on中和where中,返回的结果集是相同的。
27.线程分为守护线程(后台线程)和用户线程(前台线程),主线程挂了,守护线程也会被停止掉,设置该线程为守护线程setDaemon()
28.thread.join能先让此线程执行完毕后,才让其他线程有资格执行
29.线程的三大特性,原子性,可见性(当一个线程修改变量后,其他线程是马上可见的),有序性
30.java内存结构:堆栈方法区
31.java内存模型,每一个线程都有一个本地内存区,在对共享变量进行操作时如果不能立即通知其他线程,则会出现多线程安全问题
32.vue. n e x r T i c k 的 用 法 t h i s . v a l u e = ′ 你 好 啊 ′ ; c o n s o l e . l o g ( t h i s . nexrTick的用法 this.value = '你好啊'; console.log(this. nexrTickthis.value=;console.log(this.refs[‘hello’].innerText);
this.KaTeX parse error: Expected '}', got 'EOF' at end of input: …nsole.log(this.refs[‘hello’].innerText);
});
33.v-if和v-show都会执行所有钩子函数,但在切换时
v-if:
上一次渲染的组件销毁 符合条件的组件渲染
会依次执行 **beforeCreate(),created(),beforeMount(),beforeDestroy(),destroyed() mounted()**钩子函数
其中标黄的是上一个被销毁组件的两个钩子函数 (销毁前,销毁后)剩下的四个钩子函数是本次符合条件的组件的钩子函数
v-show:
切换时组件始终保持在 mounted()挂载完成 钩子函数
34.delete 和splice方法的区别
1)delete: 只是被删除的元素变成了 undefined 其他的元素的键值还是不变。
2) splice: 该方法会改变原始数组
35.reduce的用法
let b = a.reduce((total, v) => {
return total v;
}, 0);
36.vue中父组件传给子组件的值,子如果直接使用,值会随着父组件值的变化而变化,但是子组件不能对该值进行写操作,如果要求写操作,在子组件中用本地文件接收,如果需要实时变化,就需要监听,其实用.sync就能达到效果。
37.原子类和同步锁可以保证原子性和可见性,volite保证可见性和有序性
38.threadLocal实现原理:把当前线程当做key存进map,跟值相对应
39.单列模式为什么要加volatile?
因为在双重校验情况下,如果判断为空会直接返回空对象,但这个时候并没有实例化。
40.工厂模式:不用自己new,传名字
41.代理模式分为静态代理,jdk动态代理,chlib动态代理(后面2个不需要写代理类)
42.缓存框架的基础,封装map增加过期时间,定期清除过期数据
43.对于普通同步方法,锁是当前实例对象。
对于静态同步方法,锁是当前类的Class对象。
对于同步方法块,锁是Synchonized括号里配置的对象。
44.怎么防止表单重复提交
前端解决:请求失败和成功之后才能继续第二次点击
45.mybatis的一级缓存:基于sqlSession的,同一个sqlSession同一个语句会被缓存
46.声明式事务只有出异常时才会回滚,所以要在catch中手动回滚
47.redis做主从同步配置slaveof ip 端口号,配置哨兵文件为sentinel.conf
48.redis持久化:
rdb:以数据方式进行保存(默认rdb一段时间内修改了多少次)
aof:以日志方式保存(持续保存)
49.http之间怎么保证数据一致性?
可以用定时job每天检查发送失败的数据,重新发送,但是数据无法实时
可以用消息中间件
50.activemq使用
1.使用工厂类输入账号密码获取连接
2.开启连接
3.有链接获取session
4.由session获取队列,生产者,文本消息
消息事务开启,提交和消费都必须手动提交
51.如何保证mq的幂等性
都是为了保证mq不重复接收生产者的消息,在消费者消费完后保证mq正确删除消息
二、出现非幂等性的情况

1、生产者已把消息发送到mq,在mq给生产者返回ack的时候网络中断,故生产者未收到确定信息,生产者认为消息未发送成功,但实际情况是,mq已成功接收到了消息,在网络重连后,生产者会重新发送刚才的消息,造成mq接收了重复的消息

2、消费者在消费mq中的消息时,mq已把消息发送给消费者,消费者在给mq返回ack时网络中断,故mq未收到确认信息,该条消息会重新发给其他的消费者,或者在网络重连后再次发送给该消费者,但实际上该消费者已成功消费了该条消息,造成消费者消费了重复的消息;
三、解决办法

1、mq接收生产者传来的消息:

mq内部会为每条消息生成一个全局唯一、与业务无关的消息id,当mq接收到消息时,会先根据该id判断消息是否重复发送,mq再决定是否接收该消息。

2、消费者消费mq中的消息:

也可利用mq的该id来判断,或者可按自己的规则生成一个全局唯一id,每次消费消息时用该id先判断该消息是否已消费过。
52.vue中data为什么必须返回一个对象?因为组件被实例化后如果不返回一个对象,其中某一个实例改变了值其他的实例化都会被改变。
53.redis挂了怎么办?
先做主从同步,主服务器实现读写权限,2个从服务器分别实现读写权限,主服务器接受数据同步到从服务器,配置哨兵文件夹选举一个从服务器为主,并赋予权限,并用rdb或者aof保证数据。
54.nginx挂了怎么办?
做主从,用keepalived监听
55.分布式锁可以用redis和zk,都是把共享资源锁住,避免多个服务访问共享资源,最重要的是为了避免死锁,要设置过期时间。
56.java的内存模型
类加载器,方法区,堆,栈,本地方法栈
57.jvm调优
对于Java8来说,一般堆内存的初始容量为物理内存大小的1/64,最大内存不超过物理内存的1/4或1G
一般来说,初始内存与最大内存一致,因为申请内存浪费时间
设置内存新生代内存小,会导致gc频繁,影响效率,设置过大,会影响其他程序的使用。
新生代和老年代的比列,按持久对象的多少设置
jvm的新生代一般设置为整个堆的1/3或1/4
58.数据库三大范式
第一范式保证原子性
第二范式保证主键,消除部分依赖
第三范式去除冗余数据,消除传递依赖
59.唯一索引可以为空,主键索引必须满足唯一非空
60.只有使用%时才不会使用索引,联合索引只使用第一个会使用索引,用or不会使用索引
61.使用group by分组查询。默认分组后,还会排序,可能会降低速度。后面增加order by null就可以防止排序。
62.mysql主从复制,原理是从服务器连接主服务器,拿到二进制日志文件执行
63.const unwatch = this.$watch(“sicknessDict.length”, function(v) {
// 取消观察
unwatch();
}
64.ThreadLocal 与 Thread 同步机制的比较
同步机制采用了以时间换空间方式,通过对象锁保证在同一个时间,对于同一个实例对象,只有一个线程访问。

ThreadLocal 采用以空间换时间方式,为每一个线程都提供一份变量,各线程间同时访问互不影响。
65.js的数字转字符串,会去掉小数点最后的0
66.使用mq解决分布式事务,第一用本地消息表,第二roketmq本身自带事务,第三补偿。
67.图片的下载始终都要向服务器发出请求,要是图片的下载不用向服务器发出请求,而可以随着 HTML 的下载同时下载到本地那就太好了,而 base64 正好能解决这个问题。一般大图片不能做精灵图的图片以这样的方式,前端优化思想一般为减少请求,尽可能的一次请求把多个资源给客户端,单页面应用和cs架构应用(下载好存在本地)就是这一思想。
68.网页中引入的静态资源多了以后有什么问题?
1.网页加载速度慢,因为,我们要发起很多的二次请求
2.要处理错综复杂的依赖关系
如何解决上述两个问题
1.合并、压缩、精灵图、图片的base64编码
2.可以使用之前学过的requireJS、也可以使用webpack可以解决各个包之间的复杂依赖关系;
69.cnpm不会去识别package-lock.json,所以有时候用npm安装没问题,cnpm安装因为版本问题而报错。cnpm i xx 不会更新到package-lock.json,所以下载新的包用cnpm不会记录到package.json,别人无法重新下载安装。
70.webpack全局安装后,敲命令是调用本地版本,项目中用脚本使用的当前项目中的版本。我们是在项目中,本地安装的 webpack-dev-server,所以,无法把它当做脚本命令在 powershell 终端中直接运行;(只有那些安装在全局 -g 的工具,才能在终端中正常执行)如果要想正常运行,要求在本地项目中,必须安装 webpack,然后在package.json文件中的scripts节点上配置上 “dev”:
71.线程分为主线程,守护线程(gc线程,主线程挂掉,守护线程也会挂掉),非守护线程(用户增加创建的线程)。
72. Object.defineProperty(car, ‘price’, {
get(){
console.log(‘price属性被读取了’)
return val
},
set(newVal){
console.log(‘price属性被修改了’)
val = newVal
}
})
Object.defineProperties(obj, {
‘property1’: {
value: true,
writable: true
},
‘property2’: {
value: ‘Hello’,
writable: false
}
// etc. etc.
});
73.前端只能设置请求头,把前端发送的数据格式化,告诉后台发送的数据格式。
74.webpack对本项目打包,webpack-dev-server打虚拟包,html-webpack-plugin:我们不再需要手动处理 bundle.js 的引用路径了,因为这个插件,已经帮我们自动创建了一个合适的 script ,并且引用了正确的路径
75.Websocket是一个持久化的协议,相对于HTTP这种非持久的协议来说,Websocket是基于HTTP协议的,或者说借用了HTTP的协议来完成一部分握手
,客户端与服务端实现实时消息通讯可以使用ajax轮询或者一直等着服务器响应。其实就是,服务端不能主动联系客户端,只能有客户端发起。
76.commonjs
最基础的规范是CommonJS和AMD,CommonJS经node.js应运而生。es6模块化,是基于commonjs的再次封装,导入import,导出export。
1、定义模块
根据CommonJS规范,一个单独的文件就是一个模块。只需声明变量,导出即可
2、模块输出:module.export
3、加载模块:
加载模块使用require方法,该方法读取一个文件并执行,返回文件内部的module.exports对象
之后为了解决commonjs同步问题,不能用于浏览器端,所以AMD来解决这些问题,用define定义模块,用require引入即可使用
CMD也来解决这个问题,只是他们的运行机制不同,AMD是依赖前置,而CMD是就近依赖,两个都是异步加载模块。
77.缓存雪崩
redis里缓存数据同时集体过期,大量并发请求会打垮数据库
解决方案
缓存数据过期时间设置随机
设置永久不过期
缓存穿透
缓存数据库都没有数据
解决方案
做接口校验,拦截一部分明显不合法的请求
可以把这些取不到的数据设置短的缓存,防止直接访问数据。
缓存击穿
缓存没数据,数据库有数据,一般是缓存时间到期,可以设置热点数据永不过期,或者使用mq消峰。
78.
在这里插入图片描述
箭头函数让this永远指向本实例
73. 断点续传实质是文件拼接,一个英文字母占1个字节,汉字占2个字节
79.NIO.缓冲区(通常用bytebuffer),通道,io多路复用,选择器。缓冲区的limit是可用容量,读取后会变为读到的大小。缓冲区分为直接缓冲区 存放物理内存,非直接缓冲区,存放jvm内存,用直接缓冲区效率高,不用拷贝,但不安全
原生文件复制操作,流对象接收路径或者文件对象,创建一个数组读,循环里面写
nio复制方法,创建流,获取通道,创建缓冲区,接收通道里的数据,写到通道里
80.vuex的使用
首先全局注册vuex的store,在里以对象的形式放置数据,可以通过this. s t o r e . s t a t e . ∗ ∗ ∗ 直 接 获 取 也 可 以 通 过 t h i s . store.state.***直接获取 也可以通过this. store.state.this.store.getters.***获取,这种获取相当于computed
store里定义
getters: {
doneTodos: state => {
return state+1
}
}
可以返回一个函数调用传参
// 使用对象展开运算符将 getter 混入 computed 对象中
…mapGetters([
‘doneTodosCount’,
‘anotherGetter’,
// …
])
如果需要修改store中的值唯一的方法就是提交mutation来修改
store定义
// …
mutations: {
increment (state, payload) {
state.count += payload.amount
}
}
在页面的方法中调用
this.KaTeX parse error: Expected '}', got 'EOF' at end of input: …d()` 映射为 `this.store.commit(‘increment’)`
})
mutation 必须同步执行
官方并不介意我们这样直接去修改store里面的值,而是让我们去提交一个actions,用它来直接调用mutations
mutations: {
increment (state) {
state.count++
}
},
actions: {
increment (context) {
context.commit(‘increment’)
}
}
81.Service Worker,对比原生app,来实现离线访问,pwa是集合了多种web技术来让webapp有比拟原生应用最好的体验。
由以下几种技术构成:
App Manifest
Service Worker(最重要实现离线缓存,消息通知,添加到页面)
Notifications API
Push API
缓存,减少与服务器非必要的交互,不过对于离线的情况下浏览器缓存就无力了,
这样离线缓存的需求就出现了。
在vue中使用直接在主js中注册
82.BigDecimal的字符串构造函数不会丢失经度。
83.编码起初是为了加密,后面是为了传输标准
84.框架里用到的设计模式。
85.jvm常用算法.标记清除,标记压缩,复制
86.服务分布分级,分布式事务@traditionnoal的使用条件,mq的消息先后顺序机制(保证生产者mq消费者一对一对一就行了,限制异步发送,并发消费)。
87.(1)网络发送请求都是同步的,只不过开启了多个线程实现了伪异步。
(2)同步一般说的是直连形式,而阻塞一般对客户端一个请求而言,要等待别的请求完成,则是阻塞的,对于服务器而言,一直等待客户端发送消息,是阻塞的,但可以使用多线程让请求间不会相互等待,但是本质服务器得单个线程还是阻塞的,所以还可以使用通道去注册到选择器上,当数据准备完成后,选择器通知服务器,这样服务器就不用一直等待,这就是同步非阻塞,而选择器依然是同步的,可能会造成阻塞,如果选择器为异步通知,则变化为异步非阻塞。
88.mysql三表连接查询,条件写在最后面。
89.线程安全不针对对共享变量读,两个线程不可能同时获取锁。
90.scoket为长连接可以双工通信,http是短链接是tcp的封装,只能客户端访问服务器。
91.dubbo用序列化文件,用netty传输,@trasient不让序列化
92.序列化协议就是两边约定数据格式能解析。
93.socket发送数据和http发请求相比,http会把数据封装起来。
94.mq能否等一个消息消费后才发另外一条?mq消息有没有格式?mq怎么保证接受到消息的顺序
如果生产者,mq,消费者一对一对一,不会出现顺序问题
如果两条消息差个毫秒级别,顺序也不会改变
mq
95.java和js获取日期时间戳都是先转为date对象再调用getTime()
96. FileReader字符流,FileInputStream 字节输入流
在这里插入图片描述
InputStreamReader转字节流为字符流
下次要去文件路径就直接用字节码调getResourceAsStream()
97,java的find()方法在部分匹配时和完全匹配时返回true,匹配不上返回false;
matches()方法只有在完全匹配时返回true,匹配不上和部分匹配都返回false。
用group()方法可以得到截取的字符串,默认group(0)为整个表达式。
贪婪模式:匹配最长的匹配值
非贪婪模式:匹配最短的匹配值
加?是非贪婪模式
98.vue组件中,在style设置为scoped的时候,里面在写样式对子组件是不生效的,如果想让某些样式对所以子组件都生效,可以使用 /deep/ 深度选择器。如果不想全局污染,可以加class
99.引入js时,js有export才可以命名字,不然可以方法直接调用
100.包装类值比较时,必须用equals
101.字符串拼接调用了stringbuilder的append方法
102.promise封装了异步操作,异步操作被封装成

function test(resolve, reject) {
    var timeOut = Math.random() * 2;
    log('set timeout to: ' + timeOut + ' seconds.');
    setTimeout(function () {
        if (timeOut < 1) {
            log('call resolve()...');
            resolve('200 OK');
        }
        else {
            log('call reject()...');
            reject('timeout in ' + timeOut + ' seconds.');
        }
    }, timeOut * 1000);
}

async用来表示函数是异步的,定义的函数会返回一个promise对象,可以使用then方法添加回调函数。
把一个异步函数封装到一个函数,再把这个函数封装到promise中,再把这个promise封装到一个函数

function sleep(second, param) {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve(param);
        }, second);
    })
}

// 为了处理Promise.reject 的情况我们应该将代码块用 try catch 包裹一下

async function errorDemoSuper() {
    try {
        let result = await sleep(1000);
        console.log(result);
    } catch (err) {
        console.log(err);
    }
}

promise.all的用法

async function correctDemo() {
    let p1 = sleep(1000);
    let p2 = sleep(1000);
    let p3 = sleep(1000);
    await Promise.all([p1, p2, p3]);
    console.log('clear the loading~');
}

103.JSON转泛型使用new TypeReference<RpInfo>(){}
104:Set集合怎么实现线程安全?
方案一:
和list一样,使用Colletcions这个工具类syn方法类创建个线程安全的set.

Set synSet = Collections.synchronizedSet(new HashSet<>());
105:给map排序,先获取entryset然后通过arrylist的构造方法转为list,然后用Collections.sort给entryset集合排序
106.1. “==”

基本数据类型:

它们之间使用“==”比较,比较的是它们的值。

引用数据类型:

它们之间用“==”进行比较时,比较的是他们在内存中存放的地址(堆内存首地址);

equals的话默认和==一样,但是有些对象重写了此方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
《Core Java》介绍和我的课程计划 李冰Email: bing.li@asu.eduWeChat: libertymama2021年4月15日 这是我第一次通过录屏的方式讲授主流程序设计技术。从今年二月底至今,我已经录制了105讲52.5小时的视频课程。通过这段时间的工作,我认为借助互联网强大的传播能力,这种新型教育方式完全具备超越传统实体模式的巨大优势,一定会成为未来教育的发展趋势。我会积极投入到这项事业当中,尽我所能提供更多高质量在线教学课程。 一、本课程内容 本课程将以Cay Horstmann的经典著作《Core Java》(第11版,2019年)为蓝本面向广大程序设计爱好者以及专业人员讲授基础Java程序设计技术。对于主流程序设计语言的教学,教材的选用对教学效果具有决定意义。我虽然有大量Java语言开发经验,但并没有时间和精力按照我自己的理解写一部教材。在这种情况下,不妨在现有资料中做出恰当选择。在长期Java程序开发过程中,我收集的各种Java程序设计书籍超过50部。它们包括基础技术、设计模式、并发技术、数据处理、网络通信、性能优化、代码测试以及高级技巧等多个方面。通过对这些书籍的比较,我认为《Core Java》是全面介绍Java技术的经典教材。它篇幅宏大,对Java标准版(Java Standard Edition – JSE)大大小小各种问题做了细致入微的介绍。对学习者来说,它无疑是众多介绍Java基础技术书籍中的最佳选择。 为了方便学习者掌握本书,我对全书内容进行了摘要并编纂成幻灯片。在这个准备过程中,即使作为拥有大量程序设计经验的我来说,我也发现了我对一些细节认识的模糊,有的甚至从来没有接触过。事实上,这些细节对于我们提高程序质量是大有裨益的。作为基础程序设计技术的经典之作,本书除了有翔实完整的描述外,还包括大量具有充分说服力的程序示例。这体现了计算机科学作为当代最重要的科学分支之一所独有的理性诉求。为了使学习者更深入了解每一项技术,我还额外增添了很多程序示例,更加丰富了本课程的内容。这些示例使得全书所有论述都是建立在代码支持的基础上,成为学习Java程序设计技术最坚实的保证。 还有一点我需要说明的是,作为本课程的主讲者,我并不是简单地照本宣科。根据我的研发和教学经验,对程序设计这样一门复杂技术来说,主讲者以往和当前所从事的研发工作对讲课质量有着至关重要的影响。我会把我在研发中的实际体会融入在整个讲课过程中。对所有重要技术,除了清晰阐述原作者观念以外,我会提供我个人的评价供学习者参考;同时,我还会收集其他资料作为辅助,使得对特定技术的解释更加充分。通过多角度的观察体验,促使学习者全面透彻理解Java语言。我认为这种个性多元的教学方式是帮助大家掌握程序设计的关键所在。 由于本书的庞大容量,我还没有足够时间完成全书的录制。我会坚持完成所有课程,估计在六月中会完成第一卷全部十二章内容;在八月底完成第二卷的录制。保守估计,完成后全部幻灯片页数会超过3,000页;程序示例个数超过700个;全部代码程序会超过15,000行;全部视频课程时长至少会达到150小时,即300讲。当前,我已经完成本书第一卷前五章和第六章部分内容的录制,现在共有105讲(52.5小时)的视频,幻灯片达到1,222页。其中包括212个程序示例,共5,130行代码。在完成本书的全部录制之后,本课程将成为国内全网范围内时间最长和内容最丰富的Java基础技术视频教材。 当然,《Core Java》这本书也有它的不足。在全面覆盖Java标准版的同时,对一些重点问题的介绍深度上有欠缺。这对于一部力图囊括所有Java基础技术的教材来说也在所难免。为了弥补这个不足,我将在其他课程中予以弥补。这些课程也同样是基于知名经典著作进行介绍。我的初步计划涉及的著作包括:Steven John Metker的《Design Patterns Java Workbook》、Brian Goetz等的《Java Concurrency In Practice》、Elliotte Rusty Harold的《Java Network Programming》、Charlie Hunt和Binu John的《Java Performance》、Ira Forman和Nate Forman的《Java Reflection in Action》以及Maurice Naftalin和Philip Wadler的《Java Generic and Collections》。另外,我还计划把最新出版的其他重要英文程序设计专著在不侵犯版权的前提下,以视频方式呈现给大家。 二、本课程的理念 一项事业一定会有它的理想。程序设计的理想当然是能够完成伟大软件作品。 我们虽然都会在现实中不得不做出一些妥协,但理想总是唯一能够激发我们最大创造力的催化剂,它同样是带给我们最大快乐的源泉。我们也许在不断降低曾经的理想维度,但我们也同时都会在人生每一个寂静时刻扪心自问深刻反省。那些对我们自己灵魂发出的询问,就是我们不会屈服的个性展示。换句话说,面对理想时,我们自始自终都有来自内在天赋的支持。 当然,除了我们的天赋,为了理想,我们同样需要付出巨大的劳动。这些劳动不仅仅是学习和研发过程的坚持,更多的还是抵御外在环境对我们理想意想不到的干扰。其实,无论是否有那些干扰,在外人看来艰辛的劳动对于拥有理想的我们永远是最大的快乐。 对于程序设计来说,我个人伴着理想和辛勤劳动走了很长的路。即使如此,我只能说我对程序设计略知一二,甚至对做出高质量程序的解决之道还有些迷惑了。但我的这些付出,至少使我坚信没有任何灵丹妙药可以实现所谓“在零基础上几日登天”,我也不认为这样做程序的人会真正快乐。事实上,理想只会离这种模式的程序设计更远。 三、我的经验 作为本课程的主讲者,我应该具备一些基本素质。我希望我的经验能够得到各位的认可。 我现有程序代码量达到1,300,000行,其中Java有950,000行,其他语言有350,000行。至少,我在我的人际圈内没有发现超过这个数目的人。 此时此刻,我还在进行两个重要软件项目的研发。第一个是《新万维网》。它是对传统万维网(WWW)的重大改进。当前版本持续开发超过十年,基础层已经建立,我正在努力修改新版界面。我认为这个产品在学术和市场两个方面都会有很好前景。这个项目现在拥有代码行数882,224。从这个角度看,很可能是我国学界最大的软件研究项目。 另一个项目是《GreatFree: 面向互联网环境的通用分布式程序设计技术》。通过我的大量对比,这是国际学界在互联网环境下第一个具备通用开发能力的程序设计技术。尽我所知,我国在程序设计领域的贡献很少,我的这个成果具备首创价值。我正在把它以新的语言形式展现出来。这应该是我国在计算机领域贡献的第一个程序设计语言。现有成果已经开源,大家可以从GitHub上找到,链接是:http://github.com/greatfree/wind。 我当前还在大学任教。我在国际知名企业也有一些工作和实习经验。我曾经工作和实习过的机构包括:北京大学、西安工业大学、IBM研究中心(纽约)和贝尔实验室(北京)等。我还曾在美国亚利桑那州立大学获得过计算机科学博士学位。 四、英文问题 本课程的教材和幻灯片全部使用英文。英文是科技领域的官方语言,所有最新科技成果都是以英文方式呈现的。随着互联网技术的广泛普及,通过网络我们可以轻易获得足够多的英文资料。这对提高我们的程序设计技术和能力有极大帮助。另外,我认为当前大学普遍存在专业教育和英文教育割裂的现象,这是非常荒唐的。对于母语非英文的人来说,通过英文学习专业是掌握英文最佳甚至是唯一可行的学习方式。英文对于程序设计的帮助是决定性的。寻找一个编程中具体问题的答案,英文搜索结果要远好于中文。对于程序设计人员,英文还有更特别的意义,毕竟程序是英文写的。英文差,完全会导致程序质量大幅下降。最后,我着重需要强调的是,英文能够培养一个人科学理性的思维能力,对提高程序质量有着潜移默化的推动作用。 我多年在大学的教学中一直采取以英文学习专业的方式。实践告诉我,这种方式是成功的,普遍受到学生欢迎。我在我任教过的大学总是最受欢迎的老师之一,这和我的英文教学方式分不开。另外,在我的视频课程中,我对每一张幻灯片都有详细的中文口语解释和大量的程序示例。我认为英文不仅不会影响学习质量,反而会促进对具体程序设计技术的理解,毕竟英文更能反映出技术的本质。相比于大量不精确的翻译书籍,我认为直接学习英文原著是最好的选择。与此同时,借助视频技术实现音像并茂,可以生动展示英文教学内容,一定对提高学习者能力有本质上的提高。我认为大家是会欢迎这种模式的。英文不是学习科技的障碍,恰恰相反,它是我们通向科技巅峰的桥梁。 五、可能的学习者 《Core Java》这本书虽然讨论的是基础Java技术,但它翔实全面的风格其实对每一个对程序设计技术感兴趣专业和非专业人士都会有价值。 第一,没有任何程序设计经验的初学者。相比于其他主流语言,Java是经过长期演化后形成的程序设计技术。Java彻底摆脱了早期机器语言的影响,不存在任何对于机器特征过分依赖的编程方式;Java和互联网技术结合得更加紧密,适合学习者初步掌握互联网开发技术;Java采用面向对象程序设计风格,这是当前被普遍接受和推荐的程序设计理念;还有,相比于其他语言,Java的程序呈现方式更加简化。正是由于上述原因,Java是初学者学习程序设计的恰当选择。 第二,需要全面了解Java技术的程序设计人员。根据我的经验,一个程序员完全掌握一门程序设计语言的所有细节是非常困难的,一般都会存在对某个分支或者部分细节缺乏了解的现象。本课程的全面性会帮助程序员查漏补缺,以较小代价对模糊不清的枝节问题进行了解,从而完善自身的程序设计技术,并迅速在实际研发过程中将所学体现出来。 第三,致力于从事基础软件系统开发的Java程序设计人员。本课程讲授的Java标准版是Java最重要的技术。事实上,Java所有的开发能力集中体现在标准版当中,而非其他任何版本(如Java Enterprise Edition – JEE),更不是其他众多架构(Frameworks)所能代替的。在实际开发中,由于Java标准版一些主要技术使用难度相对较大,很多开发人员会有意回避使用它,转而去借助各种架构进行开发,从而快速完成应用软件的建立。从软件工程角度看,这种做法无可厚非。这些架构不要求研发人员具备深厚的基础知识和技能,只需通过简单配置或者简化的脚本语言编程就可以完成高层应用软件开发。但是长此以往,这种做法会逐渐降低程序设计人员的技术能力。只通过架构开发应用的研发人员大都会失去开发复杂基础软件系统的能力。本课程讲授的Java标准版是Java核心技术,对这个技术的全面掌握是开发基础软件系统不可或缺的。 六、怎样掌握Java程序设计技术 事实上,我不认为只通过这个课程就可以真正掌握Java程序设计技术。这个认识对任何程序设计技术课程都是成立。作为一门需要高度实践经验的科学技术,程序设计课程或者书籍只能是辅助的和启发式的。我认为无论使用何种开发技术何种开发理念,真正决定程序质量的永远是人,而不是单独的某项技术。对于一个高水平的程序设计师来说,他完全可以使用相对落后的技术做出高质量的软件;而低水平的程序设计人员,无论使用任何先进工具都无法保证程序水准。因此,我在课堂上经常和学生们说,你们要坚持“每天编程序”。更重要的是,这个程序应该学生独立思考后设想出的一个软件,每天坚持逐步把它做出来。当这个软件达到特定规模时,设计者才会真正领悟到程序设计的核心价值、各种技术的科学理性意义乃至程序设计的乐趣。 最后,除了“每天编程序”,其实我在课堂上对学生还有一个建议,就是“每天读英文”。前两天,我在网上看到一篇文章。它展示了钱学森先生1933年6月在国立交通大学读书时参加《水力学》考试的试卷。我惊讶地发现这份试卷完全是英文作答。这意味着在遥远的八十八年前,我国大学已经开始使用英文进行专业教育了。遗憾的是,在当前我国主要大学里,竟然还做不到这点。我希望大家能够理解我对英文学习重要性的一再重复:在我们这个全新时代,在一个富有朝气的学科中以英文为蓝本展开自己的理想!  
卫星云图全面、及时、动态的反映各类云系的特点及变化过程,成为气象、 水利部门在防洪抗旱决策过程中不可或缺的重要参考依据。多年的云图接收积累 了数量巨大的卫星云图,依靠人工判读方式根本无法满足时效性要求,尽管一些 人工智能的方法能自动完成数据分析,但这类方法只能按照设定的规则执行,不 能主动发现隐含在数据内部的知识。图像挖掘技术作为数据挖掘领域研究的前沿, 提供了从大量图像中获取隐含的、有价值的、可理解知识的理论及方法。本文以 图像挖掘技术理论与方法为指导,设计了面向云图集和云图—雨量混合数据集的 三类挖掘任务,所获得知识将对云图智能化理解和基于卫星云图的降水预测等研 究具有重要价值。论文的研究工作及贡献包括以下方面: (1)在卫星云图预处理方法研究中,提出了新的非线性自适应噪声滤除算法。 该算法与常用的中值滤波技术相比,它能有效的消除椒盐噪声,保护云图中非噪 声点不受影响,确保像素信息能够真实反映云内状态。云图中存在经纬线、地名 等标注对象,它们会影响云图特征参数的提取。针对标注对象的形状特点,提出 一种基于整体变分技术的标注对象剔除算法,通过引入权值改进了整体变分的离 散化过程。结果表明算法有效剔除标注对象的同时保护了邻域信息。 (2)在云图感兴趣区域提取研究中,提出了基于云图直方图的加权聚类算法, 利用该算法实现典型云区的提取。为了更加符合云图数据样本在特征空间的分布 特点,重点研究了对聚类算法的改进策略:1)针对类别个数自适应确定方法的改 进,提出利用遗传算法结合评价指标曲线找出最优类别数,提高算法自动化水平。 2)针对相似性测度的改进,提出基于链式距离的相似性测度,克服了欧式距离测 度对数据分布的敏感性问题。3)针对聚类机制的改进,引入半监督思想,既能克 服单纯聚类的盲目性问题,又能避免分类面临的训练样本问题。以直方图替代云 图像素作为聚类对象,大幅减少了算法处理时间。 (3)在云类智能识别的研究中,本文针对特征提取、特征选择、分类模型三 个问题提出了对应的算法及模型。针对云区的无规则特性,提出了“基圆模型描 述法”用于云区的描述,在此基础上提取云的形态特征参数,克服了以往算法只 能提取颜色、纹理等特征的不足。为避免过拟合问题,本文采用特征曲线分析方 法,从特征候选集中确定分类模型的输入特征集。本文提出将“IPSO—BP网络模 型”作为分类模型。该模型采用改进的粒子群优化算法替代后向学习算法作为BP 神经网络模型的学习算法,在一定程度上克服了收敛速度慢,易陷入局部极小值, 过分依赖初始值的选择等不足。为了在原有分类模型框架下更好的利用多特征信 息,本文提出了基于多特征融合的组合分类模型,将特征子集分别送入子分类模国防科学技术大学研究生院博士学位论文 型后作出本地决策,采用投票表决法将多个本地决策融合后获得最终的结果。结 果表明多特征融合分类模型在分类精度上优于单一分类模型。 (4)在基于云图—雨量混合数据集的关联规则挖掘研究中,本文以云图灰度 和云顶亮温间的关系为基础,设计了四种与降雨关系密切的云状态参数。通过时 空同步处理,云图参数和雨量数据构成统一的混合数据集。为实现数值属性的转 换,本文提出一种基于聚类的数值属性分区方法,它克服了“等深度区间划分法” 对数据倾斜敏感的问题。为了提高对大规模云图—雨量混合数据集的处理效率, 本文提出了基于数据分割的两阶段关联规则挖掘算法,它通过将原始数据库划分 为多个独立的区间,由每个子区间的局部频繁项集产生全局候选项集,并设计了 专门用于支持度计算的数据结构tidlists,这些策略有效的减少了算法对数据库的 扫描次数,大幅提高了算法的效率。结果表明当支持度阈值处于较低水平时,本 文算法的执行效率显著优于Apriori算法的执行效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值