java-base-two

发布时间 2023-07-15 22:10:43作者: Miku831
  1. ArrayList扩容机制

    扩容一半(默认方式):

    当容量不足时,ArrayList将容量扩大为原来的1.5倍,即将原来的容量除以2,然后加上原来的容量。

             如果新创建的集合有带初始值,默认就是传入的大小,在初始化时就会用传入的大小不会扩容,当大小不够后再去扩容。

  1. 在方法中定义的局部变量在该方法被执行时创建
    
    是错误的
    不是局部变量在该方法被执行/调用时创建,而是应该为在该变量被声明并赋值时创建,可以理解为“当代码执行到该变量被赋值的代码时才被创建”                  

            

  • 选项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(),但是参数是基本类型,这时候,先会进行自动装箱,基本型转换为其封装类型

 

  1. 底层识别机器语言,注释不会被编译成机器语言

  2. transient修饰的变量不能被序列化,static变量不管加没加transient都不可以被序列化

  3. 类变量的调用:(1)静态、非静态方法中,可以直接调用。
    成员变量的调用有2种方法:(1)非静态方法中,可以通过this关键字直接调用。因为成员变量的初始化时间先于类的构造函数执行前,自然保证了成员变量已经被赋值。(2)静态方法中,先实例化类,利用实例化类的引用才能调用。
    this关键字:不能在静态方法中使用。

  4. 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
  1. RMI采用的是TCP/IP协议
  2.  引用传递指的是传递的时候,传递的是对象的引用。如果对引用的内部成员进行操作,则会直接影响到原对象,但是如果直接把此引用指向了其他对象,那对不起,这个引用从此以后,便与之前的对象没有任何关系,当前代表的仅仅是新指向的对象。

  3.  weblogic中开发消息Bean时的persistent与non-persisten的差别: persistent方式的MDB可以保证消息传递的可靠性,也就是如果EJB容器出现问题而JMS服务器依然会将消息在此MDB可用的时候发送过来。 non-persistent方式的消息将被丢弃。
  4. +//////////////////////////////--

  5. threadlocalmap使用开、放定址法解决hash冲突,hashmap使用链地址法解决hash冲突

     解决哈希冲突的方法有四种,开放地址法、再哈希法、拉链法(链地址法)、公共溢出法   https://www.cnblogs.com/little-fly/p/7907935.html

  1. 反射时,运用的是内存中生成的Class对象,然后反推到字节码文件中,再获取相应对象的方法或者属性,但是并不会动态修剪字节码文件。
  2. 强引用不回收,软引用内存不足时回收,弱引用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.


    原子性:指该操作不能再继续划分为更小的操作。

    Java中的原子操作包括:     
  •         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.