首页 > 编程语言 > 详细

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

时间:2019-07-21 19:45:43      阅读:65      评论:0      收藏: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.cnblogs.com/-levi/p/11222320.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!