整理了一些比较零碎的知识点:
一、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基本数据类型所占字节数
这些字节重建成一个对象的过程。
简单的说:序列化就是将内存中的类或者对象(你写的类都是存储在内存中的)变成可以存储到存储媒介中的流, 你将类序列化成流之后可以通过互联网传输给别人,你也可以反序列化将别人的序列化流转换成内存中的对象。
//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);
}