-
ArrayList扩容机制
扩容一半(默认方式):
当容量不足时,ArrayList将容量扩大为原来的1.5倍,即将原来的容量除以2,然后加上原来的容量。
如果新创建的集合有带初始值,默认就是传入的大小,在初始化时就会用传入的大小不会扩容,当大小不够后再去扩容。
-
在方法中定义的局部变量在该方法被执行时创建
是错误的 不是局部变量在该方法被执行/调用时创建,而是应该为在该变量被声明并赋值时创建,可以理解为“当代码执行到该变量被赋值的代码时才被创建”
- 选项A,a1、a2赋值给Integer类型,自动装箱。对于–128到127(默认是127)之间的值,Integer.valueOf(int i) 返回的是缓存的Integer对象(并不是新建对象),变量所指向的是同一个对象,所以a1==a2返回true。
- 选项B,Integer和int比较会进行自动拆箱,比较的是数值大小,所以d1==d2返回true。
- 选项C,由于超出自动装箱的范围,return返回的是新建的对象,所以对象内存地址不同,b1==b2返回false。
- 选项D,普通new创建对象,两个new创建两个地址不同的对像,所以c1==c2返回false。
对于–128到127(默认是127)之间的值,Integer.valueOf(int i) 返回的是缓存的Integer对象。范围外的值会新建一个Integer对象
Integer与int比较时会自动拆箱,
基本型和基本型封装型进行“==”运算符的比较,基本型封装型将会自动拆箱变为基本型后再进行比较
基本型封装类型调用equals(),但是参数是基本类型,这时候,先会进行自动装箱,基本型转换为其封装类型
- 底层识别机器语言,注释不会被编译成机器语言
-
transient修饰的变量不能被序列化,static变量不管加没加transient都不可以被序列化
- 类变量的调用:(1)静态、非静态方法中,可以直接调用。 成员变量的调用有2种方法:(1)非静态方法中,可以通过this关键字直接调用。因为成员变量的初始化时间先于类的构造函数执行前,自然保证了成员变量已经被赋值。(2)静态方法中,先实例化类,利用实例化类的引用才能调用。 this关键字:不能在静态方法中使用。
b=a++在后,则先把自身的值给b,之后本身再加1
b=++a在前,则自私一点,先自身加1,再赋值给b
int i = 0; //i=0
int a = i++; //a=i,a=0,i++,i=1 int b = ++a; //a++,a=1,b=a,b=1 int c = a+b;//c=2 int d = (a == 1)?b:c;//a==1,d=b,d=1 综上a==1, d==1- RMI采用的是TCP/IP协议
-
引用传递指的是传递的时候,传递的是对象的引用。如果对引用的内部成员进行操作,则会直接影响到原对象,但是如果直接把此引用指向了其他对象,那对不起,这个引用从此以后,便与之前的对象没有任何关系,当前代表的仅仅是新指向的对象。
- weblogic中开发消息Bean时的persistent与non-persisten的差别: persistent方式的MDB可以保证消息传递的可靠性,也就是如果EJB容器出现问题而JMS服务器依然会将消息在此MDB可用的时候发送过来。 non-persistent方式的消息将被丢弃。
-
+//////////////////////////////--
-
threadlocalmap使用开、放定址法解决hash冲突,hashmap使用链地址法解决hash冲突
解决哈希冲突的方法有四种,开放地址法、再哈希法、拉链法(链地址法)、公共溢出法 https://www.cnblogs.com/little-fly/p/7907935.html
- 反射时,运用的是内存中生成的Class对象,然后反推到字节码文件中,再获取相应对象的方法或者属性,但是并不会动态修剪字节码文件。
- 强引用不回收,软引用内存不足时回收,弱引用JVMGC时回收,虚引用随时会被回收。 1、强引用:一个对象赋给一个引用就是强引用,比如new一个对象,一个对象被赋值一个对象。 2、软引用:用SoftReference类实现,一般不会轻易回收,只有内存不够才会回收。 3、弱引用:用WeekReference类实现,一旦垃圾回收已启动,就会回收。 4、虚引用:不能单独存在,必须和引用队列联合使用。主要作用是跟踪对象被回收的状态。
4.以java8为准,switch支持10种类型 基本类型:byte char short int 对于包装类 :Byte,Short,Character,Integer String enum
Switch实际只支持int类型 Java实际只能支持int类型的switch语句,那其他的类型时如何支持的
- a、基本类型byte char short 原因:这些基本数字类型可自动向上转为int, 实际还是用的int。
- b、基本类型包装类Byte,Short,Character,Integer 原因:java的自动拆箱机制 可看这些对象自动转为基本类型
- c、String 类型 原因:实际switch比较的string.hashCode值,它是一个int类型 如何实现的,网上例子很多。此处不表。
- d、enum类型 原因 :实际比较的是enum的ordinal值(表示枚举值的顺序),它也是一个int类型 所以也可以说 switch语句只支持int类型
5.
因为i是基本数据类型,参数是按值传递的,此时会创建一个i的副本,该副本与i有相同的值,把这个副本作为参数进行i++。
i++也是一个表达式,是有返回值的,返回值就是i自增前的值。因此执行i = i++后,虽然i自增为1,但是又被i++的返回值给重新赋值了
6.
正则表达式的规则
1. 任意一个字符表示匹配任意对应的字符,如a匹配a,7匹配7,-匹配-。
2. []代表匹配中括号中其中任一个字符,如[abc]匹配a或b或c。
3. -在中括号里面和外面代表含义不同,如在外时,就匹配-,如果在中括号内[a-b]表示匹配26个小写字母中的任一个;[a-zA-Z]匹配大小写共52个字母中任一个;[0-9]匹配十个数字中任一个。
4. ^在中括号里面和外面含义不同,如在外时,就表示开头,如^7[0-9]表示匹配开头是7的,且第二位是任一数字的字符串;如果在中括号里面,表示除了这个字符之外的任意字符(包括数字,特殊字符),如[^abc]表示匹配出去abc之外的其他任一字符。
5. .表示匹配任意的字符。
6. \d表示数字。
7. \D表示非数字。
8. \s表示由空字符组成,[ \t\n\r\x\f]。
9. \S表示由非空字符组成,[^\s]。
10. \w表示字母、数字、下划线,[a-zA-Z0-9_]。
11. \W表示不是由字母、数字、下划线组成。
12. ?: 表示出现0次或1次。
13. +表示出现1次或多次。
14. *表示出现0次、1次或多次。
15. {n}表示出现n次。
16. {n,m}表示出现n~m次。
17. {n,}表示出现n次或n次以上。
18. XY表示X后面跟着Y,这里X和Y分别是正则表达式的一部分。
19. X|Y表示X或Y,比如"food|f"匹配的是foo(d或f),而"(food)|f"匹配的是food或f。
20. (X)子表达式,将X看做是一个整体
7.
case的穿透性
在switch语句中,如果case的后面不写break,将出现穿透现象,也就是不会在判断下一个case的值,直接向后运行,直到遇到break,或者整体switch结束。
8.
A.Java系统提供3种类加载器:启动类加载器(Bootstrap ClassLoader) 扩展类加载器(Extension ClassLoader) 应用程序类加载器(Application ClassLoader). A正确
B.《深入理解Java虚拟机》P228:对于任意一个类,都需要由加载它的类加载器和这个类本身一同确立其在Java虚拟机中的唯一性,每一个类加载器,都拥有一个独立的类名称空间。这句话可以表达得更通俗一些:比较两个类是否“相等”,只有在这两个类是由同一个类加载器加载的前提下才有意义,否则,即使这两个类来源于同一个Class文件,被同一个虚拟机加载,只要加载它们的类加载器不同,那么这两个类必定不相等。接口类是一种特殊类,因此对于同一接口不同的类装载器装载所获得的类是不相同的。B错误 C.类只需加载一次就行,因此要保证类加载过程线程安全,防止类加载多次。C正确 D. Java程序的类加载器采用双亲委派模型,实现双亲委派的代码集中在java.lang.ClassLoader的loadClass()方法中,此方法实现的大致逻辑是:先检查是否已经被加载,若没有加载则调用父类加载器的loadClass()方法,若父类加载器为空则默认使用启动类加载器作为父类加载器。如果父类加载失败,抛出ClassNotFoundException异常。D错误E.双亲委派模型的工作过程:如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成,每一个层次的类加载器都是如此,因此所有的加载请求最终都应该传送到顶层的启动类加载器中,只有当父加载器反馈自己无法完成这个加载请求时,子加载器才会尝试自己去加载。E正确 F.应用程序类加载器(Application ClassLoader)负责加载用户类路径(ClassPath)上所指定的类库,不是所有的ClassLoader都加载此路径。F错误
9.
- 1.sleep会使当前线程睡眠指定时间,不释放锁
- 2.yield会使当前线程重回到可执行状态,等待cpu的调度,不释放锁
- 3.wait会使当前线程回到线程池中等待,释放锁,当被其他线程使用notify,notifyAll唤醒时进入可执行状态
- 4.当前线程调用 某线程.join()时会使当前线程等待某线程执行完毕再结束,底层调用了wait,释放锁
(join()底层内部调用wait()方法,wait()释放锁资源)
10.
当一个变量被定义为volatile之后,就可以保证此变量对所有线程的可见性,即当一个线程修改了此变量的值的时候,变量新的值对于其他线程来说是可以立即得知的。
可以理解成:对volatile变量所有的写操作都能立刻被其他线程得知。但是这并不代表基于volatile变量的运算在并发下是安全的,因为volatile只能保证内存可见性,却没有保证对变量操作的原子性。
禁止进行指令重排序。 volatile只提供了保证访问该变量时,每次都是从内存中读取最新值,并不会使用寄存器缓存该值——每次都会从内存中读取。 而对该变量的修改,volatile并不提供原子性的保证。
volatile保证内存可见性,不保证原子性
11.
加载驱动方法
- 1.调用方法Class.forName Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
- 2. 通过DriverManager.registerDriver方法注册 DriverManager.registerDriver(new com.mysql.jdbc.Driver());
- 3.通过添加系统的jdbc.drivers属性System.setProperty("jdbc.drivers", "com.mysql.jdbc.Driver")
12.
原子性:指该操作不能再继续划分为更小的操作。
- 1、除long和double之外的基本类型的赋值操作
- 2、所有引用reference的赋值操作
- 3、java.concurrent.Atomic.* 包中所有类的一切操作
13.final修饰变量,变量的引用(也就是指向的地址)不可变,但是引用的内容可以变(地址中的内容可变)
14.
15.
java程序的种类
- 1.Application:Java应用程序,是可以由Java解释器直接运行的程序。
- 2.Applet:即Java小应用程序,是可随网页下载到客户端由浏览器解释执行的Java程序。
- 3.Servlet:Java服务器端小程序,由Web服务器(容器)中配置运行的Java程序。
16.
在第7行的时候,调用的是t.run();方法,之间调用run方法就是普通的方法调用而已,所以肯定是先执行pong()再执行System.out.print("ping");
如果第7行换成t.start()方法,答案就应该选择c,因为t.start()后,线程变为就绪状态,什么时候开始执行时不确定的,可能是主程序先继续执行,也可能是新线程先执行。
这里需要注意Thread的start和run方法 用start方法才能真正启动线程,此时线程会处于就绪状态,一旦得到时间片,则会调用线程的run方法进入运行状态。 而run方法只是普通方法,如果直接调用run方法,程序只会按照顺序执行主线程这一个线程。 17.- LinkedBlockingQueue是一个基于节点链接的可选是否有界的阻塞队列,不允许null值
- LinkedBlockingQueue是一个线程安全的阻塞队列,实现了先进先出等特性
- PriorityQueue是一个无界队列,不允许null值,入队和出队的时间复杂度是O(log(n))
- PriorityQueue是不同于先进先出队列的另一种队列。每次从队列中取出的是具有最高优先权的元素。
18.Java类加载机制
19.
- subSet是指向原数据的,原数据修改,subSet也跟着修改。
- subset(form,true,to,true)是Treeset的非静态方法,该方法返回从form元素到to元素的一个set集合,两个boolean类型是确认是否包含边境值用的。
20.
标签:java,变量,int,two,base,线程,引用,Java,加载 From: https://www.cnblogs.com/miku831/p/17557073.html