java面试要点

JAVA

  1. java 中char 类型不存储UTF-8 而是存储UTF-16
    在java中char 占用两个字节 UTF-8 占用1 - 3个字节 使用字符集(Unicode ,ASCII码) 映射正一个整数来存储,因为char中存储的编码格式为utf-16 ,在utf-16编码格式都是占两个字节,在java中打印一个中文的字符占用四个字节,前面两个是字节序 例如

    fun addition_isCorrect() {
      val bytes = "二".toByteArray(charset("UTF-16"))
      println(bytes.size)
      for (aByte in bytes) {
          print(Integer.toHexString(java.lang.Byte.toUnsignedInt(aByte)))
          print(" ")
      }
      println()
    }
    输出结果
      4
      fe ff 4e 8c 
    

    如上代码所示utf-16 占用两个字节, 打印出来确是四个,其中fe ff 代表着字节序
    unicode 是字符集不是编码
    java String的length不是字符数而是char的字节数

  2. java中字符串String最多可以有多长

     栈内存  String longString = "aaaaa.......aaaa"  
     堆内存  byte[] bytes = loadFromFile() new String()读取文件  
     栈内存一般都是编译期能决定大小的放在栈内存中
     堆内存是在项目运行时开辟出来的一块运行内存  
     java 文件编译成class文件是使用utf-8字节 受CONSTANT_UTF8_INFO 的限制最多用  
     65535个字节数,在javac中最多声明65534个字符,看源码得知写的判断是小于65535,  
     源码位置Gen.java constStringLength 要根据实际情况来确定    
     在堆内存中最多占用Integer.MAX_VALUE,但是实际要小于Integer.MAX_VALUE  
     还是要根据实际情况来进行确定      

3.java中匿名内部类的限制

    java中匿名内部类并不是没有名字的,根据反射可以获取到名字为 包名+OuterClass$1 $N   
代表的是匿名内部类的顺序

在kotlin中内部类的基础写法

valueAnimator.addUpdateListener(object :AnimatorUpdateListener {
 override fun onAnimationUpdate(animation: ValueAnimator?) {
     currentPoint = animation?.animatedValue as Point
     postInvalidate()
 }

 })

kotlin 中 lambda表达式的写法

valueAnimator.addUpdateListener { animation ->
 currentPoint = animation?.animatedValue as Point
 postInvalidate()
}

在kotlin中是可以同时实现匿名内部类和实现接口,而在java中是不可以的例如

 val name = object:Foot(),OnClickListener{}

匿名内部类对外部类的引用会造成内存泄漏 例如:

public class Client{
     public void run(){
         InnerClass innerClass = new OutClass().new InnerClass(){
         ...
         }
     }
}


public class OuterClass{
     public abstract class InnerClass{
         
     }
}

此时编译期会自动在内部类中生成一个构造方法

public class Client$1{
     public Client$1(Client client,OuterClass outClass){
         ...
     }
}

你可能感兴趣的:(java面试要点)