关于java的一些细节问题,笔试可能会问到,整理一下

整理了一些比较零碎的知识点:

一、java形参实参的引用传值问题:

  1.java的基本数据类型是传值调用,对象引用类型是传引用。

  2.当传值调用时,改变的是形参的值,并没有改变实参的值。但函数使用引用调用,然后函数里改变引用的值,会改变实参。



二、什么是序列化和反序列化?
Serialization(序列化)是一种将对象以一连串的字节描述的过程;反序列化deserialization是一种将这些字节重建成一个对象的过程。

简单说,这个机制是为了保存在内存中的各种对象的状态(也就是实例变量,不是方法),并且可以把保存的对象状态再读出来。
虽然你可以用你自己的各种各样的方法来保存object states,
但是Java给你提供一种保存对象状态的机制,那就是序列化。

什么情况下需要序列化
a)当你想把的内存中的对象保存到一个文件中或者数据库中时候;
b)当你想用套接字在网络上传送对象的时候;
c)当你想通过RMI传输对象的时候;



三、堆、栈、队列简介
①堆是在程序运行时,而不是在程序编译时,申请某个大小的内存空间使用到的。即动态分配内存,对其访问和对一般内存的访问没有区别。
②栈就是一个桶,后放进去的先拿出来,它下面本来有的东西要等它出来之后才能出来。(后进先出)
③队列只能在队头做删除操作,在队尾做插入操作.而栈只能在栈顶做插入和删除操作。(先进先出)

JAVA-堆区,栈区,方法区:
 堆区:
1.堆数据区是用来存放对象和数组(特殊的对象)。堆内存由多个线程共享。堆内存随着JVM启动而创建。

众所周知,Java中有一个很好的特性就是自动垃圾回收。垃圾回收就操作这个数据区来回收对象进而释放内存。
2. jvm只有一个堆区(heap)被所有线程共享,堆区中不存放基本类型和对象引用,只存放对象本身。
3. 堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,因为它是在运行时动态分配内存的,Java的垃圾收集器会自动收走这些不再使用的数据。
4. 缺点是,由于要在运行时动态分配内存,存取速度较慢

栈区:
1 每个线程包含一个栈区,栈中只保存基础数据类型的对象和自定义对象的引用(不是对象本身)。对象都存放在堆区中。
2 每个栈中的数据(基础数据类型和对象引用)都是私有的,其他栈不能访问。
3 栈分为3个部分:基本类型变量区,执行环境上下文,操作指令区(存放操作指令).

方法区:
存放线程所执行的字节码指令。
1 又叫静态区,跟堆一样.被所有线程共享.方法区包含:所有的class和static变量.
2 方法区中包含的是在整个程序中唯一的元素.如class static 变量.


四.将char类型转换为int类型的要点:
public class Lab {
    public static void main(String[] args) {
        char a = '3';
        int b = Integer.parseInt(String.valueOf(a));     //方法一,把字节转换为字符串,再转换为整数。
        b = '3' - 48;     //方法二,因为1的ascii码是49,则49-48=1。而字节'3'是51,所以因减去48
        b = Character.digit(a, 10);    //方法三,该方法的10代表基数(就是unicode码的基数)
    }
}

五、同步支持与否,区别:
支持线程同步保证线程安全而导致性能下降的问题。HashTable是线程安全的,
很多方法都是synchronized方法,而HashMap不是线程安全的,但其在单线程程序中的性能比HashTable要高。
StringBuffer和StringBuilder类的区别也在于此,新引入的StringBuilder类不是线程安全的,但其在
单线程中的性能比StringBuffer高,在不是线程并发的开发下,一般选择使用线程不安全的HashMap和StringBuilder

六、parse 和 valueOf不同之处
Double.ParseDouble(String s) 返回值double
Double.valueOf(String s); Double.valueOf(double d); valueOf参数还有更多种类,它返回的是封装类Double
另外:关于字节数组转换成字符串,使用
String a = new String(byte[],0,length);   

七、Math对象函数:
    double random() 随机返回[0,1),注意不包含1.

八、java基本数据类型所占字节数

byte     1字节               
short    2字节               
int      4字节               
long     8字节               
char     2字节,可以存储一个汉字(C语言中是1字节)
float    4字节               
double   8字节               
boolean  false/true(理论上占用1bit,1/8字节,实际处理按1byte处理)      

九、java为什么要序列化
序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化,将数据分解成字节流,以便存储在文件中或在网络上传输。
或者说:Serialization(序列化)是一种将对象以一连串的字节描述的过程;反序列化deserialization是一种将

这些字节重建成一个对象的过程。
简单的说:序列化就是将内存中的类或者对象(你写的类都是存储在内存中的)变成可以存储到存储媒介中的流,
你将类序列化成流之后可以通过互联网传输给别人,你也可以反序列化将别人的序列化流转换成内存中的对象。
说到序列化,顺便提一下java的transient关键字:
Java的序列化虽然给开发者提供了不少便利,但是在实际开发过程中,我们常常会遇到这样的问题,这个类的有些属性需要序列化,而其他属性不需要被序列化,打个比方,如果一个用户有一些敏感信息(如密码,银行卡号等),为了安全起见,不希望在网络操作(主要涉及到序列化操作,本地序列化缓存也适用)中被传输,这些信息对应的变量就可以加上transient关键字。

也就是说,在不需要序列化的属性前添加关键字transient,序列化对象的时候,这个属性就不会序列化到指定的目的地中。


十、当函数的参数含有未知泛型的List集合的时候,编写一个能够往该未知泛型List集合里存元素的函数。
//public <T>这个T是个修饰符的功能,表示是个泛型方法,就像有static修饰的方法是个静态方法一样。
  //<T> 不是返回值,表示传入参数有泛型
    public static <T> void fillAlter(List<T> list, int start, int end,T t) {
        for(;start<=end;start++)
            list.set(start-1,t);
    }



正在搜索堆积的笔记,暂时写这么多。



猜你喜欢

转载自blog.csdn.net/a5552157/article/details/78622103