黑马程序员——集合类(二)
来源:互联网 发布:来须苍真 知乎 编辑:程序博客网 时间:2024/06/05 05:14
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
●Set:无序,不可以重复元素
HashSet:数据结构是哈希表,线程是非同步的
保证元素唯一性的原理,判断元素的hashCode值是否相同
如果相同,还会继续判断元素的equals方法,是否true
TreeSet:数据结构是二叉树(红黑树)可以对Set集合中的元素进行排序
保证元素唯一性的依据CompareTo方法 return 0
TreeSet排序的第一种方式,让元素自身具备比较性
元素需要实现Comparable接口 重写compareTo方法
这种方式也称为元素的自然顺序,或者叫做默认顺序
TreeSet的第二种排序方式
当元素自身不具备比较性时,或者具备的比较性不是所需要的
这时就需要让集合自身具备比较性
定义了比较器,将比较器对象作为参数传递给TreeSet集合的构造函数
当两种排序都存在时,以比较器为主
定义一个类,实现Comparator接口,覆盖compare方法
★比较字符串 str1.compareTo(str2) ★
★比较比较年龄 return s1.age-s2.age ★
★需要TreeSet按照存入取出元素 元素内compareTo方法返回1即可★
★int num=new Integer(s1.age).compareTo(newInteger(s2.age));★
●泛型:JDK1.5版本以后出现新特性,用于解决安全问题,是一个安全机制
好处:
(1)将运行时期出现问题ClassCastE xception,转移到了编译时期,方便与程 序员解决问题,让运行时期问题减少,安全
(2)避免了强制转换麻烦
泛型格式:通过<>来定义要操作的引用数据类型
在使用java提供的对象时,什么时候写泛型?
通常在集合框架中很常见,只要见到<>就要定义泛型
其实<>就是用来接收类型的
当使用集合时,将集合中要存储的数据类型作为参数传递到<>即可
★泛型类
什么时候定义泛型类?
当类中要操作的引用数据类型不确定时,早期定义Object来完成扩展,现在定义泛型来完成扩展
★泛型方法
泛型类定义的泛型,在整个类中有效。如果被方法使用,那么泛型的对象明确要操作的具体类型后,所有要操作的类型就已经固定了
为了让不同方法可以操作不同类型,而且类型还不确定,那么可以将泛型定义在方法上
特殊之处:
静态方法不可以访问类上定义的泛型
如果静态方法操作的应用数据类型不确定,可以将泛型定义在方法上
★泛型定义在接口
★泛型限定
通配符? ,也可以理解为占位符
? extends E:可以接受E类型或者E的子类型,上限
? super E:可以接受E类型或者E的符类型,下限
上限:定义父类填充子类 类型
下限:一般用于定义迭代器:只需定义父类类型的迭代器,否则面向具体的话,扩展性和维护性不好
/*泛型*/import java.util.ArrayList;import java.util.Iterator;class Person{}class Tool{private Object obj;public Object getObj() {return obj;}public void setObj(Object obj) {this.obj = obj;}}class Utils<QQ>{private QQ q;public QQ getQ() {return q;}public void setQ(QQ q) {this.q = q;}}class Demo<T>{public void show(T t){System.out.println(t);}public <Q> void print(Q q){System.out.println(q);}public static <R> void method(R t){}}interface Inter<T>{void show(T t);}class InerImpl<T> implements Inter<T>{public void show(T t) {// TODO Auto-generated method stub}}public class FanXing {public static void main(String[] args) {}/*泛型通配符*/public static void prinColl(ArrayList<?> al){Iterator<?> it = al.iterator();while(it.hasNext()){System.out.println(it.next());}}/*泛型修饰静态方法*/public static <T> void prinColl1(ArrayList<T> al){Iterator<T> it = al.iterator();while(it.hasNext()){T t = it.next();System.out.println(t);}}/*泛型限定*/public static void prinColl2(ArrayList<? extends Person> al){Iterator<? extends Person> it = al.iterator();while(it.hasNext()){System.out.println(it.next());}}}
●Map集合
该集合存储键值对,一对一对往里存,而且要保证键的唯一性
(1) 添加
put(k key,v value)
putAll(Map<? extends K, ? extends V> m)
(2)删除
clear()
remove(Objectkey)
(3)判断
containsValue(Objectvalue)
containKey(Objectkey)
isEmpty()
(4)获取
get(Objectkey)
size()
values()
entrySet()
keyset()
★Map
|--HashTable:底层是哈希表数据结构,不可以存入null键null值,该集合是线程同 步的,效率低jdk1.0
|--HashMap:底层是哈希表数据结构,允许使用null键null值,该集合是不同步的, 效率高 jdk1.2
|--TreeMap:底层是二叉树数据结构,线程不同步,可以用于给Map集合中的键进行排 序, 和Set很像,其实,Set底层就是使用了Map集合
★HashMap 可以使用get()判断是否存在键 有特殊情况 null
添加元素时,如果出现相同的键,那么后添加的值会覆盖原有的键对应的值, 并put方法返回被覆盖的值
★Map集合的两种取出方式
keySet:将map中所有的键存入Set集合,通过迭代方式取出所有的键,再根据get方法,获取每一个键对应的值
entrySet:
其实Map.Entry也是一个接口,它是Map接口中的一个内部接口 映射项,键值对
●Collections
sort(Listlist)
max()
binarySearch()返回(-(插入点) - 1)。
copy()
fill( )
replaceAll()
reverse()
reverseOrder()
shuffle()
●Arrays:用于操作数组的工具类,里面都是静态方法
asList(T a)数组变集合
把数组变成list集合有什么好处
可以使用集合的思想和方法来操作数组中的元素
注意:将数组变成集合,不可以使用集合的增删方法,因为数组的长度是固定
如果使用了增删,那么会产生UnsupportedOperationException
如果数组中的元素都是对象,那么变成集合时,数组中的元素就直接转成集合中的元素,如果数组中的元素都是基本数据类型,那么会将该数组作为数组中的集合存在
●集合转数组
toArray()
String[] y = x.toArray(new String[0]);
注意,toArray(new Object[0]) 和 toArray() 在功能上是相同的。
当指定类型的数组长度小于了集合的size,那么该方法内部会创建一个新的数组,长度为集合的size。当指定类型的数组长度大雨了集合的size,就不会新创建了数组,而是使用传递进来的数组,所以创建一个刚刚好的数组最优
★为什么要将集合变数组?
为了限定对元素的操作,不需要进行增删
●高级for循环
格式:
for(数据类型 变量名:被遍历的集合或者数组){}只能取出,不能修改
对集合进行遍历
只能获取集合元素,但是不能对集合进行操作
迭代器除了遍历,还可以进行remove集合中元素的动作
如果是用ListIterator,还可以在遍历过程中对集合进行增删改查的动作
★传统for循环和高级for循环有什么区别?
高级for有一个局限性,必须有被遍历的目标
●可变参数
其实就是数组参数的简写形式,不用每一次都手动的建立数组对象,只要将要操作的元素作为参数传递即可,隐式将这些参数封装成了数组
在使用时注意:可变参数一定要定义在参数列表的最后面
●静态导入
importstatic 导入静态成员
/*统计字母出现的次数*/import java.util.HashMap;public class LetterNum {public static void main(String[] args) {String s = "sdfgzxcvasdfxcvdf";HashMap<Character,Integer> hm = new HashMap<Character,Integer>();for (int i = 0; i < s.length(); i++) {int value;if(hm.get(s.charAt(i))==null){hm.put(s.charAt(i), new Integer(1));}else{value = hm.get(s.charAt(i));hm.put(s.charAt(i), new Integer(1+value));}}System.out.println(hm);}}
- 黑马程序员——集合类(二)
- 黑马程序员——集合类(二)
- 黑马程序员——集合框架(二)
- 黑马程序员——集合(二)
- 黑马程序员——集合二
- 黑马程序员——集合(二)
- 黑马程序员——集合(二)
- 黑马程序员——集合基础(二)
- 黑马程序员——集合(二)
- 黑马程序员——集合(二)
- 黑马程序员——集合(二) .
- 黑马程序员笔记——Java集合类二
- 黑马程序员——java基础之集合类(二)
- 黑马程序员—集合
- 黑马程序员—集合
- 黑马程序员—集合
- 黑马程序员—集合
- 黑马程序员—集合
- 用主方法求解递归式
- 2015.11.07_16_03_Linux日志系统syslog
- POJ 2831 次小生成树
- GTK+图形化应用程序开发学习笔记(二十一)—文本框构建
- Linux-dd命令详解
- 黑马程序员——集合类(二)
- JDK安装及环境变量配置
- Dom动态加载
- [LeetCode] Integer to English Words
- Flowing Water
- 一个简单json数据提交实例
- 关于ucosII中断中任务调度
- 关于Flex的MessageBroker Endpoints channels的配置运用
- 顺序表的定义及基本操作