java 基本数据类型的长度:
byte 1;
short 2;
int 4;
long 8;
float 4;
double 8;
char 2;
boolean 1;
String, StringBuffer和StringBuilder的区别:
- String:字符串常量, 一旦被创建, 就不可被修改;经常改变字符串内容时,尽量不要用String, 对系统性能产生影响
- StringBuffer:字符串变量 可以被修改;线程安全的, 多线程操作字符串缓冲区;主要是append和insert操作
- StringBuilder:字符串变量;线程不安全的 单线程操作
如果不是多线程, 使用StringBuilder比StringBuffer效率高。
ArrayList和LinkedList的区别:
- ArrayList是动态数组,查询效率较高;线程不安全的
- LinkedList是双向链表, 插入删除效率较高; 线程不安全的
- Vector动态数据,线程安全的
Java中引用和C++指针的区别:
- 引用可以理解成受限的指针,引用底层采用指针或者句柄的方式实现;
- 指针是可以用来加减运算的, 而引用只能用来赋值运算;
- java中是没有指针的概念的,因为Java不存在引用传递, 所有的传递都是通过值传递进行的;
- 但是Java中每个new返回的都是对象的引用。
基本数据类型存放在栈中,存放的是数据值;产生的对象时, 是把对象的引用放在栈中,用于指向某个对象,对象本身放在堆区。调用方法时传递的参数,以及一些调用中创建的临时变量是放在栈中;而静态变量,实例变量存放在堆中。
static 关键字 ,final关键字
- static关键字表明一个成员变量或者成员方法不需要用实例化的对象去访问;
- static修饰的方法不能被重写, 因为方法的重写是运行时动态绑定的,而static是编译时静态绑定的;
- final关键字:修饰类表示该类不可以被继承,修饰方法表示该方法不能被自雷重写,修饰属性,表示该属性不可以被修改;
NIO 框架:是Java new IO的简称。Netty,Mina,xSocket
1、Channel 通道
2、Buffer缓存区支持;
数据从通道读到缓冲区,或者从缓冲区读到通道
3、异步IO:
4、Selector选择器:用于监听多个通道事件,链接打开,数据到达,单个线程可以监听多个数据通道;
设计模式
- 工厂者模式:对实现了同一接口的一些类封装成工厂类;
- 观察者模式:类与类之间的关系,类似于邮件订阅,当订阅了之后,后 续有更新就会通知你,当有一个对象发生变化时,依赖该对象的对象会收到通知,并且一起发生变化
- 单例模式:保证在在类加载的过程中, 一个对象只有一个实例,不用new 减轻GC压力
- 代理模式:用一个代理类对原来对象进行操作。在使用该方法的时候需要对原来的逻辑进行修改, 直接修改这个方法违反了修改关闭原则, 而且如果修改会产生的问题不可预知, 所以就创建一个代理类, 通过修改代理类来实现。
多线程:多线程的几个运行状态,阻塞有哪几种 线程池:
多线程主要是为了发挥多核CPU的优势,防止阻塞。
创建线程的方式:
extends Thread
implements Runnable
实现接口比继承的方式更加灵活,减少程序之间的耦合度
start()和run()的区别:
只有调用了start()方法才能表现出多线程的特性;不同线程的run()方法里面代码交替执行。如果只是调用了run(), 那么代码还是同步执行的,必须等待线程中的run()全部执行完毕,另外一个线程才能执行run()里面的代码。
Runnable和Callable接口的区别:
Runnable接口的run方法是void的, 没有返回值,单纯执行run()中的代码;
而Callable接口中的run()是有返回值的,是一个泛型,和Future,FutureTask配合可以用来获取异步执行结果。比如说等待时间太长没有获取到需要的数据,可以取消线程的任务。
6、CyclicBarrier 和CountDownLatch的区别:
CyclicBarrier是线程运行到某个点上该线程就停止运行,直到所有的线程都运行到了这个点,所有的线程才重新运行;
CountDownLatch在某个线程运行到某个点的时候,只是给该线程设置一个标志位,置反,该线程继续运行;
CyclicBarrier只能唤起一个任务,CountDownLatch可以唤起多个任务;
CyclicBarrier可以重用,CountDownLatch不可重用,计数值为0该CountDownLatch就不可再用了。
7、volatile关键字的作用:
保证每次读到Volatile的变量,一定是最新数据;使用volatile关键字修饰的变量,保证了其在多线程之间的可见性(并发编程中,遇到的3个问题:原子性问题,可见性问题,有序性问题)
使用Volatile会禁止对语义排序,volatile的一个重要作用就是和CAS结合,保证了原子性。
8、线程安全:
wait()和sleep()的区别
线程锁的类型:
悲观锁:并发情况很大,每次拿数据都会上锁, 操作开始和结束都需要加锁,效率低;
乐观锁:并发比较小,每次拿数据时认为别人是没有修改数据的, 只有在更新的时候判断一下数据是否有修改,写较少的时候使用效率较高
互斥锁:synchronized, 性能较差;保证同一时刻最多只有一个线程在执行该段代码;
自旋锁:效率高,耗时少,但是该锁占用时间较长时, 占用CPU资源比较多;
原子锁:给成员变量的get和set方法加锁,对读写进行锁定,并非线程安全,效率低;
内部类的作用:内部类可以实现很好的隐藏;无条件访问外部类的所有元素;实现多继承;避免修改接口导致, 同一个类中两个同名方法调用。
http://andy136566.iteye.com/blog/1061951/
Jsp和Html的区别:
HTML是文本标记语言,是静态页面,浏览器可以直接显示;
JSP是java服务端页面,是动态的, 需要生成class文件,最终执行的是class文件;JSP不仅需要编译,还需要转译,首先会把Jsp转译成Servlet文件,然后再编译成class文件,当用户访问jsp的时候就执行了class文件
反射:运行时加载对象,动态调用对象, 动态加载信息
客户端和服务端交互的机制:
通过Http请求,浏览器和服务器之间建立Socket连接,通过IO流进行报文信息的传输,报文严格遵守Http请求协议;
Spring的底层:Ioc,解耦对象之间的依赖关系;
AOP,面向切面编程,最大程度的解耦模块和组件,采用动态代理植入切面,JDK代理,CGLib代理作为目标Bean
将公共行为封装到一个类中,减少重复代码。
Java 的8中数据类型:byte,short,int, long,float, double,boolean,char
自动装箱是Java编译器在基本数据类型和对应的对象包装类型之间的转换;
抽象类和接口的区别:
HashMap的工作原理:
- HashMap以key,value 的形式存储,
用put(key,value)的方式存储对象, 用get(key)的方法获取对象;
在调用put(key,value)方法传递键值时,会先对键值用hashcode()方法,返回hashcode用于找到bucket位置存储Entry对象;
HashMap两个对象的hashcode相同, 并不表示两个对象相同, 因为会hashcode相同仅仅表示两个对象的bucket位置相同,会发生碰撞。但是HashMap是用LinkedList存储Entry对象的,在获取到相同的hashcode值时,就是获得了bucket位置之后, 调用keys.equals()方法找到LinkedList中的正确节点,最终找到正确的对象。或者使用不可变的对象类型, 像String类型或者Integer等封装类作为HashMap的键值,这样一来读取速度也很快。 - 如果HashMap 的大小超过了负载因子定义的容量怎么办?
默认的负载因子大小是0.75;当一个map填满了75%的bucket,将会创建HashMap两倍大小的bucket来数组来调整大小,并将原来对象存储到新的bucket数组中,这个过程叫rehashing。
重新调整HashMap的大小是有问题的, 存在条件竞争,会有多线程的情况发生。
HashMap在调整大小的过程中,存储在LinkedList中的元素的次序会倒过来,因为重新放到新的bucket位置的时候,HashMap不会将元素放到LinkedList尾部,而是放在头部,主要是为了避免尾部遍历。如果条件竞争发生了,那么就会发生死循环。多线程情况下一般不会用HashMap。
可以用任何自定义对象作为键值,只要重写了hashcode()和equals()方法,并且对象插入到map中不会再变了。
CocurrentHashMap是线程安全的,同步性能更好,因为他仅仅根据同级别对map的一部分上锁
网友评论