Java基础11-List;Set;Map
作业解析:
remove(int index); //删除指定位置的元素
List list = new ArrayList();
list.add("s1");
list.add("s2");
list.add("s3"); OutputList(list);// s1,s2,s3 // 删除指定位置的元素
list.remove(0);
OutputList(list);// s2,s3 list.add("s1");
Student s1 = new Student("s-1", 1, 'f');
Student2 s2 = new Student2("s-2", 2, 'm');
list.add(s1);
list.add(s2);
OutputList(list);//s1,s2,s3,s-1,s-2
remove(Object o); //删除指定对象,考虑删除对象的规则是什么?
// 删除指定对象,考虑删除规则是什么?equals方法? // 重写Equals方法,按对象名称删除
System.out.println("重写Equals方法,按对象名称删除");
list.remove(s1);
OutputList(list);//s1,s2,s3,s-2 // 重写Equals方法,按匿名对象删除
list.add(s1);
System.out.println("重写Equals方法,按匿名对象删除");
list.remove(new Student("s-1", 1, 'f'));
OutputList(list);//s1,s2,s3,s-2 // 没有重写Equals方法,按对象名称删除
System.out.println("没有重写Equals方法,按对象名称删除");
list.remove(s2);
OutputList(list);//s1,s2,s3 // 没有重写Equals方法,按匿名对象删除
System.out.println("没有重写Equals方法,按匿名对象删除");
list.add(s2);
list.remove(new Student("s-2", 2, 'm'));
OutputList(list);//s1,s2,s3,s-2 list.add(s1);
removeAll(Collection col);//删除指定集合中的所有元素。
//删除指定集合中的所有元素 List list2 = new ArrayList();
list2.add("s1");
list2.add(new Student("s-1", 1, 'f')); //3.1 指定集合中的元素都在大集合中
System.out.println("指定集合中的元素都在大集合中");
list.removeAll(list2);
OutputList(list);//s2,s3,s-2 //3.2 指定集合中,存在某一元素不在大集合中
System.out.println("指定集合中,存在某一元素不在大集合中");
list.addAll(list2);
list2.add(new Student("s-3",3,'f'));
list.removeAll(list2);
OutputList(list);//s1,s2,s3,s-2,s-1,错误,删除含有指定集合中的那些元素,剩下s2,s3,s-2 //3.3 没有重写Equals方法的元素在指定集合中
System.out.println("没有重写Equals方法的元素在指定集合中");
list.addAll(list2);
list2.add(new Student2("s-2",2,'m'));
list.removeAll(list2);
OutputList(list);//s2,s3,s-2,不会删掉匿名对象,对于重写Equals方法的匿名对象,会删除
contains(Object o); //是否包含
list.addAll(list2);
System.out.println(list.contains(s2));//true
System.out.println(list.contains(s1));//true
System.out.println(list.contains(null));//false
System.out.println(list.contains(new String("s1")));//true
System.out.println(list.contains(new Student("s-1",1,'f')));//true
System.out.println(list.contains(new Student2("s-2",2,'m')));//false,没有重写equals方法的匿名对象
contains(Collection col); //是否包含集合。
System.out.println("------list------");
OutputList(list);
System.out.println("------list2------");
OutputList(list2);
System.out.println(list.contains(list2));//true,结果是false,why?
System.out.println(list.contains("s2"));//true List list3 = new ArrayList();
list3.add("s1");
list3.add(new Student("s-1", 1, 'f'));
System.out.println(list.contains(list3));//true,结果是false,why?
list3.remove(new Student("s-1", 1, 'f'));
System.out.println(list.contains(list3));//true, 结果依然是false, 没有contains(Collection col)方法,只有contains(Object o)
System.out.println(list.contains("s1"));//true
System.out.println("--list3---");
OutputList(list3); System.out.println(list.containsAll(list2));//true,有containsAll(Collection col)方法
list.add(new Student2("s-2",2,'m'));
list2.add(new Student2("s-2",2,'m'));
System.out.println(list.contains(list2));//false
System.out.println(list.containsAll(list2));//false
List
可重复
只跟equals方法有关
如果是集合中的对象,但是equals方法返回了false,contains()返回false有序
ArrayList
优缺点:查询快, 写入慢LinkedList
链表:手拉手Vector 线程安全的
//添加重复元素
List<Student> list = new ArrayList<Student>();
Student s = new Student("s1",1);
list.add(s);
list.add(s);
list.add(s);
for(int i=0;i<list.size();i++) {
System.out.println(list.get(i));
}//打印出三个相同的地址 //提取第一个元素,进行修改
list.get(0).setName("jerry"); System.out.println(list.get(2).getName());//jerry //提取元素,进行修改
list.add(new Student("s2",2));
list.add(new Student("s2",2));
list.add(new Student("s2",2));
list.add(new Student("s2",2));
list.get(4).setName("tom");
System.out.println(list.get(5).getName());//s2,内容一样,但地址不一样
==和equals区别
==
判断对象是否是同一个,地址是否相同
equals
判断对象的内容是否相同,默认调用的是Object的equals()方法,而该方法判断的仍然是地址是否相同
如果没有重写equals方法,和==的效果一样
Set
HashSet
先通过hashcode
然后通过equals方法
若将equals写死为false,则同一个对象也是不同的,但只能重复添加一次Set<Person> set = new HashSet<Person>(); System.out.println("----------1.相同物理地址,hashcode相同,无法添加-------------");
Person p = new Person("p1",1);
//Set集合不能重复添加元素
set.add(p);
set.add(p);
set.add(p);
Iterator it = set.iterator();
while(it.hasNext()) {
System.out.println(it.next());
} System.out.println("----------1.相同物理地址,hashcode不同,可以添加-------------");
p = new Person("p1",1);
set = new HashSet<Person>();
set.add(p);
set.add(p);
set.add(p);
it = set.iterator();
while(it.hasNext()) {
System.out.println(it.next());
} //匿名对象,可以重复添加,元素是否相同存在一个判断准则---hashcode
System.out.println("----------2.不同物理地址,hashcode相同 equals=false==>可以添加-------------");
set=new HashSet<Person>();
Person p2 = new Person("p3",3);
Person p3 = new Person("p3",3);
set.add(p2);
set.add(p3);
it = set.iterator();
while(it.hasNext()) {
System.out.println(it.next());
} System.out.println("----------3.不同物理地址,hashcode相同 equals=true==>无法添加-------------");
set=new HashSet<Person>();
p2 = new Person("p3",3);
p3 = new Person("p3",3);
set.add(p2);
set.add(p3);
it = set.iterator();
while(it.hasNext()) {
System.out.println(it.next());
} System.out.println("---------4.不同物理地址,hashcode不同 equals=false==>可以添加-------------");
set=new HashSet<Person>();
p2 = new Person("p3",3);
p3 = new Person("p3",3);
set.add(p2);
set.add(p3);
it = set.iterator();
while(it.hasNext()) {
System.out.println(it.next());
} System.out.println("---------5.不同物理地址,hashcode不同 equals=true==>可以添加-------------");
set=new HashSet<Person>();
p2 = new Person("p3",3);
p3 = new Person("p3",3);
set.add(p2);
set.add(p3);
it = set.iterator();
while(it.hasNext()) {
System.out.println(it.next());
}
TreeSet
使用比较方法判断对象是否重复。
比较方法实现有两种
- 自定义Comparator比较器,和TreeSet关联。
- 让javaBean实现Comparable接口,实现CompareTo()方法。
TreeSet可以容纳null元素。
TreeSet可以使用降序排列。
通过descendingIterator()方法得到降序迭代器实现。TreeSet默认升序排列。
Comparator<Person> comp = new Comparator<Person>(){
public int compare(Person o1,Person o2){
if(o1==null){
if(o2==null){
return 0;
}
else
return -1;
}
else{
if(o2==null){
return 1;
}
else
return o1.getAge()-o2.getAge();
}
}
};
//通过Comparator构造TreeSet
TreeSet<Person> ts = new TreeSet<Person>(comp);
ts.add(null);
ts.add(null);
Person p1 = new Person("p1",1);
ts.add(new Person("p1",1));
ts.add(new Person("p3",3));
ts.add(new Person("p2",2));
ts.add(new Person("p4",1));
System.out.println(ts.size()); // 4, 通过comparator的compare方法判断 Iterator it = ts.iterator();
while(it.hasNext()){
Person p1 = (Person)it.next();
if(p1!=null){
System.out.println(p1.getName());
}
else{
System.out.println("No body");
}
}// 默认升序,No body, p1,p2,p3
} //通过实现Comparable接口,构造TreeSet
TreeSet<Dog> tss = new TreeSet<Dog>();
tss.add(new Dog("black",20,"京巴"));
tss.add(new Dog("black",19,"京巴"));
tss.add(new Dog("white",20,"京巴"));
tss.add(new Dog("yellow",20,"藏獒"));
tss.add(new Dog("black",20,"藏獒"));
System.out.println(tss.size());
//it = tss.iterator();
it = tss.descendingIterator();//获得降序的迭代器
while(it.hasNext()) {
Dog d = (Dog)it.next();
System.out.println(d);
}// “藏獒”yellow, 藏獒”black, “京巴”white, “京巴”black 20, 京巴”black 19 //实现Comparable接口的Dog类
class Dog implements Comparable{
private String category = "";
private String color = "";
private int weight; public int compareTo(Object o){
if(o==this){
return 0;
}
if(o==null){
return 1;
}
if(o.getClass()==Dog.class){
Dog dog = (Dog)o;
int catResult = this.getCategory().compareTo(dog.getCategory());
//类别不同
if(catResult!=0){
return catResult;
}
//类别相同,判断颜色
else{
int colResult = this.getColor().compareTo(dog.getColor());
if(colResult!=0){
return colResult;
}
//颜色相同,判断体重
else{
return this.getWeight()-dog.getWeight();
}
}
}
else{
System.exit(-1);
}
return -1;
} public void toString(){
System.out.println(this.getCategory()+":"+this.getColor()+":"+this.getWeight());
}
}
Map
HashMap
key(键) - value(值): kv对
映射
Key - Value对:称为Entry, Key不能重复,无序
map.size()指的是条目个数
Map接口是单独的接口,没有继承任何接口,与之前的jdk版本不同
put:放入元素,将key和value进行关联,如果key已经存在,则value被覆盖
get(key): 提取元素
迭代
entrySet
keySet
HashMap.hash()方法意义:将新hash值跟更多的特征值相关
Node<K,V>
class Node<K,V>{
int hash; //新hash
final K key;
V value; Node<K,V> next;
}
元素重复判断标准
if (p.hash == hash &&
((k = p.key) == key || (key != null && key.equals(k))))
new hashCode不同,对象不同
new hash相同,对象是同一对象,则对象相同
new hash相同,对象不是同一对象,再判断equals方法,则对象相同性判定和equals一致
增删改查操作
Map<String, Dog> map = new HashMap<String, Dog>();
Dog dog = new Dog("",12,"");
map.put("dog-1000-1981", dog);
map.put("dog-1000-1982", dog);
map.put("dog-1000-1983", dog);
map.put("dog-1000-1984", dog);
map.put("dog-1000-1985", new Dog("",12,""));
map.put("dog-1000-1985", new Dog("",13,""));//将原本存在的元素修改了
System.out.println(map.size());//5 System.out.println(map.get("dog-1000-1986"));//null //迭代Map中的条目
//1. 利用KeySet
Set<String> keySet = map.keySet();
for(String key: keySet){
//Dog dog = map.getValue(key);
Dog dog = map.get(key);
System.out.println(key+":"+dog);
} //2. 利用EntrySet
//EntrySet<Map<String,Dog>> entries = map.entrySet();
Set<Entry<String,Dog>> entries = map.entrySety();
for(Entry<String,Dog> entry: entries){
String key = entry.getKey();
Dog dog = entry.getValue();
System.out.println(key+":"+dog);
} //删除条目
Dog dog = map.remove("dog-1000-1985");//null
System.out.println("删除了"+dog);
HashTable
线程安全的,练习增删改查
Hashtable<String, Dog> ht = new Hashtable<String, Dog>();
ht.put("dog1981", new Dog("",10,""));
ht.put("dog1982", new Dog("",10,""));
ht.put("dog1983", new Dog("",10,""));
ht.put("dog1982", new Dog("",12,""));//改掉了原本存在的元素
System.out.println(ht.size());//3
//利用keySet迭代元素
Set<String> keySet = ht.keySet();
for(String key: keySet) {
Dog dog = ht.get(key);
System.out.println(key+":"+dog);
}
System.out.println("=================");
//利用EntrySet迭代
Set<Entry<String,Dog>> entrySet = ht.entrySet();
for(Entry<String,Dog> entry: entrySet) {
String key = entry.getKey();
Dog dog = entry.getValue();
System.out.println(key+":"+dog);
}
//删除元素
Dog dog = ht.remove("dog1988");
System.out.println("删除了"+dog);//null
dog = ht.remove("dog1982");
System.out.println("删除了"+dog);
//put即可以修改条目
ht.put("dog1982",new Dog("black",15,"京巴"));
System.out.println(ht.get("dog1982"));//get(key)即可以根据键值查找元素
作业
取出整数的16进制表示形式 \u00ff
取出整数的8进制表示形式
使用韩语字符集实现字符串编解码
字符串倒序排列
练习自动拆箱和装箱
实现equals方法,比较四方面要素,Student{name height weight age}
创建集合,存放10个person对象,5个Car对象,3个Bee对象,迭代集合,输出每个对象的name属性
使用Map集合实现嵌套: 操场上六个年级,每个年级有10班,每个班有60人(String)
tom-x-y-n定义罪犯Criminal类,height(身高)/weight(体重)/blood(血型)/home(籍贯)属性。
重写hashcode和equals,使用四个属性的组合进行实现。
创建HashSet集合,里面存放20个Criminal对象,其中O型血2人,A型血3人,B型血4人,AB型血1人,其余血型不详。
注意:hashcode()方法实现时,要求身高、体重、和血型三个属性合成一个数字,实现两两比较的高效算法。创建HashMap, Person为key, Dog 为value。
存放100元素,遍历map集合,两种方式:EntrySet + KeySet
Java基础11-List;Set;Map的更多相关文章
- java基础(11) -JDBC
java基础(11) -JDBC jdbc 1.装载驱动 载入跟数据库建立连接的驱动 /* sql server: String className ="com.microsoft.sqls ...
- JAVA基础学习-集合三-Map、HashMap,TreeMap与常用API
森林森 一份耕耘,一份收获 博客园 首页 新随笔 联系 管理 订阅 随笔- 397 文章- 0 评论- 78 JAVA基础学习day16--集合三-Map.HashMap,TreeMap与常用A ...
- JAVA基础--容器 Set, List, Map
Colections接口, Iterator接口, Set接口, List接口, Comparable接口, Map接口 Collections类 容器:装各种对象. 所有容器都在java.util里 ...
- 【java基础 11】java集合框架学习
导读:本篇博客主要是从整体上了解java的集合框架,然后主要介绍几个自己在项目中用到的结构,比如说:hashtable.hashmap.hashset.arraylist等! 一.宏观预览 从宏观上看 ...
- 十七、Java基础---------集合框架之Map
前两篇文章中介绍了Collection框架,今天来介绍一下Map集合,并用综合事例来演示. Map<K,V> Map<K,V>:Map存储的是键值对形式的元素,它的每一个元素, ...
- Java基础11:Java泛型详解
本文对java的泛型的概念和使用做了详尽的介绍. 本文参考https://blog.csdn.net/s10461/article/details/53941091 具体代码在我的GitHub中可以找 ...
- java基础(11):接口、多态
1. 接口 1.1 接口概念 接口是功能的集合,同样可看做是一种数据类型,是比抽象类更为抽象的”类”. 接口只描述所应该具备的方法,并没有具体实现,具体的实现由接口的实现类(相当于接口的子类)来完成. ...
- Java基础11 对象引用
链接地址:http://www.cnblogs.com/vamei/archive/2013/04/01/2992484.html 作者:Vamei 出处:http://www.cnblogs.com ...
- Java基础11 对象引用(转载)
对象引用 我们沿用之前定义的Human类,并有一个Test类: public class Test{ public static void main(String[] args){ ...
- java基础11(IO流)-字符流
转换流 由于字节流操作中文不是特别方便,所以java中提供了转换流 编码表:由现实世界的字符和对应的数值组成的一张表 编码:把看得懂的变成看不懂的(String-------byte[]) 解码:把看 ...
随机推荐
- photoshop实例实战(入门级)教程
PS对街拍女孩照片增加质感(2019-03-19 17:57) PS制作水火相溶特效文字图片(2019-03-19 17:49) PS制作简洁漂亮的立体抽丝文字(2019-03-19 17:16) P ...
- dpdk-18.11网卡多队列RSS设置
背景 最近在做将基于dpdk-16.11.1开发的程序,转移到基于dpdk-18.11版本下开发.遇到了网卡RSS配置的问题,在这里纪录一下. 问题 dpdk-16.11.1 在dpdk-16.11. ...
- angular-nvd3初体验
<!DOCTYPE html> <html lang="en" ng-app="myApp"> <head> <met ...
- swiftmailer时没有设置https的选项,才可以发送成功。在linux下面
<?php $su = 'register'; $ge = '1362836763@qq.com'; $co = 'Please register!'; send_mail($su,$ge,$c ...
- 龙光集团地产跃居“中国房地产500强TOP28”
3月20日,由中国房地产业协会.上海易居房地产研究院中国房地产测评中心联合主办的2019中国房地产500强测评成果发布会在北京成功举办.本次测评成果显示,龙光集团地产凭借综合实力,不仅成功跻身“中国房 ...
- scrollbar样式设置
转载:https://segmentfault.com/a/1190000012800450?utm_source=tag-newest author:specialCoder 一 前言 在CSS 中 ...
- SpringBoot配置mybatis
一直都说SpringBoot是零配置,当然,真正实现零配置是不可能的,但是在配置mybatis这里真的是太简单了,哈哈,下面我们一起看一下. 1.先导入基于SpringBoot的mybatis依赖包 ...
- tensorflow-RNN和LSTM
本章主要介绍循环神经网络(recurrent neuralnetwork,RNN)和长短时记忆网络(long short-term memory,LSTM) 一. RNN简介 1.背景 循环神经网络挖 ...
- 微信小程序工具类
wechat-common-sdk ? 场景:目前工作中的项目需要包含并使用另一个项目. 也许是第三方库,或者你独立开发的,用于多个父项目的库. 现在问题来了:你想要把它们当做两个独立的项目,同时又想 ...
- MarkDown&思维导图
从markdown文件创建思维导图 pzhaonet/mindr: an R package which converts markdown files (.md, .Rmd) into mindma ...