不能,因为byte、short、char类型会自动转换成int。long类型转换成int会失去精度。
== 判断两个对象是不是指向同一个地址 equals 判断两个对象所指地址中的值是否相同
用来在散列存储结构中确定对象的存储地址
默认的hashcode是根据对象的id实现的,如果只重写了equals,而hashcode的实现没有变,很有可能两个对象"相等",但是hashcode却不一样。 比如从数据库中查同一个学生,查两次得到两个对象,这两个对象的学号和姓名都一样,但是两个对象却不一样,假如放到hashset中,这两个对象会同时存在,这不是我们想要的结果,这时候就必须重写equlas方法,在方法中认定学号一样,就返回true。 在放入hashset时会自动调用对象的hashcode方法比较两个对象是否相等,所以对equlas方法进行了重写,建议也对hashcode方法也要重写,以保证相同的对象返回的hash值也相同
String是一个不可改变的常量,每次对String类型改变操作时如果常量池中不存在,都会产生一个新的对象,效率低,还浪费大量的内存空间。 三者不同点在于,StringBuffer与StringBuilder每次改变,都不会产生新的对象,StringBuffer与StringBuilder之间的区别在于StringBuffer线程不安全,但是效率快,StringBuilder线程安全,但是效率慢。
Set集合中保证元素不重复,equals()可用于判断元素是否重复,但是没增加一个元素就要检查一次,如果集合中有1000个元素,在新增1001个元素时,就要调用1000次equals方法,效率太慢。于是就用到Hash表的方式,将数据以特定的算法直接指定到一个地址上,在新增时先调用hashCode方法,就可以直接定位到要存放的位置上
如果这个位置上没有元素,可以直接存储在这个位置上。如果这个位置有元素,再调用equals方法进行比较,相同的话就不存储。如果equals比较之后不相同,也就是Hash冲突,会在这个位置产生一个链表,把HashCode值相同的元素串起来。两个对象equals相等,则它们的hashcode必须相等,反之则不一定。
修饰类,此类不能被继承 修饰方法,此方法不能被重写 修饰变量,此变量又称常量,不能被修改,只能被赋值一次
-1,在数轴上,参数小数点后的数>=5,就往右取整,反之往左。
相同点:
都不能被实例化。接口的实现类或抽象类的子类都只有实现了接口或抽象类中的方法后才能实例化。不同点:
接口只能有定义,不能有方法的具体实现,jdk1.8中可以定义default方法体,抽象类中可以有声明也可以有具体实现。实现接口的关键字是implements,继承抽象类的关键字是extends,一个类可是实现多个接口,但只能继承一个抽象类。接口中变量默认都是public static final所修饰,不能被修改,抽象类中属性默认是default,可以在子类中重新定义,也可以重新赋值。抽象类被abstract所修饰的方法不能同时被private、static、native、synchronized所修饰。不能,抽象类就是用来被继承的,被final所修饰的类不能被继承,相互矛盾
线程安全:Vector 使用了 Synchronized 来实现线程同步,是线程安全的,而 ArrayList 是非线程安全的。 性能:ArrayList 在性能方面要优于 Vector。 扩容:ArrayList 和 Vector 都会自动扩容,区别在于 Vector 扩容每次会增加 1 倍,而 ArrayList 只会增加 50%。
Array 可以存储基本数据类型和对象,ArrayList 只能存储对象。 Array 是指定固定大小的,而 ArrayList 大小是自动扩展的。 Array 内置方法没有 ArrayList 多,比如 addAll、removeAll、iteration 等方法只有 ArrayList 有。
相同点:都是返回第一个元素,并在队列中删除返回的对象。 不同点:如果没有元素 poll()会返回 null,而 remove()会直接抛出 NoSuchElementException 异常。
Iterator 的特点是更加安全,因为它可以确保,在当前遍历的集合元素被更改的时候,就会抛出 ConcurrentModificationException 异常。
可以使用 Collections. unmodifiableCollection(Collection c) 方法来创建一个只读集合
并行:多个处理器或者多核处理器同时处理多个任务 并发:多个任务在一个处理器上,按时间片轮流执行,看上去是同时执行的
是一种运行在后台的特殊线程,周期性的执行某种任务或者等待处理某些发生的事。比如java中的垃圾回收线程
NEW(初始化状态) RUNNABLE(可运行 / 运行状态) BLOCKED(阻塞状态) WAITING(无限时等待) TIMED_WAITING(有限时等待) TERMINATED(终止状态)
1.sleep()来自Thread wait()来自Object 2.sleep()不会释放锁,wait()会释放锁 3.sleep()时间到了会自动恢复,wait()需要被唤醒
run()会执行线程运行时的代码,可以多次调用,start()是启动线程,只能调用一次
RUNNING:这是最正常的状态,接受新的任务,处理等待队列中的任务。 SHUTDOWN:不接受新的任务提交,但是会继续处理等待队列中的任务。 STOP:不接受新的任务提交,不再处理等待队列中的任务,中断正在执行任务的线程。 TIDYING:所有的任务都销毁了,workCount 为 0,线程池的状态在转换为 TIDYING 状态时,会执行钩子方法 terminated()。 TERMINATED:terminated()方法结束后,线程池的状态就会变成这个。
execute():只能执行 Runnable 类型的任务。 submit():可以执行 Runnable 和 Callable 类型的任务。
简单来说,就是两个互相持有对方所需要的锁,发生的阻塞 1.设置超时时间,时间到了,主动放弃。 2.降低锁的粒度,不要几个功能用同一把锁 3.使用并发类代理手写类
volatile修饰属性,synchronized修饰类、方法、代码块 volatile可以保证可见性,不能保证原子性,synchronized即能保证原子性也能保证可见性 volatile不会阻塞,synchronized可能会阻塞
synchronized可以给类、方法、代码块加锁,Lock只能给代码块加锁 synchronized操作简单,不需要手动获取和释放锁,发生异常,自动释放锁,Lock需要自己加锁和解锁,如果不去unlock就会造成死锁 Lock可以知道有没有获取到锁,synchronized不可以
ReentrantLock也是独占锁,不过加锁的操作是显式的,ReentrantLock相比较synchronized而言,有额外的功能: 1.实现公平锁,即等待时间最长线程优先获取锁 2.可实现中断,即等待获取锁的操作,可以被中断 3.可以设置等待限时
利用CAS、volatile和native方法保证原子性,使得降低synchronized的开销,提升执行效率。
301:永久重定向 302:暂时重定向 区别在于301对搜索引擎优化有利,302有被网络拦截的风险
forward是服务器内部的转发,url不会改变,转发时可以共享request的内容, 因为redirect的url会改变,相当于再发一次请求,比forward的效率低
两次握手:A->B:你好B B-> A:你好A 这只能保证A->B是可以的,只有第三次握手:A->B:收到 才能保证A->B是可以连接通信不浪费资源的
是指发送方发送到若干的包到达接收方之后沾成了一个包,从接受缓冲区来看,后一个包的头紧接着前一个包的尾 原因: 1.发送方:tcp默认采用Nagle算法,收集多个小分组一起确定发送,可能会造成沾包 2.接收方: 接收到包之后不会立马处理,而是放进缓存,这样使得tcp接收包的速度大于从缓存中读取包的速度,多个包被缓存造成首尾相连
解决办法: 1.格式化数据:选择开始符和结束符,但要数据中不包括开始符和结束符 2.固定长度,应用层可以根据长度判断开始位置和结束位置
1.服务端设置CROS等于* 2.服务端加@CrossOrigin注解 3.前端使用jsonp跨域
Jsp是servlet的扩展,本质就是servlet的简单方式,Jsp注重视图,servlet主要用于控制逻辑
requset:封装客户端请求 response:封装对客户端的响应 pageContext:可以获取其他对象 session:封装用户会话对象 application:封装服务器运行环境的对象 out:封装服务器响应的输出流 config:web应用的配置对象 page:jsp页面本身 exception:封装页面抛出异常的对象
page:代表一个页面的对象和属性 request:代表客户端发起一个请求的对象和属性 session:代表某个用户与服务器建立一次连接的对象和属性 application:全局作用域
session存储在服务端,cookie存储在客户端 cookie安全性一般 cookie存储的容量有限 cookie只能存在客户端,session可以存放redis中