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返回值也是一样的,尽管这些对象占用的是不同的内存
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java是一种广泛使用的编程语言,有简单、面向对象、跨平台等特点。下面是Java学习的一些重要知识点和学习笔记: 1. Java基础: - 数据类型:Java提供了多种数据类型,包括基本数据类型和引用数据类型。 - 控制流程:学习如何使用条件语句(if-else、switch)、循环语句(for、while)等控制程序的流程。 - 数组:了解如何声明、初始化和操作数组。 - 方法:学习如何定义和调用方法,以及方法的参数和返回值。 - 类和对象:理解类和对象的概念,学习如何定义类、创建对象和使用类的成员变量和方法。 - 继承和多态:掌握继承和多态的概念,了解如何使用继承创建子类,并实现方法的重写和多态的应用。 2. 面向对象编程: - 封装:学习如何使用访问修饰符(public、private、protected)来控制类的成员的访问权限。 - 继承:了解继承的概念和作用,学习如何使用extends关键字创建子类。 - 多态:理解多态的概念和实现方式,学习如何使用父类引用指向子类对象,实现方法的动态绑定。 3. 异常处理: - 异常的分类:了解异常的分类(Checked Exception和Unchecked Exception)和常见的异常类型。 - 异常处理机制:学习如何使用try-catch语句捕获和处理异常,以及使用throws关键字声明方法可能抛出的异常。 4. 输入输出: - 文件操作:学习如何读写文件,包括使用File类、字节流和字符流等。 - 序列化:了解对象的序列化和反序列化,学习如何将对象保存到文件或网络中。 5. 集合框架: - 学习Java提供的集合框架,包括ListSetMap等常用的集合类,以及它们的特点和用法。 6. 多线程编程: - 学习如何创建和管理线程,了解线程同步和线程间通信的方法。 7. 数据库连接: - 学习如何使用Java连接数据库,执行SQL语句,进行数据的增删改查操作。 以上是Java学习的一些重要知识点和学习笔记,希望对你有帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值