Java内容梳理(15)API学习(3)集合与泛型

1、集合

(1)集合的作用

集合只能存放对象。比如你存一个 int 型数据 1放入集合中,其实它是自动转换成 Integer 类后存入。

集合存放的是多个对象的引用,对象本身还是放在堆内存中。

集合可以存放不同类型,不限数量的数据类型。

(2)集合类体系

图:https://img-blog.csdn.net/20160124221843905

一般知道:

|- Collection

         |- List : 有序,可重复

                |- ArrayList

                |- Vector

                |- LinkedList

                |- Stack

         |- Set : 无序,不重复

                |- HashSet

                |- TreeSet

                |- Queue

                      |- ArrayListBlockingQueue

                      |- LinkedListBlockingQueue

|- Map

       |- HashMap

       |- TreeMap

 

(3)List集合

(3.1)List集合最后的两兄弟

ArrayList基于动态数组的实现,它长于随机访问元素,但是在中间插入和移除元素时较慢

LinkedList基于链表实现,在List中间进行插入和删除的代价较低,提供了优化的顺序访问。LinkedList在随机访问方面相对比较慢

但是它的特性集较ArrayList更大。即LinkedList可以作为我们最经常使用的两种数据结构来使用:栈和队列,因为LinkedList的实现

一个双向链表,所以无论是FIFO还是FILO都可以实现

(3.2)List集合的遍历(以ArrayList举例)

       普通for循环,可以实现删除某个数据

        List<Integer> a = new ArrayList<Integer>();
        a.add(1);
        a.add(2);
        a.add(3);
        
        /**
         * 过程:第一步:打印1  删除索引为0的数据(a.size()就减一)  2就移到了0的位置上 3就移到了1的位置上
         */
        for(int i=0;i<a.size();i++) {
            System.out.println(a.get(i));
            a.remove(i);
            System.out.println(a.size());
        }

        增强型for循环:不能在遍历的时候,对集合进行删除或添加

        List<Integer> list = new ArrayList<Integer>();

        for(Integer ele : list){

                System.out.print( ele );

                list.remove( ele );  //报错ConcurrentModificationException

         }

       使用迭代器进行遍历,可以边遍历,边删除或添加

       Iterator<String> iterator = list.iterator();

       while( iterator.hasNext() ){

             String data = iterator.next();

             System.out.pintln( data );

             iterator.remove();

       }

(3.3)List集合的排序(以ArrayList类为例)

(1)Collections.sort( List<T> list )默认升序

List<Integer> list = new ArrayList<Integer>();

list.add(2);

list.add(1);

list.add(3);

list.add(4);

list.add(5);

list.add(6);

Collections.sort(list)

System.out.println( list );//[1, 2, 3, 4, 5, 6]

(2)Collections.sort( List<T> list )自定义实现降序,一般在自己定义的元素类中要实现Comparable接口,并且要重写compareto方法

List<Student> list = new ArrayList<Student>();

Student s1 = new Student( "小明",13 );

Student s2 = new Student( "小e",14 );

Student s3 = new Student( "小r",15 );

list.add(s1);

list.add(s2);

list.add(s3);

Collections.sort(list);//按照对象的年龄去排序,降序

System.out.println( list );//[{小r15 }, {小e14 }, {小明13 }]

 

/**

*重写compareto方法:

* 重要的是返回值,若返回正数表示this小,返回负数表示this大

*默认情况下排的是升序,则return this.age - o.age ,this大返回值即为正数,最终排序就将this作为大的数往后排

*现在要排降序,返回值设置成return o.age - this.age; 作用是当this大,返回的是负数,最终排序this是作为小的数放到前面

*/

public int compareTo(Student o) {

return o.age - this.age;

}

(3)比较器Comparetor接口:compare方法实现降序

List<People> list = new ArrayList<People>();

People s1 = new People( "小明",13 );

People s2 = new People( "小e",14 );

People s3 = new People( "小r",15 );

list.add(s1);

list.add(s2);

list.add(s3);

Collections.sort(list, new Comparator<People>(){

//o1的age大,就返回-1,表示o1的age小

public int compare(People o1, People o2) {

return o2.age - o1.age;

}

});

System.out.println( list );//[{小r 15 }, {小e 14 }, {小明13 }]

(4)比较器和利用元素本身比较方法,同时使用时,比较器优先

(3.4)ArrayList对象的创建和常用方法

1.创建对象

ArrayList()

无参构造,创建一个初始大小为size = 10的list集合

ArrayList( int initSize )

创建一个初始化大小为initSize的list集合

ArrayList( Collection c )

将c转换成ArrayList集合

2.泛型

List< String > list = new ArrayList< String >();

注:在JDK1.7版本以上,后部分的String可以不写

一旦定义了该限制,那么该list集合只能存放String类型的数据

3.常用方法

add( E e ):追加数据e到list中

add( int index, E element ):在指定位置插入数据element

list1.addAll( list2 ):把list2中所有元素追加到list1中

clear():清空当前list中的所有数据

contains( Object o ):判断指定的对象o是否存在于当前的list中

get( int index ):取出指定位置上的数据

isEmpty():判断list是否没有元素

remove( int index ):删除指定位置上的元素

remove( object o ):删除与指定对象第一个匹配的元素

set( int index,E element ):替换指定位置上的数据为element,并将原数据返回

size():获取当前list已经存放元素的个数

T[] toArray( T[] a ):将list转换成指定类型的数组

注意:

remove( Object o )和contains( Object o )根据对象中的equals方法来搜索并判

断list中的匹配对象,一般需要重写equals方法,否则默认根据地址值进行匹配判断

(4)HashSet类

(1)特点

无序(存放的元素放在一堆),不重复(可以用来过滤)

(2)创建HashSet对象

HashSet<Integer> h = new HashSet<Integer>();

(3)讨论元素不重复:

1.获取hash值: 先调用给出元素的hashCode方法获得hash值

2.根据hash值定位元素存放位置 : 类似于 hash % table.length

3.判断该位置上是否已经存在元素(这个位置上存放的可能是一个链表)

4.若不存在, 则直接放入次元素;若已存在, 则循环遍历此链表中的每节点,依次调用元素的equals方法进行相等判断;若出现相

等情况,则过滤掉;若未出现相等情况,则追加到此链表中

注意:

1.要想HashSet按照我们的逻辑来过滤掉重复元素,必须同时重写hashCode方法和equals方法

2.为提升HashSet的使用性能, 我们应该尽量保证:当两个对象的hashCode方法返回值相等时一定让他们的equals方法也返回

true;

结论:这样我们就保证了数组中的每个位置只放一个数据, 从而保证HashSet可以指定通过hash值直接定位到具体的某个元素

(4)常用方法

boolean add(E e) 添加元素(会进行重复过滤)

void clear() 从此 set 中移除所有元素。

boolean contains(Object o) 如果此 set 包含指定元素,则返回 true。

boolean isEmpty() 如果此 set 不包含任何元素,则返回 true。

Iterator<E> iterator() 返回对此 set 中元素进行迭代的迭代器。

boolean remove(Object o)如果指定元素存在于此 set 中,则将其移除。

int size() 返回此 set 中的元素的数量(set 的容量)。

(5)遍历Set集合:

增强型for循环

迭代器

(5)HashMap类

(1)什么是Map?

一种以键值对的方式来存放数据的容器

(2)HashMap:

创建对象:new HashMap();

特点:key不重复, value可重复

对比HashSet进行理解

HashSet就是使用的是HashMap的key这部分来存放数据的

(3)常用方法:

put(key, value)  通过hash算法来将此键值对存入对应位置

get(key): 根据key获取对应的value  通过hash算法直接定位键值对的位置取出value

clear

isEmpty

entrySet():  获取该map中的所有键值对

keySet():  获取该map的所有key

values():  获取该map的所有value

(4)遍历:https://www.cnblogs.com/fqfanqi/p/6187085.html

四种方式:

Map<Integer, Integer> map = new HashMap<Integer, Integer>(); 
for (Map.Entry<Integer, Integer> entry : map.entrySet()) { 
  System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue()); 
}
Map<Integer, Integer> map = new HashMap<Integer, Integer>(); 
//遍历map中的键 
for (Integer key : map.keySet()) { 
  System.out.println("Key = " + key); 
} 
//遍历map中的值 
for (Integer value : map.values()) { 
  System.out.println("Value = " + value); 
}
使用Iterator遍历;可以边遍历边删除

使用泛型:
Map<Integer, Integer> map = new HashMap<Integer, Integer>(); 
Iterator<Map.Entry<Integer, Integer>> entries = map.entrySet().iterator(); 
while (entries.hasNext()) { 
  Map.Entry<Integer, Integer> entry = entries.next(); 
  System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue()); 
}


不使用泛型:
Map map = new HashMap(); 
Iterator entries = map.entrySet().iterator(); 
while (entries.hasNext()) { 
  Map.Entry entry = (Map.Entry) entries.next(); 
  Integer key = (Integer)entry.getKey(); 
  Integer value = (Integer)entry.getValue(); 
  System.out.println("Key = " + key + ", Value = " + value); 
}
Map<Integer, Integer> map = new HashMap<Integer, Integer>(); 
for (Integer key : map.keySet()) { 
  Integer value = map.get(key); 
  System.out.println("Key = " + key + ", Value = " + value);

(6)集合转化

(6.1)集合转化成数组

package list_test;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class Run {
	public static void main(String[] args) {
		/**
		 * 将list集合转化成数组
		 */
		List<String> list = new ArrayList<String>();
		list.add("a");
		list.add("b");
		list.add("c");
		
		/**
		 * list.toArray()方法默认返回的是一个Object类型的数组
		 */
		Object[] arr1 = list.toArray();
		System.out.println(Arrays.toString(arr1));//将数组转化成字符串输出
		
		System.out.println("=========分割线==========");
		
		/**
		 * 如何将list集合转化成String类型的数组
		 */
		String[] arr2 = new String[ list.size() ];
		arr2 = list.toArray(arr2);
		System.out.println(Arrays.toString(arr2));
		
	}
}

(6.2)数组转化成集合

list =  Arrays.asList( arr )-------数组转化成List

(6.3)Set和List的转化

Set --> 数组

    set.toArray

Set --> List

    步骤1: arr = set.toArray()

    步骤2: list = Arrays.asList( arr )

List --> Set

    set = new HashSet(list)

数组 --> set

    步骤1: list = Arrays.asList( arr )

    步骤2: set = new HashSet(list)

 

2、泛型

相关链接:https://www.cnblogs.com/zhenyu-go/tag/Java/

 

猜你喜欢

转载自blog.csdn.net/Carl_changxin/article/details/82862568