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的主要内容,如果未能解决你的问题,请参考以下文章

Java学习笔记----容器

Java集合学习笔记

[知了堂学习笔记]_集合接口list与集合接口set的区别

Java学习---Java核心数据结构(List,Map,Set)使用技巧与优化

学习笔记之Java笔记

java学习笔记