Java学习笔记:List,Set,Map
Posted 咳咳n
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java学习笔记:List,Set,Map相关的知识,希望对你有一定的参考价值。
Java学习笔记:容器
初步对容器做个总结,还有很多没加上去。。。未完待续。。。
容器也叫集合
ArrayList:用数组组成的线性结构
LinkedList:用链表组成的线性结构
…
所有的容器装的是对象,但是容器会把传进去的孤立的值自动装箱成对象,功能强大。
有数组为什么要容器呢:
- 因为容器方便扩充,数组口扩充起来耗内存;
- 数组只能放一种类型,容器可以多种
add的内核是个静态的,可以成倍递增的数组来的。
import java.util.*;
class A
public String toString()
return "哈哈";
public class Test
public static void main(String[] args)
ArrayList al = new ArrayList();
al.add(12345);
al.add("张三"); //"张三".length() "张三".conpareTo("李四");
al.add(66.66); //double Double
al.add(new A());
//System.out.println(al[2]); //容器不是数组
System.out.println(al.get(2));
Object[] obArr = al.toArray();
System.out.println(obArr[2]);
//System.out.println(al);
三个接口:
- Set
- List
- Map
List用法:
要找的List是接口,不是个List类。
E表示泛型。。。
- 因为se和List都是继承自 Collection接口,所以set和List中有很多方法是一样的
- List接口中有add, set, indexof方法,但是Set接口中却只有add方法,没有set, indexof行方法,因为Set是无序不能重复的,不存在某元素具体位置这个概念
建议:所有添加到 Collection容器中的对象都应该重写父类 Object的 to string方法.
import java.util.*;
public class TestCollection
public static void main(String[] args)
Collection c = new LinkedList();
c.add(new Student("zhangsan", 80));
c.add(66.6);
System.out.println(c);
class Student
private String name;
private int age;
public Student(String name, int age)
this.name = name;
this.age = age;
//如果把toString方法注释掉了,则程序输出结果会有乱码
public String toString()
return name + " " + age;
对比:
- Array List和 Linkedlist都实现了Lis接口中的方法,但两者内部实现不同
- ArrayList底层采用数组完成,而 Linkedlist则是以一般的双向链表 double-linked list完成,其内每个对象除了数据本身外,还有两个引用,分别指向前一个元素和后一个元素。
- 如果我们经常在List的开始处增加元素,或者在List中进行插入和删除操作,我们应该使用 Linkedlist,否则的话,使用Array List将更加快速。
- ArrayList存取速度快,插入删除慢
- Linked list存取速度慢,插入删除速度快
Colletions类是Collection接口的实现类,如 Arraylist、 Linkedlist本身并没有提供排序,倒置,査找等方法,这些方法是由Collections类来实现的,该类有很多 public static方法,可以直接对 Collection接口的实现类进行操作.
常用的:
- void sort(Iist)对List容器内的元素排序
- void shuff1e(Lst)对Li容器内的对象进行随机排列
- void reverse(Iist)对List容器内的对象进行逆续排列
- void fill(List, object)用一个特定的对象重写整个Lis容器
- void copy (List dest, List src)将 src list容器内容拷贝到 dest List容器
- int binarySearch (List, object)对于顺序的Li容器,采用折半查找的方法查找特定对象
/*
测试Collections类的使用
*/
import java.util.*;
public class TestCollections
public static void main(String[] args)
List lt = new LinkedList();
for (int i=0; i<7; ++i)
lt.add("a" + i);
System.out.println(lt);
Collections.shuffle(lt); //记住LinkedList中是没有shuffle方法的,因此需要通过Collections类的相关方法来实现
System.out.println(lt);
Collections.sort(lt); //默认升序排序,要降序很简单,先调用Collections.sort(); 再调用Collections.reverse()
System.out.println(lt);
Collections.reverse(lt); //倒置
System.out.println("倒置之后: " + lt);
System.out.println(Collections.binarySearch(lt, "a5")); //因为lt默认不是升序排序的,所以调用Collections.binarySearch()方法是不会成功的
Collections.sort(lt);
System.out.println("重新排序之后: " + lt);
System.out.println(Collections.binarySearch(lt, "a5")); //记住,使用binarySearch()方法的前提是该容器已升序排序
/*
----------------------------
[a0, a1, a2, a3, a4, a5, a6]
[a5, a3, a6, a4, a2, a0, a1]
[a0, a1, a2, a3, a4, a5, a6]
倒置之后: [a6, a5, a4, a3, a2, a1, a0]
-8
重新排序之后: [a0, a1, a2, a3, a4, a5, a6]
5
----------------------------
*/
在Java里面,哈希表只有三种类型:HashSet,HashMap和HashTable。
也就是说只有在这三种类型里面,hashCode才会发挥作用,其他情况下都是没有作用的。
对于集合:Set S = new HashSet(); 要得到不重复效果,
必须重写hashCode和equal,因为他的容器内核是哈希表构成的。
有带Hash的如hashMap和hashTable也要。treeSet不用重写。
import java.util.*;
class Student
private int id;
private String name;
public Student(int id, String name)
this.id = id;
this.name = name;
@Override
public String toString()
return id + " " + name; //1000张三
//System.out.println();
public boolean equals(Object ob)
Student st = (Student)ob;
return st.id==this.id && st.name==this.name;
public int hashCode()
return id * this.name.hashCode();
public class TestSet
public static void main(String[] args)
Set S = new HashSet(); //TreeSet
S.add(new Student(1000, "张三"));
S.add(new Student(1003, "赵六"));
S.add(new Student(1002, "王五"));
S.add(new Student(1001, "李四"));
S.add(new Student(1001, "李四"));
S.add(new Student(1001, "李四"));
S.add(new Student(1001, "李四"));
S.add(new Student(1001, "李四"));
S.add(new Student(1001, "李四"));
System.out.println(S);
- String和 Integer这些Java自带的类都重写了 hash Code方法,如果 String和 Integer new出来的对象的内容是一样的则这些对象的 hash Code返回值也是一样的,尽管这些对象占用的是不同的内存
以上是关于Java学习笔记:List,Set,Map的主要内容,如果未能解决你的问题,请参考以下文章