黑马程序员—Java基础—集合

来源:互联网 发布:网络出现问号 编辑:程序博客网 时间:2024/06/05 15:03

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

目录:一、常用对象 二、集合类

一、     常用对象

String

 

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

String类的构造函数
构造函数:String(bytes[] bytes)

 

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);     

P.S.
    可以根据-1,来判断该字符或者字符串是否存在。

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

 

2、转换

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

P.S.
    点在正则表达式中是特殊符号,需要转义。

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

 将字符串变成字节数组

    char[] getBytes();

将字符串中的字母转成大小写

    String toUpperCase();大写
    String toLowerCase();小写

 

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

P.S.
    replace方法如果没有找到要替换的内容,则返回的还是原字符串。

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

将字符串进行连接


    String concat(String str);

P.S.
    concat效果与"+"连接符效果一致,但是效果更高一些。

    将其他类型数据转换成字符串

 

3、判断

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

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

 

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

 

4、比较

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

 P.S.
    "abc"和"aqz"两个字符串比较,'a'和'a'相等,'b' - 'q' = -15,'c'和'z'也就没有必要比较。

    5、返回字符串对象的规范化表示形式

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

 

StringBuffer

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

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

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

    StringBuffer既然是一个容器对象,应该具备什么功能呢?
    1、添加

    StringBuffer append(data);
    StringBuffer insert(index,data);

 

P.S.

    insert方法也可以对字符串进行修改。

 

    2、删除

    StringBuffer delete(intstart,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(intnewLength);设置字符序列的长度

    public StringBufferreverse();将字符序列用其反转形式取代

 

P.S.

    1、使用setLength设置StringBuffer中字符序列的长度。

        如果小于已有字符序列的长度,相当于清除缓冲区中的一部分内容。
        如果大于已有字符序列的长度,相当于扩充缓冲区,扩充部门内容用空格字符填充。

    2、当创建的StringBuffer内容长度大于16,将会新创建一个新数组,长度比旧数组要长。然后把就数组的内容拷贝到新的数组,超出旧数组长度范围的内容将会放在新数组现在内容的后面,也可以通过StringBuffer(int capacity);构造函数自己设置StringBuffer缓冲区长度。

 

 StringBuilder


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

    不同的是:
    StringBuffer是线程同步的,通常用于多线程。
    StringBuilder是线程不同步的,通常用于单线程,它的出现能够提高程序效率。
    故StringBuilder多用于多个线程是不安全的,如果需要这样的同步,则建议使用StringBuffer。

    P.S.
    JDK一般升级目的:
    1、简化书写。
    2、提高效率。
    3、增加安全性。

基本数据类型对象包装类

    为了方便操作基本数据类型值,将其封装成了对象,在对象中定义了属性和行为丰富了该数据的操作。

用于描述该对象的类就称为基本数据类型对象包装类。
    byte       Byte
    short      Short
    int          Integer
    long       Long
    float       Float
    double   Double
    char       Character
    boolean Boolean

    该包装对象主要用于基本类型和字符串之间的转换
    基本类型-->字符串
    1. 基本类型数值+""
    2. 用String类中的静态方法valueOf(基本类型数值);

    字符串-->基本类型
    1. 使用包装类中的静态方法xxxparseXxx("xxx");
        int parseInt(String str);
        long parseLong(String str);
        boolean parseBoolean(String str);
        只有Character没有parse方法。
    2. 如果字符串被Integer进行对象的封装,可使用另一个非静态的方法,intValue。
        将一个Integer对象转成基本数据类型值。
    3. 用Integer的静态方法valueOf(String s);

 

 整数具备不同的进制体现。
    十进制-->其他进制方法:
    String toBinaryString(int i);
    String toOctalString(int i);
    String toHexString(int i);
    String toString(int i,int radix);

 

其他进制-->十进制方法:
    int parseInt(String s,int radix);

二、       集合类

 集合类的由来:
    对象用于封装特有数据,对象多了需要存储;如果对象的个数不确定,就使用集合容器进行存储。

    集合特点:
    1. 用于存储对象的容器。
    2. 集合的长度是可变的。
    3. 集合中不可以存储基本数据类型值。

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

    P.S.
    数组和集合类同是容器,有何不同?
    数组虽然也可以存储对象,但长度是固定的;集合长度是可变的。
    数组中可以存储基本数据类型,集合只能存储对象。

    集合框架的构成及分类:

   


    Collection接口

    框架的顶层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方法在每个容器中的实现方式是不同的。
    对于使用容器者而言,具体的实现不重要,只要通过容器获取到该实现的迭代器的对象即可,也就是iterator方法。
    Iterator接口就是对所有的Collection容器进行元素取出的公共接口。

    5、其他:
    boolean retainAll(Collection coll);取交集
    Object toArray();将集合转成数组

 

List、Set

    Collection
          |--List:有序(存入和取出的顺序一致),元素都有索引(角标),允许重复元素。
          |--Set:元素不能重复,无序。

    List:特有的常见方法。
    有一个共性特点就是都可以操作角标。
    1、添加
          void add(index,element);
          void addAll(index,collection);

    2、删除
          Object remove(index);

    3、修改
          Object set(index,element);

    4、获取:
          Object get(index);
          int indexOf(object);
          int lastIndexOf(object);
          List subList(from,to);

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

在迭代器过程中,不要使用集合操作元素,容易出现异常:java.util.ConcurrentModificationException。
    可以使用Iterator接口的子接口ListIterator来完成在迭代中对元素进行更多的操作。

 

 Vector、ArrayList、LinkedList

    List:
          |--Vector:内部是数组数据结构,是同步的。增删,查询都很慢。
          |--ArrayList:内部是数组数据结构,是不同步的,替代了Vector。替代了Vector,查询的速度快。
          |--LinkedList:内部是链表数据结构,是不同步的。增删元素的速度很快。

    LinkedList方法:
    addFirst();
    addLast();

    jdk1.6版本后新方法:
    offerFirst();与addFirst方法没有区别。
    offerLast();与addLast方法没有区别。
    ---------------------------------------------------------
    getFirst();//获取但不移除,如果链表为空,抛出NoSuchElementException。
    getLast();

    jdk1.6版本后新方法:
    peekFirst();//获取但不移除,如果链表为空,返回null。
    peekLast();
    --------------------------------------------------------
    removeFirst();//获取并移除,如果链表为空,抛出NoSuchElementException。
    removeLast();

    jdk1.6版本后新方法:
    pollFirst();//获取并移除,如果链表为空,返回null;
    pollLast();

请使用LinkedList来模拟一个堆栈或者队列数据结构。

    堆栈:先进后出 First In LastOut FILO
    队列:先进先出 First In First OutFIFO

    我们应该描述这样一个容器,给使用者提供一个容器对象完成这两种结构中的一种。

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

    Set接口中的方法和Collection一致。
    |--HashSet:内部数据结构是哈希表,是不同步的。
    |--TreeSet:可以对Set集合中的元素进行排序,是不同步的。

 

 哈希表确定元素是否相同
    1. 判断的是两个元素的哈希值是否相同。
        如果相同,再判断两个对象的内容是否相同。
    2. 判断哈希值相同,其实判断的是对象的HashCode方法。判断内容相同,用的是equals方法。
    
    P.S.
    如果哈希值不同,不需要判断equals。

    往HashSet集合中存储Person对象。如果姓名和年龄相同,视为同一个人,视为相同元素。

TreeSet对元素进行排序的方式一:    让元素自身具备比较功能,元素就需要实现Comparable接口,覆盖compareTo方法。

    如果不要按照对象中具备的自然顺序进行排序。如果对象中不具备自然顺序。怎么办?
    可以使用TreeSet集合第二种排序方式:
    让集合自身具备比较功能,定义一个类实现Comparator接口,覆盖compare方法。
    将该类对象作为参数传递给TreeSet集合的构造函数。

P.S.

    如果自定义类实现了Comparable接口,并且TreeSet的构造函数中也传入了比较器,那么将以比较器的比较规则为准。
    TreeSet集合的底层是二叉树进行排序的。

 

Map、HashMap、TreeMap

    Map:一次添加一对元素,Collection一次添加一个元素。
    Map也称为双列集合,Collection集合称为单列集合。
    其实Map集合中存储的就是键值对。
    map集合中必须保证键的唯一性。

    常用方法:
    1、添加
    value put(key,value):返回前一个和key关联的值,如果没有返回null。

    2、删除
    void clear():清空map集合。
    value remove(Object key):根据指定的key删除这个键值对。

    3、判断
    boolean containsKey(key);
    boolean containsValue(value);
    boolean isEmpty();

    4、获取
    value get(key):通过键获取值,如果没有该键返回null。
                           当然可以通过返回null,来判断是否包含指定键。
    int size():获取键值对个数。

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

    hashSet实现Set接口,由哈希表(实际上是一个HashMap实例)支持。

Map、HashMap、TreeMap

 

    使用LinkedHashMap则是跟原来存入的顺序是一致的。

Map在有映射关系时,可以优先考虑,在查表法中的应用较为多见。  

Collections工具类

    Collections:是集合框架的工具类,里面的方法都是静态的。

Arrays工具类  

    Arrays:集合框架的工具类,里面的方法都是静态的。

 

重点:List asList(数组)将数组转成集合。

好处:可以使用集合的方法操作数组。

 

 P.S.
    数组的长度是固定的,所以对于结合的增删方法是不可以使用的,否则,会发生UnsupportedOperationException。

 

    数组转集合,用asList方法。
    如果数组中的元素是对象,那么转成集合时,直接将数组中的元素作为集合中的元素进行集合存储。
    如果数组中的元素是基本类型数值,那么会将该数组作为集合中的元素进行存储。

 

集合转数组


    使用的就是Collection接口中的toArray方法。
    集合转成数组,可以对集合中的元素操作的方法进行限定,不允许对其进行增删。

    toArray方法需要传入一个指定类型的数组。
    长度该如何定义呢?
    如果长度小于集合的size,那么该方法会创建一个同类型并和集合相同的size的数组。
    如果长度大于集合的size,那么该方法就会使用指定的数组,存储集合中的元素,其他位置默认为null。
    所以建议,最后长度就指定为,集合的size。


0 0
原创粉丝点击