java面试要点
2019-05-31 本文已影响0人
一只五彩斑斓的大鹅
JAVA
-
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的字节数 -
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){
...
}
}