java学习总结(3)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/freestyle4568/article/details/51161734

41. 当使用HashSet时,HashCode()方法就会得到调用,判断已经存储在集合中的对象的hashcode值是否与增加的对象的hashcode值一致;如果不一致,直接加进去;如果一致,再进行equals方法的比较,equals方法如果返回true,表示对象已经加进去了,就不会在增加新的对象,否则加进去。


42. 如果重写equals()方法,就一定要重写HashCode()方法。


43. 对于Collection类都有一个iterator()函数,返回iterator接口。通过调用iterator对象,得到下一个对象。


44. Arrays类提供对数组的各种算法,而Collections类(不同于Collection类)提供对集合的各种操作算法。


45. 往hashMap中放入相等键时,会用后一个值替换前一个值。


46. 策略模式:1.封装变化的概念 2. 编程中使用的是接口,而不是对接口的实现。

组成部分: 1.抽象策略角色(抽象类或接口) 2. 具体策略角色  3.环境角色


48. HashSet是用HashMap来实现的。


49. 当向HashMap中put一对键值时,它会根据key的hashcode值计算出一个位置,该位置就是准备数组中存放的位置。


50.如果该位置没有对象存在,就将此对象直接放进数组中,如果该位置已经有对象存在了,则顺着此存在的对象的链开始寻找(Entry类有一个Entry类型的next成员变量,指向对象的下一个对象),如果此链上有对象的话,再去使用equals方法进行比较,如果对此链上的某个对象的equals方法比较为false,则将该对象放到数组当中,然后将数组中该位置以前存在的那个对象链接到此对象的后面。

HashMap内存布局:


















图中可以看出这是以散列表的形式实现的,但是在jDK1.7开始,HashMap类时基于散列表+红黑树了。当entry链表数据比较小的时候,采用原来的链表实现,但是当链表大于一定门限的时候,就将链表转换为红黑树以便更快速度的查找与插入。


51. Properties类时一个Hashtable类的子类,很有用的类。一般用于分析后续的property文件。Vector与HashTable是旧的对象,对应新方法对象为ArrayList与HashMap。


52. 指泛型时,在类定义中限制,则用T extends 类/接口。

在声明时限制,则用A <? extends 类/接口>

指定向下兼容用extends, 向上则用super <? super 类/接口> 对于Test<?> ge4时, ge4可以指向Object或子类,但是Set()方法不能存放子类类型。

使用<?>或者是<? extends someclass> 的声明方式,意味着你只能通过该名称来取得所参考实例的信息,或者是移除某些信息,但是不能增加它的信息。因为只知道当中放置的是SomeClass的子类,但不确定是什么类的实例,编译器不让你加入信息。因为要再取出信息时,需要强制类型转换,与泛型意义相违背。


53. Collections是用Arrays类来实现的。


54. 泛型的继承, public class Child<T1, T2, T3> extends Parents<T1, T2>


55. for each 对集合或数组遍历的简化。

for (type element : array) {

}


56. Integer类有一个缓存,它会缓存介于-128到127之间的整数。

Integer.ValueOf(int) --> 可能比Integer(int)构造函数效率高,因为在值为(-128-127)有cache缓存。


57. 对于可变参数而言,本质是数组。所以既可以传入数组,又可以传入多变量。对于可变参数只能放在参数的最后一个,所以一个参数表中只能传入一个可变参数。

Sum(int... nums)

sum(String str, int... nums)


58. 枚举类型Enum,与Class类型一样。

public Enum Color {

     Red, Blue, Black;  //;符合加不加无所谓

}

Enum有多个静态方法,values()和valueOf()


59. 枚举:我们所定义的每个枚举类型都继承自java.lang.Enum类,枚举中的每个成员都是public, final, static。 每个枚举类型的成员其实是该枚举类型的实例。当定义了一个枚举类型后,在编译时刻就可以确定该枚举类型有几个实例,分别是什么。在运行时,我们无法再创建实例。可在枚举类型中定义main方法,public方法,private属性,构造器等。


60. 静态导入:导入类中的静态方法与静态成员变量。

用法: import static 方法/成员变量静态


61. 程序运行时,允许改变程序结构或变量类型,则称为动态语言。


62. 反射获得类:

1. Class<?> classType = class.forName(args[0]);

2. Class<?> classType = String.Class;

    Object invokeTest = classType.newInstance(); 会抛出异常

   Method addMethod = classType.getMethod("add", new Class[]{int.class, int.class})

   Object result = addMethod.invoke(实例对象, 参数)

3.  Class<?> classType = 实例.getClass()


64. classType.newInstance()只能用来生成无参数输入构造函数的类。

有两种方法生成对象:

1.Constructor cons = classType.getConstructor(new 参数);

Object obj = cons.newInstance(new object[]{"hello"});

2. Object obj = classType.newInstance();


65. 策略模式:弱连接实现

组成: 抽象策略角色:策略类,通常由一个接口或抽象类实现。

具体策略角色:包装了相关的算法和行为。

环境角色:持有一个策略类的引用,最终给客户端用的。

实现: 1) 策略模式的用意是针对一组算法,将每个算法封装到具有共同接口的独立的类中,从而使得他们相互替换。

2)策略模式使得算法可以在不影响到客户端的情况下发生变化。使用策略模式可以把行为和环境分割开来。

3)环境类负责维持和查询行为类,各种算法则在具体策略中提供。由于算法和环境独立开来了,算法的修改不影响环境与客户端。


66. 策略模式的编写歩奏:

1) 对策略对象定义一个公共接口。

2)编写策略类, 该类实现了上面的公共接口

3)在使用策略对象的类中保存了一个对策略对象的引用。

4)在使用策略对象的类中,实现对策略对象的set和get方法。

5)编写客户端测试。


67. 策略模式的缺点:

1)客户端必须知道所有的策略类,并自行决定使用哪个策略类。

2)造成很多的策略类。

解决方案:采用工厂方法。


68. 在enum类中定义构造方法时,必须是private的。

每个enum类都继承Enum类,有静态方法。

1)values()返回enum[] 数组

2)valueOf(String类) ,返回Color.String表示的枚举实例

3)compareTo() 用于比较枚举实例出现在定义中的次序。

enum类是特殊的class类,所以有enumSet,EnumMap。

枚举类在switch语句中使用时,case中只出现实例,不需要Color的限制。


69. Integer.Type返回int, Integer.Class返回Integer类


70. 反射可以在类外调用类的private方法。

getMethod()方法只能返回public方法。

getDeclaredMethod()方法可以返回非public方法。

猜你喜欢

转载自blog.csdn.net/freestyle4568/article/details/51161734
今日推荐