文章目录
- 牛客网
- volatile
- 字符串数组和字符数组
- 管道
- 解决hash冲突
- Java的体系结构包含
- 下面有关servlet的层级结构和常用的类,说法正确的有?
- 关于ThreadLocal类 以下说法正确的是
- off-heap是指那种内存
- 集合和map的的继承实现关系
- 抽象类和接口的区别
- 节点流与处理流
- 语句:char foo='中',是否正确?
- 代码解释
- &计算
- 有关线程的哪些叙述是对的()
- 以下哪几种方式可用来实现线程间通知和唤醒:( )
- SpringMVC 五大核心组件
- 下列关于Spring AOP的实现方式的说法中,正确的是
- 下面赋值语句中正确的是
- default与protect的区别
- 静态内部类
- ++赋值给变量
- 对于JVM内存配置参数:
- concuttentHashmap
- 关于ASCII码和ANSI码
- 当我们需要所有线程都执行到某一处,才进行后面的的代码执行我们可以使用
- CMS垃圾回收器在那些阶段是没用用户线程参与的
牛客网
volatile
原理:volatile 关键字用于修饰变量,保证线程对该变量的读写操作都直接在主存中进行,而不会使用线程的本地缓存。这样可以避免线程之间的可见性问题。
作用:主要用于保证变量的可见性,即一个线程对该变量的修改对其他线程是可见的。
使用场景:适用于以下场景:
当多个线程访问共享变量并且其中有一个线程修改了该变量时。
该变量不涉及复合操作,即单一的读/写操作。
适用于控制开关变量,例如在一个线程中将一个标志位设置为 true,其他线程在循环中检查该标志位,以判断是否继续执行
字符串数组和字符数组
这两个不等价
创建一个包含50个元素的二维字符数组,每个元素是一个字符数组
char[][] a = new char[50][];
每个元素都初始化为一个包含10个字符的字符数组,
相当于创建了50个字符串数组(这里不是等价的,只是相当于)
for (int i = 0; i < 50; i++) {
a[i] = new char[10];
}
管道
对于管道,有下面这几种类型:
①普通管道(PIPE):通常有两种限制,一是单工,即只能单向传输;二是血缘,即常用于父子进程间(或有血缘关系的进程间)。
②流管道(s_pipe):去除了上述的第一种限制,实现了双向传输。
③命名管道(name_pipe):去除了上述的第二种限制,实现了无血缘关系的不同进程间通信。
显然,要求是对于不同的服务器之间的通信,是要要求全双工形式的,而管道只能是半双工
解决hash冲突
threadlocalmap使用开放定址法解决haah冲突,
hashmap使用链地址法解决hash冲突
Java的体系结构包含
- Java编程语言
- Java类文件格式
- Java API
- JVM
下面有关servlet的层级结构和常用的类,说法正确的有?
- GenericServlet类:抽象类,定义一个通用的、独立于底层协议的Servlet。
- 大多数Servlet通过从GenericServlet或HttpServlet类进行扩展来实现
- ServletConfig接口定义了在Servlet初始化的过程中由Servlet容器传递给Servlet得配置信息对象
- HttpServletRequest接口扩展ServletRequest接口,为HTTP Servlet提供HTTP请求信息
关于ThreadLocal类 以下说法正确的是
- ThreadLocal是采用哈希表的方式来为每个线程都提供一个变量的副本
- ThreadLocal保证各个线程间数据安全,每个线程的数据不会被另外线程访问和破坏
- JDK 1.2的版本中就提供java.lang.ThreadLocal,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路。使用这个工具类可以很简洁地编写出优美的多线程程序,ThreadLocal并不是一个Thread,而是Thread的局部变量。
- 当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。 从线程的角度看,目标变量就象是线程的本地变量,这也是类名中“Local”所要表达的意思。 所以,在Java中编写线程局部变量的代码相对来说要笨拙一些,因此造成线程局部变量没有在Java开发者中得到很好的普及。
ThreadLocal的接口方法
off-heap是指那种内存
off-heap叫做堆外内存、,将你的对象从堆中脱离出来序列化,然后存储在一大块内存中,这就像它存储到磁盘上一样,但它仍然在RAM中。对象在这种状态下不能直接使用,它们必须首先反序列化,也不受垃圾收集。序列化和反序列化将会影响部分性能(所以可以考虑使用FST-serialization)使用堆外内存能够降低GC导致的暂停。堆外内存不受垃圾收集器管理,也不属于老年代,新生代。
集合和map的的继承实现关系
抽象类和接口的区别
节点流与处理流
节点流:可以从或向一个特定的地方(节点)读写数据。如FileReader.
处理流:是对一个已存在的流的连接和封装,通过所封装的流的功能调用实现数据读写。如BufferedReader.处理流的构造方法总是要带一个其他的流对象做参数。一个流对象经过其他流的多次包装,称为流的链接。
我的理解:节点流就是传入的有file与一个文件向连的流,而处理流就是对节点流再封装。
语句:char foo=‘中’,是否正确?
中文字符所占的字节数取决于字符的编码方式,
一般情况下,
采用ISO8859-1编码方式时,一个中文字符与一个英文字符一样只占1个字节;
采用GB2312或GBK编码方式时,一个中文字符占2个字节;
采用UTF-8编码方式时,一个中文字符会占3个字节。
byte和C++中的char类型是一样的,8位,1个字节,-128-127。
但是,char类型,是16位,2个字节, ‘\u0000’-‘\uFFFF’。
因为java内部都是用unicode的,所以支持中文变量名的
综上,java中采用GB2312或GBK编码方式时,一个中文字符占2个字节,而char是2个字节,所以是对的
代码解释
public class Tester{
public static void main(String[] args){
Integer var1=new Integer(1);
Integer var2=var1;
doSomething(var2);
System.out.print(var1.intValue());
System.out.print(var1==var2);
}
public static void doSomething(Integer integer){
integer=new Integer(2);
}
}
&计算
&运算符:两个数都转为二进制,然后从两个数的最高位进行与运算,两个都为真(1),结果才为真(1),否则为假(0)
13:01101
17:10001
结果:00001,既为1
有关线程的哪些叙述是对的()
使用start()方法可以使一个线程成为可运行的,但是它不一定立即开始运行。
当一个线程因为抢先机制而停止运行,它可能被放在可运行队列的前面。
一个线程可能因为不同的原因停止并进入就绪状态
以下哪几种方式可用来实现线程间通知和唤醒:( )
Object.wait/notify/notifyAll
Condition.await/signal/signalAll
常用的线程通信方式有两种,分别是利用Monitor实现线程通信、利用Condition实现线程通信。线程同步是线程通信的前提,所以究竟采用哪种方式实现通信,取决于线程同步的方式。
如果是采用synchronized关键字进行同步,则需要依赖Monitor(同步监视器)实现线程通信,Monitor就是锁对象。在synchronized同步模式下,锁对象可以是任意的类型,所以通信方法自然就被定义在Object类中了,这些方法包括:wait()、notify()、notifyAll()。
JDK 1.5新增了Lock接口及其实现类,提供了更为灵活的同步方式。如果是采用Lock对象进行同步,则需要依赖Condition实现线程通信,Condition对象是由Lock对象创建出来的,它依赖于Lock对象。有await()、signal()、signalAll()。
SpringMVC 五大核心组件
- DispatcherServlet 请求入口
- HandlerMapping 请求派发,负责请求和控制器建立一一对应的关系
- Controller 处理器
- ModelAndView 封装模型信息和视图信息
- ViewResolver 视图处理器,定位页面
下列关于Spring AOP的实现方式的说法中,正确的是
- JDK动态代理,是Java提供的动态代理技术,可以在运行时创建接口的代理实例。
- CGLib动态代理,采用底层的字节码技术,在运行时创建子类代理的实例。
下面赋值语句中正确的是
java中整型默认的是int,浮点默认的是double.
double d=5.3e12; 正确
float f=11.1;
int i=0.0;
Double oD=3; int 转为 封装类型Double,是无法编译的
default与protect的区别
default和protected的区别是:
前者只要是外部包,就不允许访问。
后者只要是子类就允许访问,即使子类位于外部包。
总结:default拒绝一切包外访问;protected接受包外的子类访问
静态内部类
++赋值给变量
count = count++ 原理是 temp = count; count = count+1 ; count = temp; 因此count始终是0 这仅限于java 与c是不一样的
对于JVM内存配置参数:
-Xmx10240m -Xms10240m -Xmn5120m -XXSurvivorRatio=3
,其最小内存值和Survivor区总大小分别是。
- -Xmx:最大堆大小
- -Xms:初始堆大小
- -Xmn:年轻代大小
- -XXSurvivorRatio:年轻代中Eden区与Survivor区的大小比值 年轻代5120m,
- Eden:Survivor=3,Survivor区大小=1024m(Survivor区有两个,即将年轻代分为5份,每个Survivor区占一份),总大小为2048m。 -Xms初始堆大小即最小内存值为10240m
concuttentHashmap
JDK1.8 的 ConcurrentHashMap 采用CAS+Synchronized保证线程安全。
JDK1.7 及以前采**用segment的分段锁机制实现线程安全,**其中segment继承自ReentrantLock,因此采用Lock锁来保证线程安全。
Arrays.asList() 返回 java.util.Arrays.ArrayList 对象,这里的 ArrayList 是 Arrays 私有的内部类
SimpleDateFormat是线程不安全的
关于ASCII码和ANSI码
标准ASCII只使用7个bit
在简体中文的Windows系统中,ANSI就是GB2312
ASCII码是ANSI码的子集
当我们需要所有线程都执行到某一处,才进行后面的的代码执行我们可以使用
CountDownLatch属于让一组线程阻塞直到线程执行到某一处之后放开,执行后面的代码,而CyclicBarrier属于最开始就是阻塞的,直到最后一个线程到达屏障时,才会放开执行后面代码