Android数据结构

两个引子:

String的compareTo()方法返回值
compareTo()的返回值是整型,它是先比较对应字符的大小(ASCII码顺序),如果第一个字符和参数的第一个字符不等,结束比较,返回他们之间的 
差值,如果第一个字符和参数的第一个字符相等,则以第二个字符和参数的第二个字符做比较,以此类推,直至比较的字符或被比较的字符有一方 
全比较完,这时就比较字符的长度. 
例: 
String s1 = "abc"; 
String s2 = "abcd"; 
String s3 = "abcdfg"; 
String s4 = "1bcdfg"; 
String s5 = "cdfg"; 
System.out.println( s1.compareTo(s2) ); // -1 (前面相等,s1长度小1) 
System.out.println( s1.compareTo(s3) ); // -3 (前面相等,s1长度小3) 
System.out.println( s1.compareTo(s4) ); // 48 ("a"的ASCII码是97,"1"的的ASCII码是49,所以返回48) 
System.out.println( s1.compareTo(s5) ); // -2 ("a"的ASCII码是97,"c"的ASCII码是99,所以返回-2)

泛型

E - Element (参数类型,在集合中使用,因为集合中存放的是元素) T - Type(Java 类)

 K - Key(键)V - Value(值)N - Number(数值类型)? -  表示不确定的java类型

 S、U、V  - 2nd、3rd、4th types

Object跟这些标记符代表的java类型有啥区别呢?  

Object是所有类的根类,任何类的对象都可以设置给该Object引用变量,使用的时候可能需要类型强制转换,但是用使用了泛型T、E等这些标识符后,在实际用之前类型就已经确定了,不需要再进行类型强制转换。

List<?> list1;
List<E> list2;
List<Object> list3;     
第一种使用了“?”,这样声明的List不能向里面add元素,“?”代表某种未知类型。我们传递给add的任何参数都必须是这种未知类型的子类型。因为我们不知道它是什么类型,所以我们无法传递任何内容。唯一的例外是null,它是每种类型的成员。

第二种使用了“E”,我们可以指定E的类型,然后add对象,也可以简单粗暴地把对象强转成“E”类型,这样做不好,没什么意义。

第三种使用了“Object”,则任何类型的对象都可以add

综上所述,“?”不能等同于“Object”
 

关于集合选取原则
     是否是键值对象形式:
         是:Map
             键是否需要排序:
                 是:TreeMap
                 否:HashMap
             不知道,就使用HashMap
         否:Collection
             元素是否唯一:
                 是:Set
                     元素是否需要排序:
                         是:TreeSet
                         否:HashSet
                     不知道,就使用HashSet
                  否:List
                     要安全吗:
                         是:Vector
                         否:ArrayList或者LinkedList
                             增删多:LinkedList
                             查询多:ArrayList
                         不知道,就使用ArrayList
             不知道,就使用ArrayList

关于增强for循环,需要注意的是,使用增强for循环无法访问数组下标值,对于集合的遍历其内部采用的也是Iterator的相关方法。如果只做简单遍历读取,增强for循环确实减轻不少的代码量。

集合的常见方法及遍历方式
     Collection:
         add()
         remove()
         contains()
         iterator()
         size()
         遍历:
             增强for(for each)
             迭代器
             普通(传统)for

    private static void setTest() {
        Set<String> set = new HashSet<String>();
        set.add("JAVA");
        set.add("C");
        set.add("C++");
        // 重复的加不进去。
        set.add("JAVA");
        set.add("JAVASCRIPT");
        //set集合遍历方法1,使用iterator
        Iterator<String> it = set.iterator();
        while (it.hasNext()) {
            String value = it.next();
            System.out.println(value);
        }
        //set集合遍历方法2,使用增强for循环。
        for(String s: set){
            System.out.println(s);
        }
    }

    // 遍历list集合
    private static void listTest() {
        List<String> list = new ArrayList<String>();
        list.add("java111");
        list.add("java222");
        list.add("java333");
        // 遍历方式1 ,使用iterator
        Iterator<String> it = list.iterator();
        while (it.hasNext()) {
            String value = it.next();
            System.out.println(value);
        }
        // 遍历方法2 , 使用传统for循环进行遍历。
        for (int i = 0, size = list.size(); i < size; i++) {
            String value = list.get(i);
            System.out.println(value);
        }
        // 遍历方法3 , 使用增强for循环进行遍历。
        for (String value : list) {
            System.out.println(value);
        }
    }

     Map:
         put()
         remove()
         containskey(),containsValue()
         keySet()
         get()
         value()
         entrySet()
         size()
         遍历:
             根据键找值
             根据键值对对象分别找键和值

  public static void main(String[] args) {
        // 创建一个HashMap对象,并加入了一些键值对。
        Map<String, String> maps = new HashMap<String, String>();
        maps.put("111", "java111");
        maps.put("222", "java222");
        maps.put("333", "java333");
        maps.put("444", "java444");
        maps.put("555", "java555");
        
        // 传统的遍历map集合的方法1; keySet()
        //traditionalMethod1(maps);
        // 传统的遍历map集合的方法2; entrySet()
        //traditionalMethod2(maps);
        // 使用增强For循环来遍历map集合方法1; keySet()
        //strongForMethod1(maps);
        // 使用增强For循环来遍历map集合方法2; entrySet()
        strongForMethod2(maps);
    }

    private static void strongForMethod2(Map<String, String> maps) {
        Set<Entry<String, String>> set = maps.entrySet();
        for (Entry<String, String> entry : set) {
            String key = entry.getKey();
            String value = entry.getValue();
            System.out.println(key + " : " + value);
        }
    }

    private static void strongForMethod1(Map<String, String> maps) {
        Set<String> set = maps.keySet();
        for (String s : set) {
            String key = s;
            String value = maps.get(s);
            System.out.println(key + " : " + value);
        }
    }

    // 使用entrySet()方法,获取maps集合中的每一个键值对,
    private static void traditionalMethod2(Map<String, String> maps) {
        Set<Map.Entry<String, String>> sets = maps.entrySet();
        // 取得迭代器遍历出对应的值。
        Iterator<Entry<String, String>> it = sets.iterator();
        while (it.hasNext()) {
            Map.Entry<String, String> entry = (Entry<String, String>) it.next();
            String key = entry.getKey();
            String value = entry.getValue();
            System.out.println(key + " : " + value);
        }
    }

    // 使用keySet()方法,获取maps集合中的所有键,遍历键取得所对应的值。
    private static void traditionalMethod1(Map<String, String> maps) {
        Set<String> sets = maps.keySet();
        // 取得迭代器遍历出对应的值。
        Iterator<String> it = sets.iterator();
        while (it.hasNext()) {
            String key = it.next();
            String value = maps.get(key);
            System.out.println(key + " : " + value);
        }
    }

1、集合
    Collection(单列集合)
        List(有序,可重复)
            ArrayList
                底层数据结构是数组,查询快,增删慢
                线程不安全,效率高
            Vector
                底层数据结构是数组,查询快,增删慢
                线程安全,效率低
            LinkedList
                底层数据结构是链表,查询慢,增删快
                线程不安全,效率高
        Set(无序,唯一)
                HashSet
                底层数据结构是哈希表。
                哈希表依赖两个方法:hashCode()和equals()
                执行顺序:
                    首先判断hashCode()值是否相同
                        是:继续执行equals(),看其返回值
                            是true:说明元素重复,不添加
                            是false:就直接添加到集合
                        否:就直接添加到集合
                最终:
                    自动生成hashCode()和equals()即可
                    
                LinkedHashSet
                    底层数据结构由链表和哈希表组成。
                    由链表保证元素有序。
                    由哈希表保证元素唯一。

               TreeSet
                底层数据结构是红黑树。(是一种自平衡的二叉树)如何保证元素唯一性呢?(任意一条到叶结点的路径不会比其他路径长出2倍)
                如何保证元素唯一性呢?
                    根据比较的返回值是否是0来决定
                如何保证元素的排序呢?
                    两种方式
                        自然排序(元素具备比较性)
                            让元素所属的类实现Comparable接口
                        比较器排序(集合具备比较性)
                            让集合接收一个Comparator的实现类对象
    Map(双列集合)
        A:Map集合的数据结构仅仅针对键有效,与值无关。
        B:存储的是键值对形式的元素,键唯一,值可重复。
        
        HashMap
            底层数据结构是哈希表。线程不安全,效率高
                哈希表依赖两个方法:hashCode()和equals()
                执行顺序:
                    首先判断hashCode()值是否相同
                        是:继续执行equals(),看其返回值
                            是true:说明元素重复,不添加
                            是false:就直接添加到集合
                        否:就直接添加到集合
                最终:
                    自动生成hashCode()和equals()即可
            LinkedHashMap
                底层数据结构由链表和哈希表组成。
                    由链表保证元素有序。
                    由哈希表保证元素唯一。
        Hashtable
            底层数据结构是哈希表。线程安全,效率低
                哈希表依赖两个方法:hashCode()和equals()
                执行顺序:
                    首先判断hashCode()值是否相同
                        是:继续执行equals(),看其返回值
                            是true:说明元素重复,不添加
                            是false:就直接添加到集合
                        否:就直接添加到集合
                最终:
                    自动生成hashCode()和equals()即可
        TreeMap
            底层数据结构是红黑树。(是一种自平衡的二叉树)
                如何保证元素唯一性呢?
                    根据比较的返回值是否是0来决定
                如何保证元素的排序呢?
                    两种方式
                        自然排序(元素具备比较性)
                            让元素所属的类实现Comparable接口
                        比较器排序(集合具备比较性)
                            让集合接收一个Comparator的实现类对象

2:到底使用那种集合(自己补齐)看需求。

     是否是键值对象形式:是:Map键是否需要排序:是:TreeMap否:HashMap不知道,就使用HashMap。否:Collection元素是否唯一:是:Set元素是否需要排序:是:TreeSet否:HashSet不知道,就使用HashSet否:    List要安全吗:是:Vector(其实我们也不用它,后面我们讲解了多线程以后,我在给你回顾用谁)   否:ArrayList或者LinkedList增删多:LinkedList查询多:ArrayList不知道,就使用ArrayList不知道,就使用ArrayList

【存放二维表数据的Java数据结构】
    适合封装多个表中的数据
    1. List<Map>
    2. ArrayList<ArrayList<Object>> 做二维表存储数据
    3. 行列数比较固定可以使用,Object[][]
    4. HashMap<String,ArrayList<String>>     
    适合封装的数据是一个表中数据
    5. ArrayList<Bean>
    6. HashMap<String, String>
       "1-1"   <--->  需要存放的数据

       第"1"个表示行、第二个"1"表示列

注意:数组的性能比List和Map的效率高。我做了的功能是导入excel表格到数据库中多张表,涉及到excel解析。

我使用的是以下的数据结构解决
Map<String, Map<String, List<String>>>
主要:考虑了excel的多个sheet、多个row,一行有多column
 

3:集合的常见方法及遍历方式Collection:add()remove()contains()iterator()size()遍历:增强for迭代器|--Listget()遍历:普通for|--SetMap:put()remove()containskey(),containsValue()keySet()get()value()entrySet()size()遍历:根据键找值根据键值对对象分别找键和值。作业:我讲解过的任意一个集合,我要求你存储什么,你就能够存储什么。并且,还要能够遍历出来。

4:ArrayList,LinkedList,HashSet,HashMap(掌握)存储字符串和自定义对象数据并遍历

5:集合的嵌套遍历(理解)

猜你喜欢

转载自blog.csdn.net/ation_work/article/details/88354408