JAVA语言学习之Collection系列、集合与泛型讲解
小标 2018-09-11 来源 : 阅读 984 评论 0

摘要:本文主要向大家介绍了JAVA语言学习之Collection系列、集合与泛型讲解,通过具体的内容向大家展示,希望对大家学习JAVA语言有所帮助。

本文主要向大家介绍了JAVA语言学习之Collection系列、集合与泛型讲解,通过具体的内容向大家展示,希望对大家学习JAVA语言有所帮助。

Collection系列集合
1. 数组的弊端:
①数组的长度不可变 ②数组中没有提供可以查看有效元素个数的办法
2. 集合的特点:
①集合的长度是可变的
②集合可以添加任意类型的对象
③集合中只能存对象
3.集合框架
java.util.Collection 接口: 是集合层次的根接口
|-- java.util.List 接口:有序的,允许重复的。因为 List 系列集合都具有索引值
|--java.util.ArrayList : 采用的数组结构存储元素。查询操作多时。
|--java.util.LinkedList : 采用的链表结构存储元素。增删操作多时选择。
|--java.util.Vector : 是一个古老的实现。线程安全,因此效率低
|-- java.util.Set 接口: 无序的,不允许重复的。
|--java.util.HashSet:是 Set 接口的典型实现类。
判断元素是否存在的依据是,先比较 hashCode 值,若 hashCode 值不存在
则直接存储,若 hashCode 值存在,再通过 equlas 比较两个对象的内容。
注意:重写 hashCode 和 equals 时二者需要保持一致!
|--java.util.LinkedHashSet:是 HashSet 的子类,相较于 HashSet 多了链表维护元素的顺序。
增删效率低于 HashSet ,查询遍历效率高于 HashSet
|--java.util.TreeSet: 拥有指定的排序方式
自然排序(Comparable):
①需要添加到集合中对象的类实现 Comparable 接口
②实现接口中的 compareTo(Object o1)
定制排序(Comparator):
①声明一个类实现 Comparator 接口
②实现接口中的 compare(Object o1, Object o2){}
③将该实现类的实例作为参数传递给 TreeSet 的构造器
集合的遍历
1. 增强 for 循环
for(被遍历集合中元素的数据类型 变量名 : 被遍历的集合){
}
@Test
public void test1(){
List list = new ArrayList();
list.add("AA");
list.add("BB");
list.add("CC");
list.add("DD");
list.add("EE");
for(Object obj : list){
String str = (String) obj;
System.out.println(str.toLowerCase());
}
}
2. 使用 Iterator 迭代器
@Test
public void test2(){
List list = new ArrayList();
list.add("AA");
list.add("BB");
list.add("CC");
list.add("DD");
list.add("EE");
//①获取当前集合的迭代器
Iterator it = list.iterator();
//②通过 hasNext() 和 next() 方法取出集合中存储的元素
while(it.hasNext()){
Object obj = it.next();
System.out.println(obj);
}
}
3. (了解) ListIterator 列表迭代器 : 是 List 系列集合特有的迭代器
@Test
public void test5(){
List list = new ArrayList();
list.add("AA");
list.add("BB");
list.add("CC");
list.add("DD");
list.add("EE");
//需求:判断若集合中元素为“BB”则在该位置添加一个 “bbb”
/*Iterator it = list.iterator();
while(it.hasNext()){
Object obj = it.next();
if(obj.equals("BB")){
list.add("bbb");
}
}*/
ListIterator li = list.listIterator();
while(li.hasNext()){
Object obj = li.next();
if(obj.equals("BB")){
// li.add("bbbb");
li.set("bbbbbbbbbbb");
}
}
while(li.hasPrevious()){
System.out.println(li.previous());
}
}
 
 
Map 系列映射集合
一、java.util.Map : 用于操作成对对象的集合。具有 key(键)-value(值)映射关系的集合。
一个 key 对应着一个 value,key 不允许重复。
|--java.util.HashMap : 是 Map 接口的典型实现类。线程不安全的,因此效率高。
|--java.util.LinkedHashMap:
|--java.util.Hashtable: 是一个古老的实现。是线程安全的,因此效率低。
|--java.util.Properties:用于操作属性文件
|--java.util.TreeMap:根据 key 拥有指定的排序方式
自然排序(Comparable):
定制排序(Comparator):
@Test
public void test3() throws FileNotFoundException, IOException{
//①创建 Properties 对象
Properties props = new Properties();
//②使用 load() 方法加载属性文件
props.load(new FileInputStream("hello.properties"));
//②使用 getProperty() 方法根据 key 获取对应的 value
String userName = props.getProperty("userName");
String password = props.getProperty("password");
System.out.println(userName);
System.out.println(password);
}
二、Map 的常用方法
添加、删除操作:
Object put(Object key,Object value)
Object remove(Object key)
void putAll(Map t)
void clear()
元素查询的操作:
Object get(Object key)
boolean containsKey(Object key)
boolean containsValue(Object value)
int size()
boolean isEmpty()
boolean equals(Object obj)
元视图操作的方法:
Set keySet()
Collection values()
Set entrySet()
三、遍历 Map 的三种方式:
@Test
public void test4(){
Map map = new HashMap();
map.put("AA", 11);
map.put("BB", 22);
map.put("CC", 33);
map.put("DD", 44);
map.put("EE", 55);
//遍历 Map 的方式一:获取 Map 中所的 key
Set keySet = map.keySet();
for(Object obj : keySet){
String str = (String) obj;
System.out.println(str.toLowerCase());
Object value = map.get(obj);
System.out.println(value);
}
System.out.println("----------------------------------------------");
//遍历 Map 的方式二:获取 Map 中所的 value
Collection values = map.values();
Iterator it = values.iterator();
while(it.hasNext()){
Object obj = it.next();
System.out.println(obj);
}
System.out.println("----------------------------------------------");
//遍历 Map 的方式:获取 Map 中所的 Entry(是 Map 的内部类,一个 Entry 对应着一个 key 和一个 value)
Set entrySet = map.entrySet();
for (Object obj : entrySet) {
Entry entry = (Entry) obj;
Object key = entry.getKey();
Object value = entry.getValue();
System.out.println(key + "=" + value);
}
Iterator iterator = entrySet.iterator();
while(iterator.hasNext()){
Entry entry = (Entry) iterator.next();
Object key = entry.getKey();
Object value = entry.getValue();
System.out.println(key + "=" + value);
}
}

Collections 工具类
一、Collections 工具类:用于操作集合的工具类
排序操作:(均为static方法)
reverse(List):反转 List 中元素的顺序
shuffle(List):对 List 集合元素进行随机排序
sort(List):根据元素的自然顺序对指定 List 集合元素升序排序
sort(List,Comparator):根据指定的 Comparator 产生的顺序对 List 集合元素进行排序
swap(List,int, int):将指定 list 集合中的 i 处元素和 j 处元素进行交换
查找、替换
Object max(Collection):根据元素的自然顺序,返回给定集合中的最大元素
Object max(Collection,Comparator):根据 Comparator 指定的顺序,返回给定集合中的最大元素
Object min(Collection)
Object min(Collection,Comparator)
int frequency(Collection,Object):返回指定集合中指定元素的出现次数
void copy(List dest,List src):将src中的内容复制到dest中
boolean replaceAll(List list,Object oldVal,Object newVal):使用新值替换 List 对象的所旧值
泛型
一、
为什么使用泛型:若集合中不使用泛型,意味着集合中可以添加任意类型的对象
若需要具体到某一个类型时,需要强制类型转换,可能引发 ClassCastException
泛型:是 jdk1.5 后出的特性,泛型在 Java 中以 "<>" 的形式呈现,<> 中写引用数据类型
可以限制集合中存放元素的类型
1. 集合中使用泛型
//集合中使用泛型
@Test
public void test2(){
List list = new ArrayList<>();
list.add("AA");
list.add("BB");
list.add("CC");
for(String str : list){
System.out.println(str.toLowerCase());
}
}
//集合中不使用泛型的弊端
@Test
public void test1(){
List list = new ArrayList();
list.add("AA");
list.add("BB");
list.add("CC");
list.add(11);
for(Object obj : list){
String str = (String) obj;
System.out.println(str.toLowerCase());
}
}
2. 自定义泛型类、接口、方法
class DAO{//T : Type E : Element K : Key V : value R : Return
private List list = new ArrayList();
public void add(T t){
//
}
public T get(){
//
}
//自定义泛型方法
public static R sort(Class clazz){
}
}
DAO.sort("AA");
DAO dao = new DAO();
dao.add(new User());
class UserDAO extends DAO{
}
3.通配符 : 虽然 Student 是 Person 的子类,但是 List 就不是 List 的子类。
意味着不能使用多态,会大大降低程序的灵活性。
List: 可以接收任意类型泛型的集合
List: 可以接收 Person 本类类型的泛型集合及 Person 子类类型的泛型集合
List: 可以接收 Person 本类类型的泛型集合及 Person 父类类型的泛型集合
Student stu = new Student();
Perosn p = stu;//多态
List stuList = new ArrayList<>();
//List perList = stuList; //错误的语法
/*//需求:展示一堆男人吃饭和走路的功能
public static void show(List list){
}
//需求:展示一堆女人吃饭和走路的功能
public static void show(List list){
}*/
public stsatic void show(Listlist){
for(Person person : list){ //多态
person.eat(); //虚拟方法调用
person.walk();
}
}
最后:
集合中的null问题,list中可以存储nall自然不用多说;set中存储的值也可以为null;最最重要的是map中hashmap与linkedhashmap的key与value也都可以为null;注意!!!treemap中的key与value也可以为null,但必须是定制排序的情况下实现Comparator接口中的public int compare(Object o1, Object o2)方法才允许key为null,否则在put数据是会出现——Exception in thread “main”Java.lang.NullPointerException 异常!!!    

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注编程语言JAVA频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 0
看完这篇文章有何感觉?已经有1人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程