黑马程序员——6.集合类(String/StringBuffer、List、Set、Map、Collections工具类、Arrays工具类 )

——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-

String:

String类的特点:
字符串对象一旦被初始化就不会被改变。

public class StringDemo{
    public static void main(String[] args){
        String s1 = "abc";
        String s2 = "abc";
        System.out.println(s1 == s2);  //结果为true
        /*
        字符串创建的时候,有一个字符串常量池,s1创建后,"abc"放入其中。s2创建的时候,"abc"已经存在于字符串常量池中,故引用变量s2直接指向了已经存在的"abc"字符串对象,故s1==s2。
        */
    }
}
public class StringDemo{
    public static void main(String[] args){
        String s1 = "abc";
        String s2 = new String("abc" );

        System.out.println(s1 == s2);  //结果为false
        /*
        s1创建后,是在字符串常量池中创建了一个"abc"字符串对象。而s2是在堆内存中创建了另外一个"abc"字符串对象。所以,两个对象不是同一个对象。
        */

        System.out.println(s1.equals(s2));  //结果为true
        /*
        String类复写了Object中的equals方法,建立了String类自己的判断字符串对象是否相同的依据。只比较字符串内容,不比较地址。
        */
    }
}
public class StringConstructorDemo {
    public static void main(String[] args){
        StringConstructorDemo1();
    }

    public static void StringConstructorDemo1(){
        String s = new String();//等效于String s = "";不等效于String s = null;

        byte[] arr = {65,66,67,68};

        //通过字节数组创建字符串
        String s1 = new String(arr);
        System.out.println("s1 = " + s1);  //结果为“ABCD”
    }
    public static void StringConstructorDemo2(){
        char[] arr = {'w' ,'a' ,'p' ,'q' ,'x' };

        //通过char数组创建字符串
        String s = new String(arr);
        System.out.println( "s = " + s);  //结果为“wapqx”
    }
    public static void StringConstructorDemo3(){
        char[] arr = {'w' ,'a' ,'p' ,'q' ,'x' };

        //通过char数组段创建字符串
        String s = new String(arr,1,3);
        System.out.println( "s = " + s);  //结果为“apq”
    }
}

String类部分方法

  1. 获取
    获取字符串中字符的个数(长度)
    int length();

    根据位置获取字符
    char charAt(int index);

    根据字符获取在字符串中的位置
    int indexOf(int ch);
    indexO方法参数f类型为int是为了既可以支持字符,也可以支持字符在ASCII码中对应的数字。

    从指定位置开始查找ch第一次出现的位置。
    int indexOf(int ch,int fromIndex);
    int indexOf(String str);
    int indexOf(String str,int fromIndex);

    根据字符串获取在字符串中第一次出现的位置。
    int lastIndexOf(int ch);
    int lastIndexOf(int ch,int fromIndex);
    int lastIndexOf(String str);
    int lastIndexOf(String str,int fromIndex);

    获取字符串中的一部分字符串,也叫子串。
    String substring(int beginIndex,int endIndex);
    String substring(int beginIndex);

  2. 转换
    将字符串变成字符串数组(字符串的切割)
    String[] split(String regex);涉及到正则表达式。

    将字符串变成字符数组
    char[] toCharArray();

    将字符串变成字节数组
    char[] getBytes();

    将字符串中的字母转成大小写
    String toUpperCase();大写
    String toLowerCase();小写

    将字符串中的内容进行替换
    String replace(char oldCh,char newCh);
    String replace(String s1,String s2);

    去除字符串两端空格
    String trim();

    将字符串进行连接
    String concat(String str);

    将其他类型数据转换成字符串
    String.valueOf(boolean/char/double/float/int/long/Object);

  3. 判断
    两个字符串内容是否相同呢?
    boolean equals(Object obj);
    boolean equalsIgnoreCase(String str);忽略大小写比较字符串内容。

    字符串中是否包含指定字符串
    boolean contains(String str);

    字符串是否以指定字符串开头,是否以指定字符串结尾
    boolean startsWith(String str);
    boolean endsWith(String str);

  4. 比较
    int compareTo(String str);
    如果参数字符串等于此字符串,则返回值0;如果此字符串按字典顺序小于字符串参数,则返回一个小于0的值;如果此字符串按字典顺序大于字符串参数,则返回一个大于0的值。

  5. 返回字符串对象的规范化表示形式
    String intern();
    当调用intern方法时,如果池已经包含一个等于此String对象的字符串(用equals(Object)方法确定),则返回池中的字符串。否则,将此String对象添加到池中,并返回此String对象的引用。

StringBuffer:

就是字符串缓冲区,用于存储数据的容器。

特点:

  1. 长度是可变的。
  2. 可以存储不同类型数据。
  3. 最终要转成字符串进行使用。

P.S.
StringBuffer的字符串缓冲区初始容量为16个字符,其实质还是数组。

  1. 添加
    StringBuffer append(data);
    StringBuffer insert(index,data);

  2. 删除
    StringBuffer delete(int start,int end);包含头,不包含尾。
    StringBuffer deleteCharAt(int index):删除指定位置的元素。

  3. 查找
    char charAt(int index);
    int indexO(String str);
    int lastIndexOf(String str);

  4. 修改
    StringBuffer replace(int start,int end,String str);
    void setCharAt(int index,char ch);

  5. 其他方法
    void setLength(int newLength);设置字符序列的长度
    public StringBuffer reverse();将字符序列用其反转形式取代

P.S.

  1. 使用setLength设置StringBuffer中字符序列的长度。
    如果小于已有字符序列的长度,相当于清除缓冲区中的一部分内容。
    如果大于已有字符序列的长度,相当于扩充缓冲区,扩充部门内容用空格字符填充。
  2. 当创建的StringBuffer内容长度大于16,将会新创建一个新数组,长度比旧数组要长。然后把就数组的内容拷贝到新的数组,超出旧数组长度范围的内容将会放在新数组现在内容的后面,也可以通过StringBuffer(int capacity);构造函数自己设置StringBuffer缓冲区长度。

StringBuilder

jdk1.5以后出现了功能和StringBuffer一模一样的对象,就是StringBuilder。

不同的是:
StringBuffer是线程同步的,通常用于多线程。
StringBuilder是线程不同步的,通常用于单线程,它的出现能够提高程序效率。

故StringBuilder用于多个线程是不安全的,如果需要这样的同步,则建议使用StringBuffer。

集合类

是一个容器,用来存储对象的,

集合容器因为内部的数据结构不同,有多种具体容器。
不断的向上抽取,就形成了集合框架。

跟数组的不同:
数组长度是固定的,集合长度可变;数组可以存储基本数据类型,而集合存储只能存储对象

集合框架的构成及分类:
这里写图片描述

框架的顶层Collection接口的共性方法:

Collection的常见方法:

  1. 添加:
    boolean add(Object obj); //添加元素
    boolean addAll(Collection coll); //添加另一个集合中的所有元素过来

  2. 删除:
    boolean remove(Object obj); //删除元素
    boolean removeAll(Collection coll); //从集合中去除掉两集合的交集
    void clear(); //清空集合

  3. 判断:
    boolean contains(Object obj); //判断是否包含该元素
    boolean containsAll(Collection coll); //判断是否包含某集合的所有元素
    boolean isEmpty(); //判断集合是否为空

  4. 获取:
    int size(); //获取集合的元素个数
    Iterator iterator(); //获取集合的迭代器

    • 取出元素的方式:迭代器
      Iterator接口就是对所有的Collection容器进行元素取出的公共接口。
  5. 其他:
    boolean retainAll(Collection coll); //取交集
    Object toArray(); //将集合转成数组

集合类的数据结构:

List:元素是有序的,元素可以重复,因为List里有索引
Set:元素是无序的,元素不可以重复,因为Set里没有索引

集合类构成:
这里写图片描述

List:特有的常见方法。

有一个共性特点就是都可以操作角标。

  1. 添加
    void add(index,element); //在index角标位添加元素
    void addAll(index,collection); //在角标位添加整个集合的元素

  2. 删除
    Object remove(index); //删除并返回index角标位上的元素

  3. 修改
    Object set(index,element); //修改并返回index角标位处的元素

  4. 获取:
    Object get(index); //获取index角标位的元素
    int indexOf(object); //获取object元素出现的第一个角标位
    int lastIndexOf(object); //获取object元素出现的最后一个角标位
    List subList(from,to); //获取子集合

List集合可以完成对元素的增删改查。

import java.util.*;

public class ListDemo{
       public static void main(String[] args){
            List list = new ArrayList();
            show(list);
      }

       public static void show(List list){
             //添加元素
            list.add( "abc1" );
            list.add( "abc2" );
            list.add( "abc3" );

            System.out.println(list);

             //插入元素
            list.add(1, "abc2" );

             //删除元素
            System.out.println( "remove:" + list.remove(2));

             //修改元素
            System.out.println( "set:" + list.set(1,"abc8" ));

             //获取元素:
            System.out.println( "get:" + list.get(0));

             //获取子列表
            System.out.println( "sublist:" + list.subList(1,2));

            System.out.println(list);

            //使用迭代器取出元素
            Iterator it = list.iterator();
            while(it.hasNext()){
                 System.out.println( "next:" + it.next());
            }

            //list特有的取出元素的方式之一
            for(int x = 0; x < list.size(); x++){
                 System.out.println( "get:" + list.get(x));
      }
}

在迭代器过程中,不要使用集合操作元素,容易出现异常:java.util.ConcurrentModificationException。

可以使用Iterator接口的子接口ListIterator来完成在迭代中对元素进行更多的操作。

import java.util.*;

public class ListDemo{
    public static void main(String[] args){
        List list = new ArrayList();

        list.add( "abc1");
        list.add( "abc2");
        list.add( "abc3");

        System.out.println( "list:" + list);

        //获取列表迭代器对象
        //它可以实现在迭代过程中完成对元素的增删改查
        //注意:只有list集合具备该迭代功能
        ListIterator it = list.listIterator(); 

        while(it.hasNext()){
            Object obj = it.next();

            //只有ListIterator才可以在迭代中对元素进行添加删除等操作
            if(obj.equals("abc3" )){
                it.add( "abc9");
        }
    }

        System.out.println( "hasNext:" + it.hasNext());
        System.out.println( "hasPrevious:" + it.hasPrevious());

        //指针到达末尾后,逆向获取元素
        while(it.hasPrevious()){
            System.out.println( "previous:" + it.previous());
        }
        System.out.println( "list:" + list);
    }
}

注意:在使用迭代器操作集合时要只使用迭代器的方法,不要在迭代途中使用集合操作。

ArrayList:

ArrayList中的方法与上面List接口的方法一致

    import java.util.*;

    //创建Person类
    class Person{
           private String name;
           private int age;

           public Person(){
          }

           public Person(String name,int age){
                 this.name = name;
                 this.age = age;
          }

           public void setName(String name){
                 this.name = name;
          }

           public String getName(){
                 return this .name;
          }

           public void setAge(int age){
                 this.age = age;
          }

           public int getAge(){
                 return this .age;
          }
    }

    public class ArrayListTest{
           public static void main(String[] args){
                ArrayList al = new ArrayList();

                //添加元素
                al.add( new Person("lisi1" ,21));
                al.add( new Person("lisi2" ,22));
                al.add( new Person("lisi3" ,23));
                al.add( new Person("lisi4" ,24));

                //进行迭代
                Iterator it = al.iterator();
                 while(it.hasNext()){
                      Person p = (Person)(it.next());
                      System.out.println(p.getName() + ":" + p.getAge());
                }
          }
    }

LinkedList方法:

LinkList除了有List的共性方法外,还有特有方法

addFirst();//添加元素到头部
addLast();

jdk1.6版本后新方法:

offerFirst(); //与addFirst方法没有区别。
offerLast(); //与addLast方法没有区别。


getFirst();//获取但不移除,如果链表为空,抛出NoSuchElementException。
getLast();

jdk1.6版本后新方法:

peekFirst();//获取但不移除,如果链表为空,返回null。
peekLast();


removeFirst();//获取并移除,如果链表为空,抛出NoSuchElementException。
removeLast();

jdk1.6版本后新方法:

pollFirst();//获取并移除,如果链表为空,返回null;
pollLast();

import java.util.*;

public class LinkedListDemo{
    public static void main(String[] args){
        LinkedList link = new LinkedList();

        link.addFirst( "abc1");
        link.addFirst( "abc2");
        link.addFirst( "abc3");
        link.addFirst( "abc4");

        Iterator it = link.iterator();
        while(it.hasNext()){
            System.out.println( "next:" + it.next());
        }

        System.out.println(link);

        //获取第一个,但是不删除。
        System.out.println("getFirst:" + link.getFirst()); 
        System.out.println("getLast:" + link.getLast());

        //获取第一个,并删除
        System.out.println("removeFirst:" + link.removeFirst()); 
        System.out.println("removeLast:" + link.removeLast());

        //删除所有元素的方法
        while(!link.isEmpty()){
            System.out.println(link.removeFirst());
        }
    }
}

Set:元素不可以重复,是无序的。

Set接口中的方法和Collection一致。

|–HashSet:内部数据结构是哈希表,是不同步的
|–TreeSet:内部数据结构是二叉树,可以对Set集合中的元素进行排序,是不同步的

HashSet:

哈希表确定元素是否相同

  1. 判断的是两个元素的哈希值是否相同。如果相同,再判断两个对象的内容是否相同。
  2. 判断哈希值相同,其实判断的是对象的HashCode方法。判断内容相同,用的是equals方法。
  3. 存储元素时为了防止哈希值重复,一般会重写HashCode方法,需要时,也要重写equals方法。
import java.util.*;

class Person{
       private String name;
       private int age;

       public Person(){
      }

       public Person(String name,int age){
             this.name = name;
             this.age = age;
      }

       public void setName(String name){
             this.name = name;
      }

       public String getName(){
             return this .name;
      }

       public void setAge(int age){
             this.age = age;
      }

       public int getAge(){
             return this .age;
      }

       //重写hashCode方法,防止哈希值相同
       public int hashCode(){
             return name.hashCode() + age * 39;
      }

       //重写equals方法,自定义比较方法
       public boolean equals(Object obj){

            //同一个对象放两次,直接返回true
            if(this == obj)
                  return true ;

            if(!(obj instanceof Person))
                  throw new ClassCastException("类型错误");

            //因为传进来的是Object对象,要强转
            Person p = (Person)obj;

            //name与age相同就视为同一个人
            return this.name.equals(p.name) && this.age == p.age;
      }
}

public class HashSetTest{
       public static void main(String[] args){
            HashSet hs = new HashSet();

            hs.add( new Person("lisi4" ,24));
            hs.add( new Person("lisi7" ,27));
            hs.add( new Person("lisi1" ,21));
            hs.add( new Person("lisi9" ,29));
            hs.add( new Person("lisi7" ,27));

            Iterator it = hs.iterator();

             while(it.hasNext()){
                  Person p = (Person)it.next();
                  System.out.println(p.getName() + "..." + p.getAge());
            }
      }
}

无序变有序,使用LinkHashSet

    import java.util.*;

    public class LinkedHashSetDemo{
           public static void main(String[] args){
                HashSet hs = new LinkedHashSet();

                hs.add( "hahaa");
                hs.add( "hehe");
                hs.add( "heihei");
                hs.add( "xixii");

                Iterator it = hs.iterator();

                 while(it.hasNext()){
                      System.out.println(it.next());
                }
          }
    }

TreeSet:

TreeSet判断元素唯一性的方式:就是根据比较方法的返回结果是否是0,是0,就是相同元素,不存。

二叉树存元素时

  1. 元素自身需要具备比较性,不具备比较性的元素需要实现comparable接口,实现compareTo(元素)(返回0相等,-1小于,1大于)方法,否则没办法排序,会出错(比较时,如果主要元素相同,要再比较次要元素)。
  2. 让集合自身具备比较功能,当元素不具备比较性,或者具有的比较性不是我们需要的时候,可以让容器在创建时就传入一个比较器,该比较器应该实现Comparator接口,覆盖compare()方法。

当两种方式都存在时,以比较器为主。

import java.util.*;

//不具备比较性的类要实现Comparable接口
class Person implements Comparable{
       private String name;
       private int age;

       public Person(){
      }

       public Person(String name,int age){
             this.name = name;
             this.age = age;
      }

       public void setName(String name){
             this.name = name;
      }

       public String getName(){
             return this .name;
      }

       public void setAge(int age){
             this.age = age;
      }

       public int getAge(){
             return this .age;
      }

       public int hashCode(){
             return name.hashCode() + age * 39;
      }

       public boolean equals(Object obj){
             if(this == obj)
                   return true ;

             if(!(obj instanceof Person))
                   throw new ClassCastException("类型错误");

            Person p = (Person)obj;

             return this .name.equals(p.name) && this.age == p.age;
      }

       //重写比较方法
       public int compareTo(Object o){
            Person p = (Person)o;

             //先按照年龄排序,再按照年龄排序,以免年龄相同的人,没有存进去。
             int temp = this.age - p.age;
             return temp == 0?this.name.compareTo(p.name):temp;
      }
}

public class TreeSetDemo{
       public static void main(String[] args){
            TreeSet ts = new TreeSet();

             //以Person对象年龄进行从小到大的排序
            ts.add( new Person("zhangsan" ,28));
            ts.add( new Person("wangwu" ,23));
            ts.add( new Person("lisi" ,21));
            ts.add( new Person("zhouqi" ,29));
            ts.add( new Person("zhaoliu" ,25));

            Iterator it = ts.iterator();

             while(it.hasNext()){
                  Person p = (Person)it.next();

                  System.out.println(p.getName() + ":" + p.getAge());
            }
      }
}

传入比较器:

import java.util.*;

//创建了一个根据Person类的name进行排序的比较器。
//该比较器要实现Comparator接口
class ComparatorByName implements Comparator{

       //覆盖compare方法
       public int compare(Object o1,Object o2){
            Person p1 = (Person)o1;
            Person p2 = (Person)o2;

            //先比较姓名,再比较年龄
            int temp = p1.getName().compareTo(p2.getName());
            return temp == 0?p1.getAge()-p2.getAge() : temp;
      }
}

public class TreeSetDemo{
       public static void main(String[] args){
            //创建集合时把比较器对象作为参数传递进去
            TreeSet ts = new TreeSet(new ComparatorByName());

             //以Person对象年龄进行从小到大的排序
            ts.add( new Person("zhangsan" ,28));
            ts.add( new Person("wangwu" ,23));
            ts.add( new Person("lisi" ,21));
            ts.add( new Person("zhouqi" ,29));
            ts.add( new Person("zhaoliu" ,25));

            Iterator it = ts.iterator();

             while(it.hasNext()){
                  Person p = (Person)it.next();

                  System.out.println(p.getName() + ":" + p.getAge());
            }
      }
}

泛型:

在新建和声明对象的类时,在类的后边加上类型,那么就只有声明的类型的元素能加进该对象里面。
例如:ArrayList<String> a1 = new ArrayList<String>();
具体参见泛型类。

Map:

Map< key,value>:键值对,一次添加一对元素,一个键对映一个值,不能有重复的键

Map也称为双列集合,Collection集合称为单列集合。
在有映射关系时可以优先考虑使用Map,在查表法中的应用较为多见。

常用方法:

  1. 添加。
    put(key,value) //添加一对键值对
    putAll(Map) //添加一个Map集合的所有键值对

  2. 删除。
    clear() //清空集合
    remove(key) //删除该键对应的键值对

  3. 判断。
    containsValue(value) //判断是否含有该值
    containsKey(key) //判断是否含有该键
    isEmpty() //判断集合是否为空

  4. 获取。
    get(key) //通过键获取元素对象
    size() //获取集合元素个数
    values() //获取值的Set集合
    keySet() //获取键的Set集合
    entrySet() //获取该集合的映射关系Set集合

import java.util.*;

public class MapDemo{
       public static void main(String[] args){
            Map<Integer,String> map = new HashMap<Integer,String>();
             method(map);
      }

       public static void method(Map<Integer,String> map){ //学号和姓名
             //添加元素
            System. out.println(map.put(8,"旺财" ));
            System. out.println(map.put(8,"小强" ));
            System. out.println(map);

            map.put(2, "张三");
            map.put(7, "赵六");
            System. out.println(map);

             //删除
            System. out.println("remove:" + map.remove(2));

             //判断
            System. out.println("containsKey:" + map.containsKey(7));

             //获取
            System. out.println("get:" + map.get(7));
      }
}

获取Map集合元素并打印:

import java.util.*;

public class MapDemo{
       public static void main(String[] args){
            Map<Integer,String> map = new HashMap<Integer,String>();
            method(map);
      }

       public static void method(Map<Integer,String> map){
            map.put(8, "王五");
            map.put(2, "赵六");
            map.put(7, "小强");
            map.put(6, "旺财");

             /*
             原理,通过keySet方法获取map中所有的键所在的set集合,在通过set的迭代器获取到每一个键。
             再对每一个键通过map集合的get方法获取其对应的值即可。
             */

            Set<Integer> keySet = map.keySet();
            Iterator<Integer> it = keySet.iterator();

             while(it.hasNext()){
                  Integer key = it.next();
                  String value = map.get(key);
                  System.out.println(key + ":" + value);
            }

            /*
            通过Map转成Set就可以迭代。
            找到了另一个方法,entrySet。
            该方法将键和值的映射关系作为对象存储到了Set集合中,而这个映射关系的类型就是Map.Entry类型
            */
            Set<Map.Entry<Integer,String>> entrySet = map.entrySet();

            Iterator<Map.Entry<Integer,String>> it = entrySet.iterator();

             while(it.hasNext()){
                  Map.Entry<Integer,String> me = it.next();
                  Integer key = me.getKey();
                  String value = me.getValue();
                  System. out.println(key + ":" + value);
             }
             /*
             直接通过values方法获取map中所有的值所在的set集合
             */
             Collection<String> values = map.values();

             Iterator<String> it = values.iterator();
             while(it.hasNext()){
                  System. out.println(it.next());
            }
      }
}

Map常用的子类:

|–Hashtable:内部结构是哈希表,是同步的。不允许null作为键,null作为值。
—- |–Properties:用来存储键值对型的配置文件的信息,可以和IO技术相结合。
|–HashMap:内部结构式哈希表,不是同步的。允许null作为键,null作为值。
—- |–LinkedHashMap:跟原来存入的顺序是一致的
|–TreeMap:内部结构式二叉树,不是同步的。可以对Map结合中的键进行排序。

HashMap:

    import java.util.*;

    class Student {
           private String name;
           private int age;

           public Student(){
          }

           public Student(String name,int age){
                 this.name = name;
                 this.age = age;
          }

           public void setName(String name){
                 this.name = name;
          }

           public String getName(){
                 return this .name;
          }

           public void setAge(int age){
                 this.age = age;
          }

           public int getAge(){
                 return this .age;
          }

           //复写hashCode方法
           public int hashCode() {
                 final int prime = 31;
                 int result = 1;
                result = prime * result + age;
                result = prime * result + ((name == null) ? 0 : name.hashCode());
                 return result;
          }

           //复写equals方法
           public boolean equals(Object obj) {
                 if (this == obj)
                       return true ;
                 if (obj == null)
                       return false ;
                 if (getClass() != obj.getClass())
                       return false ;
                Student other = (Student) obj;
                 if (age != other.age)
                       return false ;
                 if (name == null) {
                       if (other.name != null)
                             return false ;
                } else if (!name.equals(other.name))
                       return false ;
                 return true ;
          }
    }

    public class HashMapDemo{
           public static void main(String[] args){

                 //将学生对象和学生的归属地通过键与值存储到map集合中
                HashMap<Student,String> hm = new HashMap<Student,String>();

                hm.put( new Student("lisi" ,38),"北京");
                hm.put( new Student("zhaoliu" ,24),"上海");
                hm.put( new Student("xiaoqiang" ,31),"沈阳");
                hm.put( new Student("wangcai" ,28),"大连");
                hm.put( new Student("zhaoliu" ,24),"铁岭");

                //通过获取key集合的迭代器取出元素
                Iterator<Student> it = hm.keySet().iterator();

                 while(it.hasNext()){
                      Student key = it.next();
                      String value = hm.get(key);
                      System.out.println(key.getName() + ":" + key.getAge() + "---" + value);
                }
          }
    }

传入比较器:

import java.util.*;

//实现Comparator接口
class ComparatorByName implements Comparator<Student>{

       //实现比较方法
       public int compare(Student s1,Student s2){
             int temp = s1.getName().compareTo(s2.getName());
             return temp == 0?s1.getAge() - s2.getAge():temp;
      }
}

public class HashMapDemo{
       public static void main(String[] args){

             //将比较器作为参数传入构造函数
            TreeMap<Student,String> tm = new TreeMap<Student,String>(new ComparatorByName());

            tm.put( new Student("lisi" ,38),"北京");
            tm.put( new Student("zhaoliu" ,24),"上海");
            tm.put( new Student("xiaoqiang" ,31),"沈阳");
            tm.put( new Student("wangcai" ,28),"大连");
            tm.put( new Student("zhaoliu" ,24),"铁岭");

            //通过Map.Entry集合取出元素
            Iterator<Map.Entry<Student,String>> it = tm.entrySet().iterator();

             while(it.hasNext()){
                  Map.Entry<Student,String> me = it.next();
                  Student key = me.getKey();
                  String value = me.getValue();
                  System.out.println(key.getName() + ":" + key.getAge() + "---" + value);
            }
      }
}

Collections工具类:

import java.util.*;

public class CollectionsDemo{
       public static void main(String[] args){
             demo1();
      }

       public static void demo1(){
            List<String> list = new ArrayList<String>();

            list.add( "abcde");
            list.add( "cba");
            list.add( "aa");
            list.add( "zzz");
            list.add( "cba");
            list.add( "nbaa");

             //对list集合按照自然顺序的排序
            Collections. sort(list);
            System. out.println(list);

            //对list集合进行指定顺序的排序
            Collections. sort(list,new ComparatorByLength());
            System. out.println(list);

            //使用二分搜索法搜索列表,获得对象坐标(不存在则为:-插入点坐标-1)
            int index = Collections.binarySearch(list,"aaa");
            System.out.println( "index = " + index);

             //获取最大值
            String max = Collections.max(list, new ComparatorByLength());
            System.out.println( "max = " + max);


            //Collections.reverseOrder()返回强行逆转自然顺序的比较器
            TreeSet<String> ts1 = new TreeSet<String>(Collections.reverseOrder());

            //返回强行逆转了比较器顺序的比较器
            ts1 = new TreeSet<String>(Collections.reverseOrder(new ComparatorByLength()));

            ts1.add( "abc");
            ts1.add( "hahaha");
            ts1.add( "zzz");
            ts1.add( "aa");
            ts1.add( "cba");

            System.out.println(ts1);

            //全部替换
            Collections. replaceAll(list,"cba", "nba");
            System. out.println(list);

            //随机打乱集合列表中元素顺序
            Collections. shuffle(list);
            System. out.println(list);


       }


class ComparatorByLength implements Comparator<String>{
       public int compare(String o1,String o2){
             int temp = o1.length() - o2.length();
             return temp == 0?o1.compareTo(o2):temp;
      }
}

Arrays工具类 :

import java.util.*;

class ArraysDemo{
    public static void main(String[] args){
        int[] arr = {3,1,5,6,4,7};

        //返回数组的字符串表现形式
        System.out.println(Arrays.toString(arr));


        /*将数组转换成集合

        好处:可以使用集合的方法操作数组
        数组的长度是固定的,所以对于结合的增删方法是不可以使用的,否则,会发生异常
        如果数组中的元素是对象,那么转成集合时,直接将数组中的元素作为集合中的元素进行集合存储。
        如果数组中的元素是基本类型数值,那么会将该数组作为集合中的元素进行存储
        */
        //把数组中元素存进集合
        String[] arr1 = { "abc","haha" ,"xixi" };
        List<String> list = Arrays. asList(arr1);
        boolean b = list.contains("xixi" );
        System. out.println(b);

        //数组中元素是基本数据类型,把数组作为集合中元素存进集合
        int[] arr1 = {31,11,51,61};
        List< int[]> list1 = Arrays.asList(arr1);
        System.out.println(list1);

        //数组中元素不是基本数据类型,把数组中元素作为集合中的元素进行存储
        Integer[] arr2 = {31,11,51,61};
        List list2 = Arrays.asList(arr2);
        System.out.println(list2);

        /*
         集合转数组

         集合转成数组,可以对集合中的元素操作的方法进行限定,不允许对其进行增删。

         toArray方法需要传入一个指定类型的数组。
         长度该如何定义呢?
         如果长度小于集合的size,那么该方法会创建一个同类型并和集合相同的size的数组。
         如果长度大于集合的size,那么该方法就会使用指定的数组,存储集合中的元素,其他位置默认为null。
         所以建议,最后长度就指定为,集合的size。
        */
        List<String> list = new ArrayList<String>();
        list.add( "abc1");
        list.add( "abc2");
        list.add( "abc3");

        String[] arr = list.toArray(new String[2]);

        System.out.println(Arrays.toString(arr));
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值