黑马程序员-----java基础(集合)

-----------android培训java培训、java学习型技术博客、期待与您交流!------------ 

一集合。

1,java是一种面向对象的语言,如果我们要针对多个对象进行操作,就必须对多个对象进行存储。

而对多个元素进行存储,数组的长度是固定的,不能满足元素变化的要求,所以java提供了集合供使用。

2,集合的特点

1、长度可以发生改变
2、只能存储对象
3、可以存储多种类型对象(一般存储的还是同一种)

3,集合和数组的区别

1、长度问题
数组固定
集合可变
2、存储元素问题
数组可以是基本类型,也可以是引用类型。
集合只能是引用类型。
3、是否同一类型
数组元素类型一致。
集合元素类型可以不一致。

4,集合体系的由来

集合是存储多个元素的容器,但是,由于数据结构不同,java就提供了多种集合类。

而这多种集合类有共性的功能,所以,通过不断的向上抽取,最终形成了集合体系结构。

数据结构:数据存储的方式。

程序 = 算法 + 数据结构

如何学习和使用一个继承体系呢?
学习顶层:因为顶层定义的是共性内容。
使用底层:因为底层才是具体的实现。

二,Collection的功能

1、添加功能(掌握)
boolean add(Object obj):向集合中添加一个元素。
boolean addAll(Collection c):向集合中添加一个集合的元素。
2、删除功能(掌握)
void clear():删除集合中所有的元素。
boolean remove(Object obj):删除集合中指定的元素。
boolean removeAll(Collection c):删除集合中指定的集合元素。
3、判断功能(掌握)
boolean isEmpty():判断集合是否为空。
boolean contains(Object obj):判断集合是否包含指定的元素。
boolean containsAll(Collection c):判断集合是否包含指定的集合中的元素。
4、遍历功能(掌握)
Iterator iterator():迭代器。
hasNext():判断是否还有元素
next():获取下一个元素
5、长度功能(掌握)
int size():获得集合的元素个数。
6、交集功能
boolean retainAll(Collection c):判断集合中是否有相同的元素。
7、转换功能
Object[] toArray():把 集合变成数组。

迭代器的使用
1、使用步骤
1、通过集合对象获取迭代器对象。
2、通过迭代器对象判断。
3、通过迭代器对象获取。
2、迭代器原理
由于多种集合的数据结构不同,所以存储方式不同,所以,取出方式也不同。
这个时候,我们就把判断和获取功能定义在了一个接口中,将来,遍历哪种
集合的时候,只要该集合内部实现这个接口即可。

集合的常见使用步骤:
1、创建集合对象
2、创建元素对象
3、把元素添加到集合中
4、遍历集合
1、通过集合对象获取迭代器对象。
2、通过迭代器对象判断。
3、通过迭代器对象获取。

迭代的常见操作

        hasNext();//有下一个元素,返回真

        next();//取出下一个元素

        remove();//移除

三。List

元素有序(指存储顺序和取出顺序是否一致),可重复。

 List的特有功能
1、添加功能
void add(int index,Object obj): 
2、删除功能
Object remove(int index): 
3、修改功能
Object set(int index,Object obj): 
4、获取功能
Object get(int index): 
int indexOf(Object obj): 
ListIterator listIterator():
List的遍历方式
1、Iterator迭代器
2、ListIterator迭代器(了解)
3、普通for+get()
ListIterator迭代器 (列表迭代器)
是Iterator的子接口。

并发修改异常 concurrentModificationException

当我们通过迭代器迭代元素过程中,又通过集合去添加元素是不允许的,因为迭代器依赖集合存在,

如果集合发生改变,迭代器也会发生改变,迭代器没变,集合变就会报错。

通过迭代器遍历集合,不能通过集合去增删

解决办法

1可以全部通过集合操作,元素添加到最后,通过for遍历时候,通过集合操作

2可以通过迭代器操作,元素添加到遍历的元素后面通过迭代器对集合进行操作

LinkedList 

LinkedList:底层使用的是链表数据结构。特点:增删速度很快,查询稍慢。线程不安全,效率高。

特有方法:

1、增加

        addFirst();

        addLast();

2、获取

        //获取元素,但不删除元素。如果集合中没有元素,会出现NoSuchElementException

        getFirst();

        getLast();

3、删除

        //获取元素,并删除元素。如果集合中没有元素,会出现NoSuchElementException

        removeFirst();

        removeLast();

添加功能如果每个元素都是用First,遍历就是倒过来的。


Vector :底层使用的是数组数据结构。特点:查询速度快,增删速度慢。线程安全,效率低。

ArrayList:底层使用的是数组数据结构。特点:查询速度快,增删速度慢。线程不安全,效率高。


四,Set

Set:元素是无序(存入和取出的顺序不一定一致),元素不可以重复。

HashSet:底层数据结构是哈希表,线程不安全,效率高。保证元素唯一性的原理是:判断元素Hashcode值是否相,

如果相同继续判断equals方法是否为true。

TreeSet:底层数据结构是二叉树,线程不安全,效率高。对元素进行排序可实现:

A:自然排序(元素具备比较性)TreeSet的无参构造,要求对象所属的类实现Comparable接口。

B:比较器排序(集合具备比较性)TreeSet的带参构造,要求构造方法接收一个实现了Comparator接口的对象。


五,Map

1 Map是一个键值对形式的集合。它的元素都是有键和值组成。

 

2 MapCollection的区别?(面试题)

A:Map 是由键值对组成的集合,Map的键(key)是唯一的,(value)可以重复。

B:Collection 是有单列数据组成的集合,它的儿子List是可以重复的,Set是唯一的。

 

3 HashMapHashtable的区别?(面试题)

HashMap:线程不安全,效率高。允许null键和值。

Hashtable:线程安全,效率低。不允许null键和值。

Map的功能

1、添加

        Vput(K key,V value);//添加元素,如果出现添加时,相同的键,那么后添加的值会覆盖原有键对应值,并put方法会返回被覆盖的 值。

        voidputAll(Map <? extends K,? extends V> m);//添加一个集合

2、删除

        clear();//清空

        Vremove(Object key);//删除指定键值对

3、判断

        containsKey(Objectkey);//判断键是否存在

        containsValue(Objectvalue)//判断值是否存在

        isEmpty();//判断是否为空

4、获取

        Vget(Object key);//通过键获取对应的值

        size();//获取集合的长度

        Collection<V>value();//获取Map集合中所以得值,返回一个Collection集合

Map集合遍历方式:

     A:丈夫找妻子 

     1:把所有丈夫给集合起来。Set<K> ketSet()

     2:遍历丈夫集合,获取到每一个丈夫。增强for , 迭代器

     3:让丈夫去找妻子。getObject key

     B:根据结婚证找丈夫和妻子(理解,别人写你能看懂即可)

     1:获取所有结婚证的集合。Set<> entrySet()

     2:遍历结婚证集合,获取到每一个结婚证对象。迭代器,增强for

     3:通过结婚证对象获取丈夫和妻子getKey()getValue()

public class HashMapDemo {
	public static void main(String[] args) {
		// 创建集合对象
		HashMap<String, String> hm = new HashMap<String, String>();

		// 创建并添加元素
		hm.put("刘备", "孙尚香");
		hm.put("曹操", "卞氏");
		hm.put("孙权", "步练氏");

		// 遍历
		Set<String> set = hm.keySet();
		for (String key : set) {
			String value = hm.get(key);
			System.out.println(key + "***" + value);
		}

		System.out.println("---------------------");
		// 遍历2
		Set<Map.Entry<String, String>> hmSet = hm.entrySet();
		for (Map.Entry<String, String> me : hmSet) {
			String key = me.getKey();
			String value = me.getValue();
			System.out.println(key + "***" + value);
		}
	}
}



习题:"cbxzbvavdvgd"获取字符串中,每一个字母出现次数:"a(1)b(2)c(1)d(2)g(1)v(3)x(1)z(1)"
  思路:
A:把字符串变成字符数组。
  B:定义一个TreeMap集合。Character做键,Integer做值。
  C:遍历字符数组,获取到每一个字符。
  D:拿到该字符,到TreeMap集合中找对应的值
  E:根据返回值是否为null
   是:存储,把次数记录为1
   否:把数据++,然后重写存储
  F:把TreeMap的数据拼接成一个字符串。
public class TreeMapDemo {
	public static void main(String[] args) {
		String s = "cbxzbvavdvgd";

		// 把字符串变成字符数组。
		char[] chs = s.toCharArray();

		// 定义一个TreeMap集合。Character做键,Integer做值。
		TreeMap<Character, Integer> tm = new TreeMap<Character, Integer>();

		// 遍历字符数组,获取到每一个字符。
		for (Character ch : chs) {
			// 拿到该字符,到TreeMap集合中找对应的值
			Integer i = tm.get(ch);

			// 根据返回值是否为null
			// 是:存储,把次数记录为1
			// 否:把数据++,然后重写存储
			if (i == null) {
				tm.put(ch, 1);
			} else {
				i++;
				tm.put(ch, i);
			}
		}

		// System.out.println(tm);

		// 把TreeMap的数据拼接成一个字符串。
		StringBuilder sb = new StringBuilder();
		Set<Character> set = tm.keySet();
		for (Character ch : set) {
			Integer i = tm.get(ch);
			sb.append(ch).append("(").append(i).append(")");
		}

		String result = sb.toString();
		System.out.println(result);
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值