马太效应 发表于 2017-8-29 23:00:15

Java暑期学习Day42

今天是第42天,距离九月份又近了一步,明天记录IO~{:10_257:}

static/image/hrline/line7.png

①常见方法(java.lang.Object )
A:
public int hashCode()返回对象的哈希码值。
支持这种方法是为了散列表,如HashMap提供的那样 。
hashCode的总合同是:
a.只要在执行Java应用程序时多次在同一个对象上调用该方法, hashCode方法必须始终返回相同的整数,前提是修改了对象中equals比较中的信息。 该整数不需要从一个应用程序的执行到相同应用程序的另一个执行保持一致。
b.如果根据equals(Object)方法两个对象相等,则在两个对象中的每个对象上调用hashCode方法必须产生相同的整数结果。
c.不要求如果两个对象根据equals(java.lang.Object)方法不相等,那么在两个对象中的每个对象上调用hashCode方法必须产生不同的整数结果。 但是,程序员应该意识到,为不等对象生成不同的整数结果可能会提高哈希表的性能。
尽可能多的合理实用,由类别Object定义的hashCode方法确实为不同对象返回不同的整数。 (这通常通过将对象的内部地址转换为整数来实现,但Java的编程语言不需要此实现技术。)
结果
该对象的哈希码值。

B:
public boolean equals(Object obj)指示一些其他对象是否等于此。

equals方法在非空对象引用上实现等价关系:
a.自反性 :对于任何非空的参考值x , x.equals(x)应该返回true 。
b.它是对称的 :对于任何非空引用值x和y , x.equals(y)应该返回true当且仅当y.equals(x)回报true 。
c.传递性 :对于任何非空引用值x , y和z ,如果x.equals(y)回报true个y.equals(z)回报true ,然后x.equals(z)应该返回true 。
d.它是一致的 :对于任何非空引用值x和y ,多次调用x.equals(y)始终返回true或始终返回false ,没有设置中使用的信息equals比较上的对象被修改。
e. 对于任何非空的参考值x , x.equals(null)应该返回false 。

该equals类方法Object实现对象上差别可能性最大的相等关系;
也就是说,对于任何非空的参考值x和y ,当且仅当x和y引用相同的对象( x == y具有值true )时,该方法返回true 。


请注意,无论何时覆盖该方法,通常需要覆盖hashCode方法,以便维护hashCode方法的通用合同,该方法规定相等的对象必须具有相等的哈希码。
参数
obj - 与之比较的参考对象。
结果
true如果此对象与obj参数相同; false否则。


②HashMap(plus)
继承自java.util.AbstractMap<K,V> 。
java.util.Dictionary和java.util.HashTable是从JDK1.0遗留下来的API,不建议使用。
可以事先利用java.util.Map接口的操作对象来建立键值对应数据,之后若要取得值,只要用对应的键就可以快速取得。判断键是否重复是依据hashCode()和equals(),所以作为键的对象必须要操作hashCode()和equals()。


package collection;

import java.util.*;
import static java.lang.System.out;
/*
*
* V put(K key, V value)
将指定的值与此映射中的指定键相关联。
*
*/
public class Messages {
        public static void main(String[] args) {
                Map<String, String> messages = new HashMap<>(); // 以泛型语法指定键值类型
                messages.put("a", "A不是牛顿的苹果");
                messages.put("b", "b很想吃香蕉");
                messages.put("c", "可口可乐并没有想象中好喝");

                Scanner console = new Scanner(System.in);
                out.print("取得谁的消息:");
                String message = messages.get(console.nextLine());//指定键返回值
                out.println(message);
                out.println(messages);

        }

}
结果是——
取得谁的消息:a
A不是牛顿的苹果
{a=A不是牛顿的苹果, b=b很想吃香蕉, c=可口可乐并没有想象中好喝}


<b><i>package collection;

import java.util.Collection;
import java.util.HashMap;
import java.util.Map.Entry;
import java.util.Set;

public class HashMapDemo1 {
        public static void main(String[] args) {
               
                HashMap<String,String>map=new HashMap<String,String>();
                map.put("jay", "张三");
                map.put("jay", "李四");
                map.put("rose", "玫瑰");
                map.put("mary", "小红");
                System.out.println(map);
                //获取map中所有键
                Set<String>keys=map.keySet();
                for(String key:keys){
                        System.out.println(key);
                }
                //获取map中所有的值
                Collection<String>values=map.values();
                for(String value:values){
                        System.out.println(value);
                }
                //得到key的同时得到key所对应的值
                Set<String>keys1=map.keySet();
                for(String key:keys1){
                        System.out.println(key+"--"+map.get(key));
                }
               
                System.out.println(map.size());
                System.out.println(map.isEmpty());
               
                /*
               *
               * 当我们调用put(key,value)方法的时候,首先会把key和
               * value封装到Entry这个静态内部类对象中。
               * 把Entry对象再添加到数组中,所以我们想获取map中
               * 所有键值对,我们只要获取数组中的所有Entry对象。
               * 接下来调用Entry对象中的getKey和getValue方法就能获取键值对
               */
                Set<Entry<String,String>> entrys=map.entrySet();
                for(Entry<String,String>entry:entrys){
                        System.out.println(entry.getKey()+"---"+entry.getValue());
                }
                /*
               *
               * HashMap调用默认构造方法会产生
               * 一个底层长度为16的Entry数组
               * int
               *
               *
               */
        }

}</i></b>
结果是——


{jay=李四, mary=小红, rose=玫瑰}
jay
mary
rose
李四
小红
玫瑰
jay--李四
mary--小红
rose--玫瑰
3
false
jay---李四
mary---小红
rose---玫瑰


③TreeMap
public class TreeMap<K,V>
extends AbstractMap<K,V>
implements NavigableMap<K,V>, Cloneable, Serializable
1.TreeMap类通过红黑树实现Map接口
   2.TreeMap提供排序顺序存储键/值对的有效手段,同时允许快速检索
   3.不像散列映射,树映射保证它的元素按关键字升序排序


   4.构造方法
TreeMap()
使用其键的自然排序构造一个新的空树状图。
TreeMap(Comparator<? super K> comparator)
构造一个新的,空的树图,按照给定的比较器排序。
TreeMap(Map<? extends K,? extends V> m)
构造一个新的树状图,其中包含与给定地图相同的映射,根据其键的 自然顺序进行排序
TreeMap(SortedMap<K,? extends V> m)
构造一个包含相同映射并使用与指定排序映射相同顺序的新树映射。
   5.TreeMap实现SortedMap并且扩展AbstractMap,它本身并没有定义其他方法。
(如果使用TreeMap建立键值对应,则键的部分将会排序,条件是作为键的对象必须操作Comparable接口,或者是在创建TreeMap时指定操作Comparator接口的对象。)




页: [1]
查看完整版本: Java暑期学习Day42