黑马程序员----java基础---集合总结

来源:互联网 发布:淘宝搜索数据查询 编辑:程序博客网 时间:2024/05/16 11:11

------<a  target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------

黑马程序员----java基础---集合总结

一、数组、集合

数组、集合:都是一种容器,用一个对象管理多个对象;

数组:不能自动增长;只能存放同类型的元素

集合:能自动扩容;部分集合允许存放不同类型的元素;

二、学习这些集合类要掌握哪些东西:

1)怎样得到(选择)集合对象;

2)怎样添加元素

3)怎样删除元素

4)怎样循环遍历没一个元素

三、listsetmap

collection:父接口;

Set:接口 ---一个实现类: HashSet

List:接口---三个实现类: LinkedList,Vector,ArrayList

SortedSet:接口---实现类:TreeSet

1List:

List:有序列表,允许存放重复的元素;

实现类:

ArrayList:数组实现,查询快,增删慢,线程不安全,轻量级;下标也是从0开始;

LinkedList:链表实现,增删快,查询慢

Vector:数组实现,线程安全,重量级

2.Set:

无序集合,不允许存放重复的元素;

实现类 HashSetequals返回truehashCode返回相同的整数;哈希表;

 

子接口SortedSet:对Set排序 实现类 :TreeSet:二叉树实现的;

API<E> 泛型:表示一个对象;

Iterator:接口,迭代器;

java.util

hasNext();

next();

remove();

Iterable:可迭代的,访问的 

java.lang;实现了可迭代的接口就可以用迭代的方式访问;

只需实现 iterator();方法即可;Iterator iterator();

三种循环的访问方式:

for(int i=0;i<list.size();i++){

System.out.println(list.get(i));

}

 

Iterator it=list.iterator();

while(it.hasNext()){

System.out.println(it.next());

}

 

for--each 循环:

for(Object obj:list){

System.out.println(obj);

}

 

 

只有实现了Iterable接口的才能用第三种;能用第二种的也一定能用第三种;

ArrayList:自动扩容,是数组照搬过来的;

3.Map

HashMap:键值对,key不能重复,但是value可以重复;key的实现就是HashSetvalue对应着放;

HashSet 的后台有一个HashMap;初始化后台容量;只不过生成一个HashSet的话,系统只提供key的访问;

如果有两个Key重复,那么会覆盖之前的;

 

Hashtable:线程安全的

Properties:java.util.Properties; keyvalue都是String类型,用来读配置文件;

 

HashMapHashtable区别:

HashMap线程不安全的,允许null作为keyvalue;

Hashtable线程安全的,不允许null作为keyvalue;

 

TreeMap: key排好序的Map; key 就是TreeSet, value对应每个key;

key要实现Comparable接口或TreeMap有自己的构造器;

HashSet:remove(Object o)的原则看这个对象OHashcodeequals是否相等,并不是看是不是一个对象;

定义一个Map; key是课程名称,valueInteger表示选课人数;

map.put(cou,map.get(cou)+new Integer(1));

四、HashtableProperties

1Hashtable:实现了Map接口,此类实现一个哈希表,作用和HashMap相同。任何非 null 对象都可以用作键或值。为了成功地在哈希表中存储和获取对象,用作键的对象必须实现 hashCode 方法和 equals 法。

 

2Properties:继承自Hashtable,比 Hashtable 更严格 属性列表中每个键及其对应值都是一个字符串。

常用方法 String getProperty(String?key)  setProperty(String key,String value);

用法:我在C盘下建了一个名为 yy.dat 的文件,文件的内容为:

name=hehe

password=12345

执行以下程序,输出 hehe,可见用 Properties 可以很方便的解析配置文件

Properties p = new Properties();

p.load(new FileInputStream("C:\\yy.dat"));

System.out.println(p.getProperty("name"))

五、两个工具类 Arrays  Collections

1.Arrays、此类包含用来操作数组(比如排序和搜索)的各种方法。此类还包含一个允许将数组作为列表来查看的静态工厂

2.Collections、主要提供了在 collection 上进行操作的静态方法

六、遗留的几个类

1.Hashtable, 作用和HashMap相同,不过它是线程安全的,如果不需要线程安全,应该使用HashMap

2.Enumeration, 遗留集合使用枚举接口来遍历元素,它有两个方法, hasMoreElementsnextElement,用法类似Iterator

3.Stack,继承自Vector,实现了栈的功能,提供了push()方法押栈 pop()方法出栈。

4.BitSet, 位集。如果需要高效率的存储一个位序列,例如一个标志序列,请使用位集。它可以对各个位进行

    读取 get(i)

 设置 set(i)

    清楚 clear(i)

举个例子:

view plaincopy to clipboardprint?

1.    import java.util.*;   

2.   

public class Sieve { public static void main(String[] s) {

 int n = 2000000;

 long start = System.currentTimeMillis();

BitSet b = new BitSet(n + 1);

int count = 0;

int i;

for (i = 2; i <= n; i++) b.set(i); i = 2;

while (i * i <= n) { if (b.get(i)) {

count++; int k = 2 * i;

while (k <= n) {

 b.clear(k); k += i;

}

}

 i++;

}

while (i <= n) {

 if (b.get(i)) count++; i++;

}

long end = System.currentTimeMillis();

System.out.println(count + " primes");

System.out.println((end - start) + " milliseconds");

}

} 

 

 

七、常见笔试题目汇总

1.Collection  Collections的区别。

  Collection是集合类的上级接口,继承与他的接口主要有Set List.

Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。

 

2.List, Set, Map是否继承自Collection接口?

ListSet是,Map不是

 

3.两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对?

不对,有相同的hash code

 

4.你所知道的集合类都有哪些?主要方法?

最常用的集合类是 List  Map List 的具体实现包括 ArrayList  Vector,它们是可变大小的列表,比较适合构建、存储和操作任何类型对象的元素列表。 List 适用于按数值索引访问元素的情形。

Map 提供了一个更通用的元素存储方法。 Map 集合类用于存储元素对(称作""""),其中每个键映射到一个值。

 

5.排序都有哪几种方法?请列举。用JAVA实现一个快速排序。

排序的方法有:插入排序(直接插入排序、希尔排序),交换排序(冒泡排序、快速排序),选择排序(直接选择排序、堆排序),归并排序,分配排序(箱排序、基数排序)

快速排序的伪代码。

/ /使用快速排序方法对a[ 0 :n- 1 ]排序

a[ 0 :n- 1 ]中选择一个元素作为m i d d l e,该元素为支点

把余下的元素分割为两段left r i g h t,使得l e f t中的元素都小于等于支点,而right 中的元素都大于等于支点

递归地使用快速排序方法对left 进行排序

递归地使用快速排序方法对right 进行排序

所得结果为l e f t + m i d d l e + r i g h t

 

6.HashMap Hashtable 的区别

都属于Map 接口的类,实现了将惟一键映射到特定的值上。

HashMap 类没有分类或者排序。它允许一个null 键和多个null 值。

Hashtable 类似于HashMap,但是不允许null 键和null 值。它也比HashMap 慢,因为它是同步的。

 

7.Set 里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用= =还是equals()? 它们有何区别?

Set 里的元素是不能重复的,那么用iterator()方法来区分重复与否。

equals()是判读两个Set 是否相等。

equals()==方法决定引用值是否指向同一对象equals()在类中被覆盖,为的是当两个分离的对象的内容和类型相配的话,返回真值。

 

8.介绍JAVA中的Collection FrameWork(包括如何写自己的数据结构)? 

  Collection

  List(以特定次序来持有元素,可有重复元素)

  │├LinkedList

  │├ArrayList

  │└Vector

  │ └Stack

  Set(无法拥有重复元素,内部排序)

  Map(保存key-value值,value可多值)

  Hashtable

  HashMap

  WeakHashMap

  Collections是针对集合类的一个帮助类

package com.collection;

import java.util.ArrayList;

import java.util.Collection;

import java.util.HashSet;

import java.util.Iterator;

public class TestCollection {

 static String a="a";

 static String g="q";

 static String q="w";

 static String w="g";

 static String z="n";

 

 public static void main(String args[]){

  Collection<String> c=new HashSet<String>();

  c.add(a);

  c.add(g);

  c.add(w);

  c.add(z);

  System.out.println(c);

  Collection<String> d=new ArrayList<String>(c);

  boolean b=c.contains("a");

  System.out.println(b);

  

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

  while(iterator.hasNext()){

   System.out.println(iterator.next());

  }

  System.out.println("---------1---------");

  

  for(Iterator<String> i=c.iterator();i.hasNext();){

   System.out.println(i.next());

   

  }

  System.out.println("---------2---------");


  for(String word:c){

   System.out.println(word);

  }

  System.out.println("---------3---------");

 } 

}

集合应用:斗地主


package cn.itcast.doudizhu;
/*
 * 集合,模拟斗地主,牌盒,洗牌,发牌,看牌
 *   牌盒-- 容器,存储的54个,点数+花色 -- ArrayList存储就是54个字符串
 *    A2345678910JQK  - 花色
 *    A2345678910JQK  - 花色
 *    A2345678910JQK  - 花色
 *    A2345678910JQK  - 花色
 *    花色存储到数组,长度4个
 *    点数存储到数组,13个
 */
import java.util.*;
public class DouDiZhuDemo {
public static void main(String[] args) {
//创建存储牌盒集合
ArrayList<String> paihe = new ArrayList<String>();
//花色存储成数组,字符串数组
String[] colors = {"♠","♥","♦","♣"};
//点数存储成字符串数组
String[] numbers = {"A","2","3","4","5","6","7","8","9","10","J","Q","K"};
//遍历数组,一个花色,遍历出13个点数
for(String color : colors){
for(String number : numbers){
paihe.add(color+number);
}
}
paihe.add("小王");
paihe.add("大王");
//洗牌
Collections.shuffle(paihe);
//发牌
//创建三个玩家集合
ArrayList<String> player1 = new ArrayList<String>();
ArrayList<String> player2 = new ArrayList<String>();
ArrayList<String> player3 = new ArrayList<String>();
//创建底牌集合
ArrayList<String> dipai = new ArrayList<String>();
//对牌盒进行带索引遍历,对索引进行取模运算,实现发牌
for(int x = 0 ; x < paihe.size() ; x++){
//索引012的牌,存储到底牌中
if(x < 3)
dipai.add(paihe.get(x));
else if( x % 3 == 0)
player1.add(paihe.get(x));
else if( x % 3 == 1)
player2.add(paihe.get(x));
else if( x % 3 == 2)
player3.add(paihe.get(x));
}
//看牌: 遍历玩家集合,和底牌集合
kanpai("周星驰",player1);
kanpai("周润发",player2);
kanpai("周杰伦",player3);
kanpai("底牌",dipai);
}
//定义看牌方法,传递集合,遍历
public static void kanpai(String name,ArrayList<String> array){
System.out.print(name+"  ");
for(String s : array){
System.out.print(s+" ");
}
System.out.println();
}
}


0 0
原创粉丝点击