黑马程序员--Java基础加强(三)

----------------------- android培训java培训java学习型技术博客、期待与您交流! ----------------------

Java基础加强(三)

(一)ArrayListHashSetHashcode

1,作用:

(1)      ArrayList的作用:有序的集合(相当于一个数组);元素可以重复

(2)      HashSet的作用:无序,不可重复

(3)      hashCode方法作用:hashCode算法的集合,将该集合分成若干个区域,每一个要存储的对象算出一个值,根据算出来的值放入的相应的区域中去,当你需要查找某一个对象的时候,我们先算出这个对象的hashCode的值,看它属于哪个区域,就直接在那个区域中进行查找是否有相等的对象,这样就提高了效率。

还有一点需要注意的:当一个对象被存储进HashSet集合中以后,那么就不需要在修改这个对象中那些参与计算哈希值的字段了,否则,对象修改后的哈希值与最初存储进HashSet集合中时的哈希值就不同了,在这种情况下,即使在contains方法使用该对象的当前引用作为参数去HashSet集合中检索对象,也将返回找不到对象的结果,这也会导致无法从HashSet集合中单独删除当前对象,从而造成内存泄露。

友情提示:

1ArrayList集合中的有序不是指排序,而是指存入的自然顺序

2HashSet集合,存储数据时,先进行判断是否是同一个数据(内容与哈希值都相同),就不存储(注意:不是覆盖该数据。如果你想要存储后面相同的数据,这时的做法就是将之前的数据进行删除操作,然后在重新存储)。

3hashCode的方法是重点,面试中经常提到,需要进行记忆(如果对象的内容是相同的,但是,使用的是new创建的,那就说明该对象哈希值是不同的,虽然内容相同,但是它们存储在不同的区域)。

4)集合存储的是对象的引用,不是将对象直接存储进集合

(二)内省(IntroSpector

1,内省主要是对JavaBean进行操作,JavaBean是特殊的Java类,主要用于传递数据信息,这种java类中的方法主要用于访问私有的字段,且方法名符合某种命名规则。

2,一个JavaBean可以当做普通Java类来使用吗?一个普通Java类可以当做JavaBean来使用吗?

一个符合JavaBean特点的类可以当作普通类一样进行使用,但把它当JavaBean用肯定需要带来一些额外的好处

3,内省的好处:

1)在Java EE开发中,经常要使用到JavaBean。很多环境就要求按JavaBean方式进行操作,别人都这么用和要求这么做,那你就没什么挑选的余地!

2JDK中提供了对JavaBean进行操作的一些API,这套API就称为内省。如果要你自己去通过getX方法来访问私有的x,怎么做,有一定难度吧?用内省这套api操作JavaBean比用普通类的方式更方便。

(三)泛型

1,将一个集合中的元素限定为一个特定类型,集合中只能存储同一个类型的对象,这样更安全;并且当从集合获取一个对象时,编译器也可以知道这个对象的类型,不需要对对象进行强制类型转换

友情提示:

1ArrayList<Integer>中的<>念着typeof

 2)编译器不允许创建泛型变量的数组。即在创建数组实例时,数组的元素不能使用参数化的类型。如:Vector<Integer> vectorList[] = new Vector<Integer>[10];

该语句是错误的。

2,通配符

使用?通配符可以引用其他各种参数化的类型,?通配符定义的变量主要用作引用,可以调用与参数化无关的方法,不能调用与参数化有关的方法。

3,限定通配符

1)限定通配符的上边界:

           Vector<? extends Number> x = new Vector<Integer>();//表示Number及其子类都可以(Number下面有八大基本数据类型)

2)限定通配符的下边界:

          Vector<? super Integer> x = new Vector<Number>();//表示Integer及其父类都是可以的

友情提示:

1)限定通配符总是包括自己

2?只能用作引用,不能用它去给其他变量赋值。如:

                     Vector<? extendsNumber> y = new Vector<Integer>();

                     Vector<Number> x = y;

                    上面的代码错误,原理与Vector<Object > x11 = newVector<String>();相似,

                    只能通过强制类型转换方式来赋值。

3)对于变量名的命名我们可以根据方法名来命名,这个结果的命名跟方法名称是一样的(可阅读性强)

4,自定义泛型

(1)      Java是用C++编写的,那么Java中的泛型跟C++及其相似,由此,可以先来看看C++中自定义的泛型实例:

      <T> T add(T x,T y) {

              return (T) (x+y);

              //returnnull;

       }

用于放置泛型的类型参数的尖括号应出现在方法的其他所有修饰符之后和在方法的返回类型之前,也就是紧邻返回值之前。按照惯例,类型参数通常用单个大写字母表示。

Java中的泛型类型(或者泛型)类似于 C++中的模板。但是这种相似性仅限于表面,Java 语言中的泛型基本上完全是在编译器中实现,用于编译器执行类型检查和类型推断,然后生成普通的非泛型的字节码,这种实现技术称为擦除(erasure)(编译器使用泛型类型信息保证类型安全,然后在生成字节码之前将其清除)。这是因为扩展虚拟机指令集来支持泛型被认为是无法接受的,这会为 Java 厂商升级其 JVM 造成难以逾越的障碍。所以,java的泛型采用了可以完全在编译器中实现的擦除方法。

(2)      定义一个泛型

public class Test{

       publicstatic void main(String[] args){

              Numberobj=add(2,22.3);//类型名称取交集(自动装箱)

              Objectx2 = add(3,"abc");

              swap(newString[]{"abc","xyz","itcast"},1,2);//T类型,将角标1和角标2交换

              //swap(newint[]{1,3,5,4,5},3,4);//false类型问题

       }

       privatestatic <T> void swap(T[] a,int i,int j){//自定义T类型用于交换位置

              T tmp = a[i];

              a[i] = a[j];

              a[j] = tmp;

       }

       private static <T> T add(T x,T y){ //类型不确定,并不一定是加法运算

              return null;

       }

}

友情提示:

1)泛型的类型必须是引用数据类型,不能是基本数据类型

2)当一个变量被声明为泛型时,只能被实例变量、方法和内部类调用,而不能被静态变量和静态方法调用。因为静态成员是被所有参数化的类所共享的,所以静态成员不应该有类级别的类型参数。

友情提示:

1)对于变量名的命名我们可以根据该变量的方法名进行命名。

2)谈谈你对JavaEE的理解:crudcreatereviseupdatedelete),也就是对数据信息的流动管理

 

----------------------- android培训java培训java学习型技术博客、期待与您交流! ----------------------

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值