黑马程序员 集合(二)

来源:互联网 发布:爱奇艺视频软件 编辑:程序博客网 时间:2024/05/21 14:18


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

1,list实现类总结

          list实现类主要有三种,ArrayList,LinkedList,Vector,它们的共性和不同如下:

public static void list_method5(){//底层结构是数组,查询快,删改慢List<String> l = new ArrayList<String>();//底层结构是链表组,查询慢,删改快//但是限制比较大,只能删改头和尾List<String> l2 = new LinkedList<String>();//vector先于collection出现,后来归为list实现类List<String> l3 = new Vector<String>();/* * arraylist和vector共性 * 1,底层实现都是数组 * 2,长度可以按需求改变,初始值是10 * arraylist和vector共性 * 1,递增的量不同,arraylist是50%,vector是100% * 2,arraylist是线程不安全的,vector是线程安全的 * */}

 2,set的实现类treeset,hashset

        hashset的特点: hashset的底层实现是哈希表,存储的顺序和打印顺序可能不一致,/主要是通过计算hash值。

        treeset的特点:treeset的底层实现是红黑树(二叉树的升级,确保在log(n)的时间内查找数据),存储顺序和打印顺序也不一致,主要是通过比较对象的tostring()字符顺序大小,

public static void list_method6(){Set<String> s = new HashSet<String>();s.add("mingren02");s.add("xiaomingren01");s.add("damingren03");s.add("mingren04");s.add("mingren04");sop(s);Set<String> s2 = new TreeSet<String>();s2.add("mingren02");s2.add("xiaomingren01");s2.add("damingren03");s2.add("mingren04");s2.add("mingren04");sop(s2);}

验证结果:


 3,equals和hashcode的使用

            equals方法和hashcode方法是Object类的重要方法,如果子类不重写这两个方法,在某些应用中会出现意想不到的结果,就拿set集合中插入元素,即使元素的所有属性全部都一样,结果还是可以存入hashset中。

            重写hashcode的原因: 因为基类Object的hashCode是通过JNI技术实现的,调用的本地方法, 即使对象的各个属性都相同,本地方法却可以产生不同的hash值,所以要重写

           重写equals的原因:Object的equal方法只是比较引用地址是否相同,这样就有缺陷了,两个内容相同的对象hashCode是相同的,这时用Object的equals比较时,一定不同,因为属于两个不同的堆内存,引用地址肯定不同,所以要重写,需要比较对象的内容。

class Person implements Comparable<Object> {private String name;private int age;public Person(String name, int age) {super();this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic int hashCode() {// TODO Auto-generated method stubsop(name+"hashCode......");return name.hashCode()+23*age;}@Overridepublic boolean equals(Object obj) {// TODO Auto-generated method stubPerson ptemp = null;if(!(obj instanceof Person)){return false;}ptemp = (Person)obj;sop(name+":"+age+"equal.....");return this.name.equals(ptemp.getName()) && this.age == ptemp.getAge();}@Overridepublic String toString() {// TODO Auto-generated method stubreturn name+": "+age;}@Overridepublic int compareTo(Object obj) {// TODO Auto-generated method stubPerson ptemp = null;if(!(obj instanceof Person)){throw new RuntimeException("类型不匹配,无法比较");}ptemp = (Person)obj;int name_compare = name.compareTo(ptemp.getName());return name_compare == 0 ? age - ptemp.getAge() : name_compare;}}

方法是重写了,那么谁先被调用呢?

分析:在hashset中,使用了hash方法对对象进行排序,那么第一步就是计算hashcode,如果相同的话,那么再用equals比较,看内容是否相同。

public static void equal_hashcode(){Collection_study c = new Collection_study();Set<Object> s = new HashSet<Object>();s.add(c.new Person("mingren",11));s.add(c.new Person("mingren",12));s.add(c.new Person("mingren",12));s.add(c.new Person("mingren",13));Iterator<Object> it = s.iterator();while(it.hasNext()){sop(it.next().toString());}}

验证结果:


4,treeset集合增加对象引用的两种实现方法

          a,对象实现comparable接口

class Person implements Comparable<Object> {@Overridepublic int compareTo(Object obj) {// TODO Auto-generated method stubPerson ptemp = null;if(!(obj instanceof Person)){throw new RuntimeException("类型不匹配,无法比较");}ptemp = (Person)obj;int name_compare = name.compareTo(ptemp.getName());return name_compare == 0 ? age - ptemp.getAge() : name_compare;}}

注意:先是以姓名比较,如果姓名相同,在以年龄比较。

           2 ,treeset的形式参数实现comparator接口,不需要重新定义类了,太麻烦,直接用匿名内部类就可以了,方便!

public static void comparator_method1(){Collection_study c = new Collection_study();Set<Object> s = new TreeSet<Object>(new Comparator<Object>() {@Overridepublic int compare(Object o1, Object o2) {if(!(o1 instanceof Person) || !(o2 instanceof Person)){throw new RuntimeException("类型不匹配");}Person p1 = (Person)o1;Person p2 = (Person)o2;int name_compare = p1.getName().compareTo(p2.getName());return name_compare == 0 ? p1.getAge()-p2.getAge():name_compare;}});s.add(c.new Person("mingren",11));s.add(c.new Person("mingren",12));s.add(c.new Person("xiaomingren",12));s.add(c.new Person("damingren",12));sop(s);/* * 解决办法二:在创建treeset实例时传入comparator接口的实现类(可以采用匿名内部类), * 同样返回三种比较结果-1,0,1 * */}

注意:如果对象实现了Comparable接口以及treeset实现了Comparator接口,则优先使用treeset的接口。

验证结果:


5,map的使用方法

          a,hashmap的常用方法:

public static void map_method(){Map<String, String> m = new HashMap<String, String>();Map<String, String> m2 = new TreeMap<String, String>();Map<String, String> m3 = new Hashtable<String, String>();/* * 常用方法:put * 原理:如果key在m中不存在,则存入,返回null *      否则会覆盖以前的value,并将将以前的value返回 * */m.put("name", "mingren");m.put("name1", "mingren1");m.put("name2", "mingren1");m.put("name3", "mingren2");m.remove("name");//删除key为name的entrym.clear();//清空mapSet<String> s = m.keySet();//获取key集合Set<Entry<String, String>> s2 = m.entrySet();//获取entry集合Collection<String> s3 = m.values();//因为values的值可以相同,所以用collectionsop(m.size());m.containsKey("name");//是否包含namem.containsValue("mingeren");//是否包含mingren}

         b,hashmap和hashtable的相同点

                     底层实现都是是哈希表

                HashMap和Hashtable的区别:
                    1,HashMap允许空值(key,value),线程不安全
                    2,Hashtable不允许空值,线程安全


 6,map获取元素的两种迭代方法

            a,通过Keyset来遍历,先获取到keyset集合,然后在获取keyset的iterator,用iterator遍历就可以了

public static void map_method1(){//map的迭代方法有两种Map<String, String> m = new HashMap<String, String>();m.put("name", "mingren");m.put("name1", "mingren1");m.put("name2", "mingren1");m.put("name3", "mingren2");//方法一Set<String> s = m.keySet();Iterator<String> it = s.iterator();while(it.hasNext()){sop(m.get(it.next()));
}}

             b,通过Map.Entryset来遍历,先获取Map.Entry的集合,然后再获取entry的iterator,用iterator遍历就可以了

public static void map_method1(){//map的迭代方法有两种Map<String, String> m = new HashMap<String, String>();m.put("name", "mingren");m.put("name1", "mingren1");m.put("name2", "mingren1");m.put("name3", "mingren2");//方法二Set<Entry<String, String>> s2 = m.entrySet();Iterator<Entry<String, String>> it2 = s2.iterator();while(it2.hasNext()){Entry<String, String> temp = it2.next();sop(temp.getKey()+": "+temp.getValue());}}

验证结果:




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

原创粉丝点击