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

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

作者: _Levi__ | 来源:发表于2019-08-19 21:43 被阅读0次

序列化,

把对象转换成二进制(字节序列)存到文件中就是序列化

反序列化,

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

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

序列化的作用

使得对象永久的存储在到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

相关文章

网友评论

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

      本文链接:https://www.haomeiwen.com/subject/idhysctx.html