• 扬帆起航,再踏征程(二)


    (尊重劳动成果,转载请注明出处:http://write.blog.csdn.net/postedit/53586469 冷血之心的博客)

    1、各大集合的主要特点:

     

    Map接口和Collection接口是所有集合框架的父接口;

    Collection接口的子接口包括:Set接口和List接口;

    Map接口的实现类主要有:HashMap、TreeMap、Hashtable、ConcurrentHashMap以及Properties等

    Set接口的实现类主要有:HashSet、TreeSet、LinkedHashSet等

    List接口的实现类主要有:ArrayList、LinkedList、Stack以及Vector等

    接口

    简述

    实现

    操作特性

    成员要求

    Set

    成员不能重复

    HashSet

    外部无序地遍历成员

    成员可为任意Object子类的对象,但如果覆盖了equals方法,同时注意修改hashCode方法。

    TreeSet

    外部有序地遍历成员;附加实现了SortedSet, 支持子集等要求顺序的操作

    成员要求实现caparable接口,或者使用 Comparator构造TreeSet。成员一般为同一类型。

    LinkedHashSet

    外部按成员的插入顺序遍历成员

    成员与HashSet成员类似

    List

    提供基于索引的对成员的随机访问

    ArrayList

    提供快速的基于索引的成员访问,对尾部成员的增加和删除支持较好

    成员可为任意Object子类的对象

    LinkedList

    对列表中任何位置的成员的增加和删除支持较好,但对基于索引的成员访问支持性能较差

    成员可为任意Object子类的对象

    Map

    保存键值对成员,基于键找值操作,compareTo或compare方法对键排序

    HashMap

    能满足用户对Map的通用需求

    键成员可为任意Object子类的对象,但如果覆盖了equals方法,同时注意修改hashCode方法。

    TreeMap

    支持对键有序地遍历,使用时建议先用HashMap增加和删除成员,最后从HashMap生成TreeMap;附加实现了SortedMap接口,支持子Map等要求顺序的操作

    键成员要求实现caparable接口,或者使用Comparator构造TreeMap。键成员一般为同一类型。

    LinkedHashMap

    保留键的插入顺序,用equals 方法检查键和值的相等性

    成员可为任意Object子类的对象,但如果覆盖了equals方法,同时注意修改hashCode方法。

    IdentityHashMap

    使用== 来检查键和值的相等性。

    成员使用的是严格相等

    WeakHashMap

    其行为依赖于垃圾回收线程,没有绝对理由则少用

     

     

     

    2、List和Set中去重机制:

    代码如下:

    import java.util.ArrayList;
    import java.util.HashSet;
    
    ]
    public class quChong {
    
    	public static void main(String[] args) {
    		
    		ArrayList<Student> arrayList = new ArrayList<Student>();
    		arrayList.add(new Student(29));
    		
    		HashSet<Student> hashSet = new HashSet<Student>();
    		hashSet.add(new Student(29));
    
    		System.out.println(hashSet.contains(new Student(29)));
    		System.out.println(arrayList.contains(new Student(29)));
    	}
    
    }
    
    class Student{
    	int age;
        public Student(int age){
        	this.age=age;
        }	
        
        @Override
        public boolean equals(Object obj) {
        	if(obj instanceof Student){
        		return ((Student) obj).age==this.age;
        	}else{
        		return false;
        	}
        	
        }
    }

    我们在Student类中重写了equals方法,没有重写hashCode方法,则hashSet.contains(new Student(29)) 输出为false。

    arrayList.contains(new Student(29)) 输出为 true

    原因如下:

    1、对于arraylist来说,当equals方法返回为true时,就会认为是重复元素。

    2、对于hashSet来说,只有equals方法和hashCode方法返回值都为true时,才会认为是重复元素。此例中没有重写hashCode方法。

     

    再来看下JDK中对hashCode方法的解释,可以看出JVM创建的每一个对象,都会根据该对象的内部地址转换出一个整数来作为hashCode的返回值,故如果不重写hashCode方法,两个对象的hashCode返回值不一样。

    hashCode

    public int hashCode()
    返回该对象的哈希码值。支持此方法是为了提高哈希表(例如 java.util.Hashtable 提供的哈希表)的性能。

    hashCode 的常规协定是:

    • 在 Java 应用程序执行期间,在对同一对象多次调用 hashCode 方法时,必须一致地返回相同的整数,前提是将对象进行 equals 比较时所用的信息没有被修改。从某一应用程序的一次执行到同一应用程序的另一次执行,该整数无需保持一致。
    • 如果根据 equals(Object) 方法,两个对象是相等的,那么对这两个对象中的每个对象调用 hashCode 方法都必须生成相同的整数结果。
    • 如果根据 equals(java.lang.Object) 方法,两个对象不相等,那么对这两个对象中的任一对象上调用 hashCode 方法 要求一定生成不同的整数结果。但是,程序员应该意识到,为不相等的对象生成不同整数结果可以提高哈希表的性能。

    实际上,由 Object 类定义的 hashCode 方法确实会针对不同的对象返回不同的整数。(这一般是通过将该对象的内部地址转换成一个整数来实现的,但是 JavaTM 编程语言不需要这种实现技巧。)

    返回:
    此对象的一个哈希码值。

     

     

     

    3、请找出两处以下代码的优化之处:

                    String tem="";
    		for(int i=0;i<arrayList.size();i++){
    			tem+=i;
    		}

    优化点1:如果arrayList已经确定,则可将arrayList.size计算出来,不必每次都在循环中进行计算。

    优化点2:由于使用了String,以上代码会在字符串缓冲池中建立好多个字符串,浪费内存,应该使用StringBuffer或者StringBuilder。

    (2)相似的题目还有:

    以下语句会创建几个字符串对象? 

    String str = “Hello” + “world” + “have a nice day”; 

    答:五个 ,三个标红的毋庸置疑。另外两个也会在字符串缓冲池中被建立哦。

    详见 关于Java中equal函数和==的一些区别做一个总结

    “Hello”、“world”、“Hello world”、“have a nice day”、Hello world have a nice day” 

    (3)String,StringBuffer以及StringBuilder之间的关系

    1) 线程安全 

    StringBuffer 线程安全 
    StringBuilder 线程不安全

     

    2)速度 

    一般情况下,速度从快到慢:StringBuilder>StringBuffer>String,这种比较是相对的,不是绝对的。

    3)总结 

    如果要操作少量的数据用 = String 
    单线程操作字符串缓冲区 下操作大量数据 = StringBuilder 
    多线程操作字符串缓冲区 下操作大量数据 = StringBuffer


     

     

     4、给出两张表,使用SQL语句进行增删改查操作,主要是查询。

    以后注意自己找点SQL语句的笔试题进行定期练习。

     

     

    5、给出一个字符串1234,如何分别打印出以下字符串:

    1234、123、234、23、34、1、2、3、4等

     如果对你有帮助,记得点赞哦~欢迎大家关注我的博客,可以加群交流讨论技术问题哦~

  • 相关阅读:
    u-boot启动流程分析(1)_平台相关部分
    Linux文件系统简介
    PHP将部分内容替换成星号
    自制jQuery焦点图切换简易插件
    一次解决页面特效问题的排查记录
    自制jQuery标签插件
    一套后台管理html模版
    自制jquery可编辑的下拉框
    注册页面的一些记录
    CSS选择器的一些记录
  • 原文地址:https://www.cnblogs.com/lanzhi/p/6467228.html
Copyright © 2020-2023  润新知