Java初学者常见问题_字符串序列化_可变不可变_传递(值,引用)

序列化,
把对象转换成二进制(字节序列)存到文件中就是序列化
反序列化,
把文件中的二进制(字节序列)对象恢复到类中就是反序列化


◆注;在序列化时一般需要提供一个序列化编码,确保在恢复是,仍然是指向同一个内存区域

序列化的作用
使得对象永久的存储在到Disk中。

可变序列化;
在对象创建了出来之后,依然可以改变位于对象中的内容,如StringBuffre

不可变序列化;
在创建对象了之后,内存中的内容是不可变的,如String

什么是可变类,和不可变类?
可变类;创建出这个类的实例时,是可以改变这个类实例的内容的
不可变类;创建出这个类的实例时,是不可以改变的。


值传递;(方法形参是,基本数据类型)当传递一个实际的值给这个形参时,是用来初始化这个形参的,
而形参的值发生改变时,
  ★是不会改变传递过来的这个实际的值★
因为2个位于内存空间,地址也不一样,而且当调用这个
方法时是不会影响(改变)实际的值的。
值传递的类型时基本数据类型。
是一个值拷贝的过程。

结论;没有改变了传进来的位于内存中的值。



引用传递;(是对象,引用类型)当调用某个方法是,参数是对象 或者数组 ,而这个对象调用某个方法时实
际上指向同一个地址值中的。而当实际使用这个方法就是使用
内存中的地址值空间实际的参数进行操作的。
而当这个方法结束时,
★这些操作(修改)了的★
属性会被保留下来,并且会进行一个
对位于内存中的实例空间的
参数会进行修改。
引用传递,是引用类型的,在传递时是传递地址值。

结论;改变了传过来的位于内存中的对象的值。


什么是可变字符,和不可变字符?
字符串的不可变字符序列,和可变字符序列。

不可变字符序列(String);String的值是存到内存的方法区中的常量池,并且String这个类是使用
final修饰的,而且这个类底层存储是使用数组的存储,并且其数组是
使用final修饰的。使得其在内存中是不可以改变的。
所以创建新的字符串时是会在内存中创建出新的一个
新的字符串,即便是使用了 + 连接符,因为
final是不可修改的而且每次做完一次
连接在内存中都是再次创建。

并且;当2个字符的内容是一样的,会指向同一块内存空间,
而不会在此为此字符串在常量池在再次创建一个。
也是一个节约内存的机制。

可变字符序列(StringBuilder and StringBuffer);
当使用append()方法时是将append的值存到数组中当调用了toStirng时会将数组的
值拷贝到StringBuiler的对象中(引用传递),从而实现一个追加的功能

◆注;String,StringBuilder,StringBuffer
 String;是位于常量池
 StringBuilder,在底层存储时是使用数组来存储的,默认空参的构造器数组是16。当超出数组长度
  时,则*2+2.
 
 StringBuffer,在底层存储时是使用数组来存储的,默认空参的构造器数组是16。当超出数组长度
  时,则*2+2.




为什么不同包下的类继承Object的?
因为Object是一个超类,使得语言更加灵活,可以在扩展类库是使得其可以兼容所有类库的类。



接口有没有父类?
没有,没有构造器而且是用于顶层设计,````而且也没有``继承Object
除非是接口继承接口




当内部类重写了 toString方法了怎么获取地址

classpath变量在JAVAEE的使用  百度


下载Oracle  sql




重写hashCode equals comparator toString等方法的作用
hashCode就是一个散列码用于帮助快速的查找,hashCode是计算出每一个实例化的对象实例的内存地址

实验;〓 当做类型自动提升是否为-1

◆注;(String类是使用它的 value值作为参数然后进行运算得出hashcode的
换句话说, 只要值相同的String不管是不是一个对象,hash值全部相等
因为底层存储和指向机制)。

集合为什么要重写equals方法
因为contains是通过equals方法,如果是自定义类是调用
自定义类的equals方法。


getClass()得到当前对象的类




当在做Scanner输入是,如果是要抛出异常,并且再次输入要使用while并且在异常处理要在加一个next()将输
入的错误的抛出的异常抛给这个  空的 位于异常处理的位置   next()
但是;如果是引用类型就不用,因为引用类型会自动做equal 
而基本数据类型不会,所以要再次加上空的  next()
       
       意义;会将其发生异常的值,抛出给这个空的next();


当指定了泛型后,在使用匿名类进行重写还要给匿名类进行一个指定泛型。


为什么使用Set要同时重写HASHCODE和EUQuals方法?
因为底层存储是根据HASHCODE散列计算的值来进行存储的,EQUALS就是当2个HASHCODE值一样是用于判断
内容是否相同,相同则不加入,不相同则加入。
如果2个值的HASHCODE值相同,EQUALS不相同则会在其元素位置,后面在开辟一个空
间出来。用于同时存储2个元素。


泛型的限定;
(List)<? extends 类A> 表示类A是下的子类,而?是List
能存放本类以及本类下的
子类

(Collection)<? super 类A> 表示?是类A的
父类
只能存放本类以及父类




泛型方法是可以用静态的








SERIALIZEBLE
serializeble是一个序列化接口,实现这个接口的是可以序列化的,并且实现了接口给实现类添加了一个序列
号之后可以保证在将文件读出时,不会出现丢失等,而且实现了这个接口可以存储
到这个类对象的状态。




为什么COMPARATOR不用重写EQUALS
2个实体EQUALS为TRUE那么2个实体的HASHCODE必须是相同的(自己写的那就没意义了!)
而重写COMPARATOR或者COMPARE时,建议重写EQUALS方法,因为避免2个值一样则后一个是无法
加进来的,所以建议同时重写EQUALS方法,与HASHCODE方法,HASHCODE是确定2个值
在内存中的位置。





二分法的代码
   public static int search(int[] arr, int key) {
    //记录数组的第一个位置
       int start = 0;
       //记录数组的最后一个位置
       int end = arr.length - 1;
       while (start <= end) {
           //从中间开始找
           int middle = (start + end) / 2;
           
           //如果输进来的元素是小于中间的元素则
           if (key < arr[middle]) {
           //取出以中间元素为开始的前面的元素
               end = middle - 1;
           
           //如果输进来的元素时大于中间元素则    
           } else if (key > arr[middle]) {
           
           //取出与中间元素为开始的,最后一个元素为结束
               start = middle + 1;
           
           } else {
           //否则返回中间元素
               return middle;
           }
       }
       return -1;
   }
}

给一个字符串赋值那么这个字符也是一个对象,因为这个字符串是存在内存方法区中的常量池的。而这个
字符串是有一个地址值的。

数组转集合的方法。                 集合转数组
Array.adList(arr); toArray();

递归;不断传递,直到末尾
可以使用方法达到递归的效果


\r\n的作用
\r是换行,一般是空行
\n是回车并且换行,一行是一行的尾部

java中的switch语言支持什么类型的值


byte short int char 
·注;在JDK7.0之后增加对字符串的String的支持

写集合遍历方法到总结中

类.class的和this的作用
正在运行的类

注意;当使用Thread而不是使用Runable时要,并且是使用同步方法的形式时,
如果变量是static 方法也要是static 不然synchronized则不起作用
因为默认同步方法调用的是this,而静态调用的是类.class


组播是强制,广播是非强制

declare 
i number(30) := 0;
begin 
loop 
exit when i > 999999

insert into emp(empno,ename) values(i,'XX');

i := i+1;
dbms_output.put_line(i);
end loop;
end;
/

exception 





猜你喜欢

转载自blog.csdn.net/su_levi_wei/article/details/52098547