黑马程序员__集合_List_Set_泛型

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

<集合>

1.集合:集合可以理解为一种容器, 长度可变, 可以存储任意类型的对象。

2.集合的分类:

集合框架的构成及分类:

单列集合:Collection,双列集合:Map。

1).Collection有两个子接口分别是List、Set。

List: 可重复, 有存储顺序,有索引

ArrayList

LinkedList

Vector

Set: 不可重复, 没索引,存取无序

HashSet

TreeSet

LinkedHashSet HashSet的子类

2).Map双列集合

HashMap

TreeMap

Hashtable

LinkedHashMap

3.数组和集合的区别

1).数组既可以存储基本数据类型,也可以存储引用数据类型,存储基本数据类型存储值,存储引用数据类型存储的是地址值,集合只能存储引用数据类型。

2).数组的长度一旦初始化就不可以改变

集合的长度是可变的。

4.集合的常用方法

add(Object obj)    向集合中添加一个元素到最后的位置

get(int index)        获取集合中指定位置的元素

size()                    获取集合的长度

add(int index, Object obj)  向集合中添加一个元素到指定位置

set(int index, Object obj)   把集合中指定位置的元素替换

remove(int index)               删除集合中指定位置的元素

remove(Object obj)            删除集合中包含的obj对象

<List>

1.List有三个子类:ArrayList,LinkedList,Vector。

1).ArrayList

底层数据结构是数组,查询和修改快,增删慢,线程不安全,效率高。

Vector

底层数据结构是数组,与ArrayList相比线程安全,效率低。

LinkedList

底层数据结构是链表,查询和修改慢,增删快,线程不安全,效率高。

LinkedList可以很方便的操作头和尾。

2.迭代集合

for循环:  从0循环到集合的size()-1, 每次获取其中一个

迭代器:    调用iterator()方法获取迭代器, 使用hasNext()判断是否包含下一个元素, 使用next()获取下一个元素

增强for循环:  for (类型 变量名 : 容器) { 循环体 } 容器中有多少个元素就执行多少次循环体, 每次循环变量指向容器中不同的元素(1.5新特性)。

[java] view
plain
copy

  1. <span style="font-size:18px;">class Demo{ </span>

[java] view
plain
copy

  1. <span style="font-size:18px;">        public static void main(String[] args) {
  2. ArrayList list = new ArrayList();
  3. list.add("a");
  4. list.add("b");
  5. list.add("c");
  6. list.add("d");
  7. list.add("e");
  8. for(int i=0;i<list.size();i++){</span>

[java] view
plain
copy

  1. <span style="font-size:18px;">                  System.out.println(list.get(i));} </span>

[java] view
plain
copy

  1. <span style="font-size:18px;">
  2. ListIterator lit = list.listIterator();
  3. while(lit.hasNext()) {
  4. System.out.println(lit.next());
  5. }}</span>

[java] view
plain
copy

  1. <span style="font-size:18px;">           for(Object obj : list){</span>

[java] view
plain
copy

  1. <span style="font-size:18px;">                System.out.println(obj);}
  2. }}</span>

3.删除

[java] view
plain
copy

  1. public class Demo7_Delete {
  2. /**
  3. * @param args
  4. */
  5. public static void main(String[] args) {
  6. //demo1();
  7. ArrayList list = new ArrayList();
  8. list.add("a");
  9. list.add("a");
  10. list.add("b");
  11. list.add("b");
  12. list.add("c");
  13. list.add("d");
  14. /*for(int i = 0; i < list.size(); i++) { //普通for循环可以删除,删除的时候索引要--
  15. Object obj = list.get(i);
  16. if(obj.equals("a")) {
  17. list.remove(i--);
  18. }
  19. }*/
  20. Iterator it = list.iterator();
  21. while(it.hasNext()) {           //迭代可以删除,但是必须用迭代器的删除方法
  22. Object obj = it.next();     //如果用集合的删除方法,会出现并发修改异常ConcurrentModificationException
  23. if(obj.equals("b")) {
  24. //list.remove("b");    //错误
  25. it.remove();
  26. }
  27. }
  28. }

普通for删除

<泛型>(1.5版本的新特性)

1.泛型能将运行时期的错误,转移到了编译时期,去除黄色警告提示,但是只能放该类型或该类型的子类型对象,其他的都不允许放

[java] view
plain
copy

  1. public static void main(String[] args) {
  2. demo1();
  3. ArrayList<Integer> list = new ArrayList<>();        //1.7新特性,菱形泛型
  4. list.add(123);
  5. System.out.println(list);
  6. }
  7. private static void demo1() {
  8. ArrayList<Person> list = new ArrayList<Person>();
  9. list.add("a");
  10. list.add(123);
  11. Iterator<Person> it = list.iterator();
  12. while(it.hasNext()) {
  13. Person p = it.next();
  14. System.out.println(p.getName() + "..." + p.getAge());
  15. }
  16. }
  17. }

<Set>

1.Set      不可重复, 没索引,无序

HashSet               使用哈希算法去重复, 效率高, 但元素无序

TreeSet                TreeSet是用排序的, 可以指定一个顺序, 对象存入之后会按照指定的顺序排列

LinkedHashSet HashSet的子类, 原理相同, 除了去重复之外还能保留存储顺序

2.HashSet(LinkedHashSet)

1).HashSet原理

我们使用Set集合都是需要去掉重复元素的, 如果在存储的时候逐个equals()比较, 效率较低,哈希算法提高了去重复的效率, 降低了使用equals()方法的次数。当HashSet调用add()方法存储对象的时候, 先调用对象的hashCode()方法得到一个哈希值, 然后在集合中查找是否有哈希值相同的对象。如果没有哈希值相同的对象就直接存入集合。 如果有哈希值相同的对象, 就和哈希值相同的对象逐个进行equals()比较,比较结果为false就存入, true则不存。

2).将自定义类的对象存入HashSet去重复

类中必须重写hashCode()和equals()方法。hashCode(): 属性相同的对象返回值必须相同, 属性不同的返回值尽量不同(提高效率)。 equals(): 属性相同返回true, 属性不同返回false,返回false的时候存储。

[java] view
plain
copy

  1. ublic class Person implements Comparable<Person> {   //往TreeSet集合添加自定义类,自定义类需实现Comparable接口
  2. private String name;
  3. private int age;
  4. public Person(){
  5. super();
  6. }
  7. public Person(String name, int age) {
  8. super();
  9. this.name = name;
  10. this.age = age;
  11. }
  12. public String getName() {
  13. return name;
  14. }
  15. public void setName(String name) {
  16. this.name = name;
  17. }
  18. public int getAge() {
  19. return age;
  20. }
  21. public void setAge(int age) {
  22. this.age = age;
  23. }
  24. @Override
  25. public String toString() {
  26. return "Person [name=" + name + ", age=" + age + "]";
  27. }
  28. @Override
  29. public int hashCode() {                   //重写hashCode的方法
  30. final int prime = 31;
  31. int result = 1;
  32. result = prime * result + age;
  33. result = prime * result + ((name == null) ? 0 : name.hashCode());
  34. return result;
  35. }
  36. @Override
  37. public boolean equals(Object obj) {         //重写equals的方法
  38. if (this == obj)
  39. return true;
  40. if (obj == null)
  41. return false;
  42. if (getClass() != obj.getClass())
  43. return false;
  44. Person other = (Person) obj;
  45. if (age != other.age)
  46. return false;
  47. if (name == null) {
  48. if (other.name != null)
  49. return false;
  50. } else if (!name.equals(other.name))
  51. return false;
  52. return true;
  53. }
  54. @Override
  55. public int compareTo(Person o){            //重写compareTo方法
  56. int num=this.age-o.age;
  57. return num==0?this.name.compareTo(o.name):num;
  58. }

3).迭代

调用iterator()方法得到Iterator, 使用hasNext()和next()方法

增强for循环, 只要可以使用Iterator的类都可以用

[java] view
plain
copy

  1. class Demo{
  2. public static void main(System[] args){
  3. HashSet<Person> hs = new HashSet<>()
  4. hs.add(new Person("张三"),23);
  5. hs.add(new Person("李四"),24);
  6. hs.add(new Person("王五"),25);
  7. hs.add(new Person("赵六"),26);
  8. Iterator<Person> it = hs.iterator();
  9. while(it.hasNext()){
  10. System.out.println(it.next());}
  11. }
  12. }
  13. for(Person p : hs){           //增强for循环
  14. System.out.println(p);
  15. }

4.TreeSet

1).TreeSet是用来排序的, 可以指定一个顺序, 对象存入之后会按照指定的顺序排列.

2).使用方式

自然顺序(Comparable)

TreeSet类的add()方法中会把存入的对象提升为Comparable类型,调用对象的compareTo()方法和集合中的对象比较,根据compareTo()方法返回的结果进行存储。

比较器顺序(Comparator)

创建TreeSet的时候可以制定 一个Comparator,如果传入了Comparator的子类对象, 那么TreeSet就会按照比较器中的顺序排序

add()方法内部会自动调用Comparator接口中compare()方法排序

两种方式的区别

TreeSet构造函数什么都不传, 默认按照类中Comparable的顺序,TreeSet如果传入Comparator, 就优先按照Comparator

[java] view
plain
copy

  1. class Demo{
  2. TreeSet<Person> ts = new TreeSet<>(new Comparator(){
  3. public int compare(Person p1 , Person p2){
  4. int num = p1.name.compare(p2.namm);
  5. return num==0?p1.age-p2.age:num}});
  6. ts.add("张三",23);
  7. ts.add("李四",24);
  8. ts.add("王五",25);
  9. ts.add("赵六",26);
  10. System.out.println(ts);}
时间: 2024-12-15 01:32:48

黑马程序员__集合_List_Set_泛型的相关文章

黑马程序员__集合框架总结

------Java培训期待与您交流! ------- 前言: 本文是对Java集合框架做了一个概括性的解说,目的是对Java集合框架体系有个总体认识,如果你想学习具体的接口和类的使用方法,请参看Java API文档. 一.概述 数据结构对程序设计有着深远的影响,在面向过程的C语言中,数据库结构用struct来描述,而在面向对象的编程中,数据结构是用类来描述的,并且包含有对该数据结构操作的方法. 在Java语言中,Java语言的设计者对常用的数据结构和算法做了一些规范(接口)和实现(具体实现接口

黑马程序员——Java集合工具类和泛型

Collections工具类和泛型 Collections和Collection Collections和Collection是不同的,Collections是工具类,用来操作集合的,而Collection是集合接口.Collections中有一系列的静态方法用来操作集合,但是不能更改集合内容.比如不能set()不能remove()元素,可以替换全部元素或者添加同一个元素. static List<String> list =Arrays .asList("one Two three

黑马程序员_集合

集合1.集合和对象数组的区别: 数组的长度不可变,集合的可变: 数组可以存储基本数据类型和对象,集合只能存储对象. 集合的框架图 集合派系的顶层接口Collection1.Collection集合存储对象的方法: add(E e)将元素存储到集合中 addAll(Collection c)将一个集合添加到另外的集合中2.Collection集合提取对象的方法: 通过迭代器iterator中的方法:hasNext()和next()来取出 Iterator it=new iterator(); wh

黑马程序员_Java集合框架

- - - - - android培训.java培训.期待与您交流! - - - - - - 集合框架:用于存储数据的容器. 特点: 对象封装数据,对象多了也需要存储.集合用于存储对象. 对象的个数确定可以使用数组.如果不确定可以用集合.因为集合是可变长度的. 集合和数组的区别: 数组是固定长度的:集合可变长度的. 数组可以存储基本数据类型,也可以存储引用数据类型:集合只能存储引用数据类型. 数组存储的元素必须是同一个数据类型:集合存储的对象可以是不同数据类型. 数据结构:就是容器中存储数据的方

黑马程序员——Java集合基础知识之Map

Map概念 要同时存储两个元素Key和Value,他们之间有映射关系,每个键不能重复,每个键只能映射到一个值. 当数据之间存在映射关系的时候,考虑使用Map集合. Map常用方法 如果添加的键原来有值,后添加的值会覆盖前面的值,并返回之前的值.put会返回来先添加的值,后添加的值会覆盖原有的值. Map tm =new TreeMap(); tm.put (key, value);//MAP没有add tm.remove (key) ;//去除一个key和对应的value,若不存在key返回nu

黑马程序员——Java集合基础知识之Collection

集合基础知识--Collection Java中集合框架由常用的Collection接口和Map接口组成,而Collection接口又有两个子接口,是List接口和Set接口,常用的集合框架由这三个类组成. List接口的功能方法 List的使用最为简单,创建集合,通过add方法添加元素,get方法获取元素,通过迭代器获取元素.List接口存放的数据无序的,添加速度快,但是查询速度慢,因为查询的时候必须遍历,每次都重头开始,效率较低.常用实现类有ArrayList,LinkedList. Lis

黑马程序员---Java集合框架

---------------------- Android开发.java培训.期待与您交流! ---------------------- Java集合框架 集合我们都知道是用来储存对象的容器,那之前的数组不也可以储存对象么,为什么要出现集合呢? 面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,就对对象进行存储,然而集合类中提供很多方便操作对象存储的方法,要比数组更容易操作对象,而且集合的长度是可变的,然而数组长度确实固定不变的,这样不利于对对象的间隔储存.  数组和集

黑马程序员之——Map、泛型、集合框架工具类:Collections,Arrays

第一讲,第二讲:黑马程序员_毕向东_Java基础视频教程第15天-06-集合框架(泛型概述),(泛型使用) 一,泛型了解: 泛型的由来:泛型是JDK1.5版本以后出现的新特性.用于解决安全问题,是一个类型安全机制. 好处:将运行时期出现的问题ClassCastException,转移到了编译时期.方便于程序员解决问题.让运行时期问题减少.安全. 好处:避免了强制转换的麻烦. 二,泛型的格式:通过<>来定义要操作的引用数据类型.    如:ArrayList<String>  //定

黑马程序员__多线程

------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ------- 1.线程是程序执行的一条路径, 一个进程中可以包含多条线程,多线程并发执行可以提高程序的效率, 可以同时完成多项工作. 2.开启新线程的两种方式 1).继承Thread [java] view plaincopy public stati