A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王震阳老师   /  2014-7-26 21:42  /  12924 人查看  /  148 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

你好吗 来自手机 中级黑马 2014-7-27 23:22:38
41#
来迟了,还差技术分,老师还是先给题吧
回复 使用道具 举报
胥亮 来自手机 中级黑马 2014-7-28 12:56:18
42#
看看题目
回复 使用道具 举报
adent 中级黑马 2014-7-28 15:49:01
43#
来看的时候居然 过期了。。
回复 使用道具 举报
回帖领题
回复 使用道具 举报
领题一份,谢谢:lol
回复 使用道具 举报
huangxuanheng 来自手机 中级黑马 2014-7-29 00:05:50
46#
回帖领题
回复 使用道具 举报
辛苦了,阳哥 !
回复 使用道具 举报
FireWater 发表于 2014-7-27 16:04
总算写完了,请老师批阅

写的很好,还有自己的分析比较。推荐为参考答案。满分!
  1. package cn.itcast.heima;

  2. import java.util.AbstractSet;
  3. import java.util.Collection;
  4. import java.util.HashMap;
  5. import java.util.HashSet;
  6. import java.util.Set;
  7. /*
  8. * 题目:
  9. * 通过查看源码、百度等多种手段学习并理解JavaSE中String、StringBuilder、ArrayList、HashSet等底层数据结构。
  10. * 要求将每个底层数据结构整理成一段文字并提交(对每个数据结构都能说出详细的原理则可获取满分)。
  11. *
  12. */





  13. public class JavaConstructorDemo {

  14.         public static void main(String[] args) {
  15. //各个类的底层结构见方法体
  16.                 StringDemo();
  17.     StringBuilderDemo();
  18.     ArrayListDemo();
  19.     HashSetDemo();
  20.         }





  21.         private static void StringDemo() {
  22.         /*        String类是java.lang包中的方法,直接继承Object类,它所实现的接口有Serializable, CharSequence, Comparable<String>
  23.      * public final class String extends Object implements Serializable, Comparable<String>, CharSequence
  24.          * String类代表字符串,不可被继承。Java中所有的字符串面值都作为此类的实例实现。
  25.          * 字符串是常量,它们的值在创建之后不能更改。字符串缓冲区支持可变的字符串。因为String对象是不可变的,所以可以共享。
  26.          * String类型是可序列化的,可比较的字符序列。
  27.          * String.class中的序列号如下private static final long serialVersionUID = -6849794470754667710L;
  28.          * 再看一下String类中定义的几个基本field
  29.          *   
  30.       private final char value[]; String的值,String的本质就是char型数组

  31.       private final int offset; 子数组第一个字符的索引
  32.       
  33.       private final int count;  字符串中的字符数量

  34.       private int hash;  对象的hash code
  35.          *
  36.          * 经过上面的分析,其实我们已经能看出String对象的本质是一个经过封装的char型数组,封装后提供了一些方便操作的方法。
  37.          */
  38.                
  39.         }
  40.     private static void StringBuilderDemo() {
  41.         /*
  42.          * java.lang.StringBuilder
  43.          * public final class StringBuilder extends AbstractStringBuilder
  44.          * implements Serializable, CharSequence
  45.          * StringBuilder继承Object类,不能被继承,与String相比没有实现Comparable接口。
  46.          * StringBuilder是一个可变字符序列。一个类似于String的字符串缓冲区,不能被修改,
  47.          * 但通过默写方法调用可以改变该序列的长度和内容,与StringBuffer相比StringBuilder不同步,
  48.          * 在大多数视线中比StringBuffer要快。
  49.          * StringBuilder.class中的构造函数构造了一个不带字符的字符缓冲区,初始容量为16个字符
  50.          *    public StringBuilder() {
  51.               super(16);
  52.         }
  53.          * StringBuilder内部也是一个char数组,这和String内部的存储实现无异,但是StringBuilder的对象可变,与String相比
  54.          * 不用每次创建新对象,效率高。
  55.          *下面举例说明效率差别:
  56.          *
  57.          */
  58.       String s = "";
  59.       long begintime = System.currentTimeMillis();
  60.       for (int i = 1; i <=10000; i++) {
  61.           s+=i;       
  62.         }
  63.       long endtime =System.currentTimeMillis();
  64.       long time =endtime-begintime;
  65.       System.out.println("String方法运行时间:"+time);
  66.       //----------------------------------------
  67.       StringBuilder s1 =new StringBuilder();
  68.       s="";
  69.       begintime =System.currentTimeMillis();
  70.       for(int i =1;i<=10000;i++)
  71.       {
  72.               s=""+i;
  73.               s1 = new StringBuilder(s);
  74.       }
  75.       endtime =System.currentTimeMillis();
  76.       time = endtime-begintime;
  77.       System.out.println("StringBuilder运行时间为:"+time);
  78.       
  79.     }
  80.    
  81.     private static void ArrayListDemo() {
  82.             /*
  83.              * public class ArrayList<E>extends AbstractList<E>
  84.              * implements List<E>, RandomAccess, Cloneable, Serializable
  85.              *ArrayList 继承了AbstractList,这个抽象类继承至AbstractCollection,AbstractCollection更像是实现List,Set共同的方法,
  86.              *而AbstractSet、AbstractList更像是提供给Set、List各自特有方法的实现。
  87.              *ArrayList是List接口的大小可变数组的实现。 允许包括null在内的所有元素,除了实现List接口外,此类还提供一些
  88.              * 方法来操作内部用来出村列表的数组的大小,此方法是不同步的,ArrayList替代了Vector
  89.              * 源码中
  90.           private static final long serialVersionUID = 8683452581122892189L;
  91.                           用于标识序列号
  92.              * private transient Object elementData[];
  93.              * 可以看到ArrayList就是一个数组
  94.              * private int size;
  95.                             该列表的大小,也就是元素个数。
  96.          *public ArrayList(int initialCapacity) {
  97.                    super();
  98.                    if (initialCapacity < 0)
  99.            throw new IllegalArgumentException("Illegal Capacity: "+initialCapacity);
  100.                   this.elementData = new Object[initialCapacity];
  101.            }
  102.                           构造函数,初始化内部数组为指定大小,列表是空的。
  103.          * public ArrayList() {
  104.                       this(10);
  105.            }
  106.                             默认初始话内部数组大小为10   
  107.            ArrayList作为数组其查询速度很快  ,因为创建一个数组的时候 ,会在内存中分配一段
  108.                             地址连续的空间,数组名就是这块内存空间的首地址。数组查询时直接找到对应数组名指向的内存空间首地址,
  109.                            查询速度很快。如果根据内容查找Arraylist提供了一些遍历数组查找元素迭代方法 。
  110.                           简单来说 ,ArrayList就是数组的一个封装类                             
  111.                                                   
  112.          *                    
  113.              */
  114.            
  115.     }

  116.    
  117.     private static void HashSetDemo() {
  118.     /*
  119.      * public class HashSet<E>
  120.       extends AbstractSet<E>
  121.        implements Set<E>, Cloneable, java.io.Serializable
  122.      * HashSet继承AbstractSet,AbstractSet继承AbstractCollection这里不做重复。
  123.      * 通过源码可以看出Set提供的方法和Collection指定的方法完全一样。具体区别要从
  124.      * HashSet和TreeSet中体现。
  125.      *   private transient HashMap<E,Object> map;
  126.          private static final Object PRESENT = new Object();
  127.      * 从HashSet定义的属性可以看出HashSet底层是使用HashMap实现的,HashMap基于哈希表,
  128.      * 存储键值对,key不能相同,保证了元素的不重复。PRESENT属性是一个Object对象,且是
  129.      * static和final的,它的用途就是当做Value存进map中
  130.      * 构造方法一:调用默认的HashMap构造方法初始化map
  131.      *    public HashSet() {
  132.               map = new HashMap<E,Object>();
  133.        }
  134.      *  构造方法二:根据给定的Collection参数调用HashMap(int initialCapacity)的构造方法创建一个HashMap,
  135.      * 调用addAll方法将c中的元素添加到HashSet对象中     
  136.      *    public HashSet(Collection<? extends E> c) {
  137.         map = new HashMap<E,Object>(Math.max((int) (c.size()/.75f) + 1, 16));
  138.         addAll(c);
  139.     }
  140.      * 构造方法三:构造一个指定初始化容量和负载因子的HashMap
  141.      public HashSet(int initialCapacity, float loadFactor) {
  142.        map = new HashMap<E,Object>(initialCapacity, loadFactor);
  143.     }
  144.      * 构造方法四:构造一个指定初始化容量的HashMap
  145.      public HashSet(int initialCapacity) {
  146.        map = new HashMap<E,Object>(initialCapacity);
  147. }
  148.      *构造方法五:构造一个指定初始化容量和负载因子的LinkedHashMap
  149.      *dummy参数被忽略,只是用于区分其他的,包含一个int、float参数的构造方法
  150.     HashSet(int initialCapacity, float loadFactor, boolean dummy) {
  151.        map = new LinkedHashMap<E,Object>(initialCapacity, loadFactor);
  152.      *
  153.      *  hash算法的功能:
  154.      *  保证通过一个对象快速找到另一个对象;其算法价值体现在速度,可以保证查询快速执行;  
  155.      *  当从HashSet 中访问元素时,HashSet先计算该元素的hashCode(也就是该对象的hashCode方法返回值),
  156.      *  然后直接到该HashCode对应的位置取出该元素; 在这里对象的hashCode就好比是数组里的索引,但是不是索引
  157.      *
  158.      *  HashSet元素添加:
  159.      *    当向HashSet集合中存入一个元素是,HashSet会调用该对象的HashCode()方法来得到该对象的hashCode值,
  160.      *    判断已经存储在集合中的对象的hashCode值是否与添加的对象的hashCode值一致:若不一致,直接添加进去;
  161.      *    若一致,再进行equals方法比较,equals方法如果返回true,表明对象已经添加进去了,就不会添加新的对象了,否则添加进去;
  162.      *    如果我们重写了equals方法,也要重写hashCode方法,反之亦然。
  163.      *    HashSet集合判断连个元素相等的标准是两个对象通过equals方法比较相等,并且两个对象的hashCode方法返回值也相等。
  164.      *    如果需要某个类的对象保存到HashSet集合中,覆写该类的equals()和hashCode()方法,应该尽量保证两个对象通过equals比较返回true时,他们的hashCode返回也相等。
  165.      * 下例为HashSet功能实现
  166.      *
  167.      */
  168.             Set s = new HashSet();
  169.             s.add(new PersonDemo("王老吉"));
  170.             s.add(new PersonDemo("王老吉"));

  171.             s.add(new PersonDemo("王老吉"));
  172.             System.out.println(s);
  173.     }
  174. }
  175. class PersonDemo{
  176.         private String name;
  177.         public PersonDemo(String name){
  178.                 super();
  179.                 this.name= name;
  180.         }
  181.         public String toString(){
  182.                 return "name="+name;
  183.         }
  184.         public int hashCode(){
  185.                 final int prime= -31;
  186.                 int result =1;
  187.                 result = prime*result+((name==null)? 0:name.hashCode());
  188.                 return result;
  189.         }
  190.        
  191.         @Override
  192.         public boolean equals(Object obj){
  193.                 if(this==obj)
  194.                         return true;
  195.                 if(obj ==null)
  196.                         return false;
  197.                 if(getClass()!=obj.getClass())
  198.                         return false;
  199.                 PersonDemo other  = (PersonDemo)obj;
  200.                 if(name ==null){
  201.                         if(other.name!=null)
  202.                                 return false;
  203.                 }else if(!name.equals(other.name))
  204.                         return false;
  205.                 return true;
  206.                        
  207.                 }
  208.                
  209.         }
复制代码
回复 使用道具 举报
X11 中级黑马 2014-7-29 16:13:43
49#
X11 发表于 2014-7-27 17:09
继续学习,赚取技术分。

老师,非常抱歉。可能压缩的时候出了问题,我重新压了一份。

Test.zip

1.1 KB, 阅读权限: 200, 下载次数: 1

评分

参与人数 1技术分 +1 收起 理由
王震阳老师 + 1 赞一个!

查看全部评分

回复 使用道具 举报
我是不是错过了什么
回复 使用道具 举报
就业指导-王震阳老师 发表于 2014-7-29 15:27
写的很好,还有自己的分析比较。推荐为参考答案。满分!

写的好全啊..
回复 使用道具 举报
路过看看,好像时间错过了
回复 使用道具 举报
来领题了
回复 使用道具 举报
来领题了
回复 使用道具 举报
路过 注水                               。
回复 使用道具 举报
ljl623786058 来自手机 中级黑马 2014-7-30 21:10:23
56#
基础还是相当重要的
回复 使用道具 举报
回帖 看题
回复 使用道具 举报
阳哥  本周的为何还不出来?
回复 使用道具 举报
我看看!!!!
回复 使用道具 举报
yqj 中级黑马 2014-8-3 11:34:17
60#
看看题目
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马