java 集合构架 Collection( List(ArrayList、LinkedList、Vector) ,Set(HashSet、TreeSet)),Map(HashMap、Hashtabe)
由于标题写不下了,那接下来我就来一一介绍吧。( 注意:重要的相关知识或者解释我都写到注释里了,便于大家对源码的解读)
首先让我们通过一个例子来看看 单例集合Collection与双列集合Map的区别吧:
package jihe.Collection_.com;import java.util.ArrayList;
import java.util.HashMap;@SuppressWarnings({"all"})//镇压警告
public class Collection_ {public static void main(String[] args) {//1. 集合主要是两组(单列集合,双列集合)//2. Collection 接口有两个重要的子接口 List 和 Set ,他们的子类都是单列集合//3. Map 接口的实现子类 是双列集合,存放的 K-V// Collection// MapArrayList arrayList = new ArrayList();arrayList.add("风煞");arrayList.add("tom");arrayList.add(100);System.out.println("arrayList="+arrayList);HashMap hashMap = new HashMap();hashMap.put("第一","北京");hashMap.put("第二","上海");hashMap.put("第三","深圳");System.out.println("hashMap="+hashMap);}
}
那么通过对单例集合Collection与双列集合Map的区别的简单了解,接下来先让我们来对Collection单列集合进行进一步了解吧
那我们先来看一下Collection 子接口及实现类的类图关系吧:
首先来看一下Collection 接口常用方法:
package jihe.Collection_.com;// Collection 接口常用方法
import java.util.ArrayList;
import java.util.List;@SuppressWarnings({"all"})
public class Collection_01 {public static void main(String[] args) {List list=new ArrayList();// 1. add:添加单个元素 都是对象list.add("majunyi");list.add(124);// 相当于 list.add( new Integer(124) );都是对象list.add(true);System.out.println("list="+list);// 2. remove:删除指定元素// list.remove(124); //删除某个指定对象元素 返回布尔值list.remove(0);//删除第一个元素System.out.println("list="+list);// 3.contains:查找元素是否存在System.out.println( list.contains(true));//true// 4. size:获取元素个数System.out.println(list.size());// 2// 5.isEmpty:判断是否为空System.out.println(list.isEmpty());// false// 6. clear:清空list.clear();System.out.println("list="+list);// list=[]// 7. addAll:添加多个元素List list1 = new ArrayList();list1.add("中国");list1.add("majunyi");list1.add(100);list1.add(false);list.addAll(list1);System.out.println("list="+list);// list=[中国, majunyi, 100, false]// 8.containsAll:查找多个元素是否都存在System.out.println(list.containsAll(list1));// ture// 9. removeAll:删除多个元素list.add("张祎");list.removeAll(list1);System.out.println("list="+list);// 张祎// 说明: 以上 ArrayList 实现类来演示}
}
接下来让我们看一看Collection 子接口实现类的遍历方法-1.迭代器Iterator 2.增强 for 3.普通 for :
package jihe.Collection_.com;import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;// Collection 迭代器 Iterator 遍历集合@SuppressWarnings({"all"})
public class CollectionIterator {public static void main(String[] args) {List col =new ArrayList();col.add(new Book("三国演义","罗贯中",10.2));col.add(new Book("小李飞刀","古龙",7.4));col.add(new Book("红楼梦","曹雪芹",15.7));// col.add("majunyi"); 存的是对象,该句并不报错// System.out.println("col="+col);//现在我希望能够遍历col 集合//1. 先得到 col 的迭代器Iterator iterator= col.iterator();//2. 使用 while 循环遍历集合 colwhile(iterator.hasNext()){//判断是否还有数据//返回下一个元素,类型是ObjectObject obj=iterator.next();//编译类型为 ObjectSystem.out.println("obj="+obj);// 运行类型为Book 多态问题// 或者直接 System.out.println(iterator.next()); 也没有问题}//教大家一个快捷键 迅速生成 while 循环 输入 itit//或者 敲 Ctrl+j 选取当前的 while 循环//3. 当退出 while 循环后 此时 iterator 迭代器,指向最后一个对象元素//不能再 iterator.next() 否则将抛出异常//如果想再次迭代遍历集合 需要对迭代器进行重置//即 iterator=col.iterator(); 即可进行第二次遍历System.out.println("\n\n\n");//另外还有一种简化的迭代器//使用 增强 for 循环遍历 Collection 集合for (Object obj:col) {System.out.println("obj="+obj);}//同样 教大家一个快捷键 迅速生成增强 for 循环 输入 I 直接回车//当然你也可以 敲 Ctrl+j 选取当前的增强 for 循环System.out.println("\n\n\n");//普通forfor (int i = 0; i < col.size(); i++) {Object o=col.get(i);System.out.println("o="+o);}}
}@SuppressWarnings({"all"})
class Book{private String name;private String author;private double price;public Book(String name, String author, double price) {this.name = name;this.author = author;this.price = price;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getAuthor() {return author;}public void setAuthor(String author) {this.author = author;}public double getPrice() {return price;}public void setPrice(double price) {this.price = price;}@Overridepublic String toString() {return "Book{" +"name='" + name + '\'' +", author='" + author + '\'' +", price=" + price +'}';}
}
接下来我用一个双向链表来为大家模仿一下LinkedLis 的底层结构:
package jihe.Collection_.com;
@SuppressWarnings({"all"})
public class CollectionLinkedList {public static void main(String[] args) {//模拟一个双向链表Node tom = new Node("tom");Node majunyi = new Node("majunyi");Node jake = new Node("jake");//连接三个节点,形成双向链表//tom->majunyi->jaketom.next=majunyi;majunyi.next=jake;//jake->majunyi->tomjake.prve=majunyi;majunyi.prve=tom;//fist and lastNode fist=tom;//头节点Node last=jake;//尾节点//在tom 和 majunyi 之间添加一个 zhangfeiNode zhangfei = new Node("zhangfei");tom.next=zhangfei;//tom->zhangfeizhangfei.prve=tom;//zhangfei->tomzhangfei.next=majunyi;//zhangfei->majunyimajunyi.prve=zhangfei;//majunyi->zhangfei//删除 majunyizhangfei.next=jake;jake.prve=zhangfei;//演示遍历//从头到尾while (true){if(fist==null){break;}else{System.out.println(fist);fist=fist.next;}}System.out.println("\n\n\n");//从尾到头while (true){if(last==null){break;}else{System.out.println(last);last=last.prve;}}}
}// 定义一个 Node 类,Node 对象,表示双向链表的一个节点
class Node{public Object item;//真正存放数据public Node next;//指向下一个节点public Node prve;//指向上一个节点public Node(Object name){this.item=name;}public String toString(){return "Node name="+item;}
}
接下来让我们来看看List接口实现类的主要方法:
package jihe.Collection_.com;// List 中的常用方法
import java.util.ArrayList;
import java.util.List;@SuppressWarnings({"all"})//镇压警告
public class CollectionList {public static void main(String[] args) {List list =new ArrayList();// 1. List接口实现类 是有序的 而且对象元素是可以重复的 存取顺序相同// add:添加方法list.add("jake");list.add("majunyi");list.add("mary");list.add("mary");//可以重复System.out.println("list="+list);//另外还有 addAll:添加多个元素List list1 = new ArrayList();list1.add("中国");list1.add(100);list1.add(false);list.addAll(1,list1);System.out.println("list="+list);// 输出 list=[jake, 中国, 100, false, majunyi, mary, mary]// 相当于从第二个元素开始插入// 2. List 集合中的每一个元素都有其对应的顺序索引,即支持索引// Object get(int i) :取出第i+1个元素System.out.println(list.get(1));//取出第二个元素// 3. int indexOf(Object obj) :返回obj 在集合中第一次出现的位置System.out.println(list.indexOf("majunyi"));// 4// 4. int lastIndexOf(Object obj):返回obj 在集合中最后一次出现的位置System.out.println(list.lastIndexOf("mary"));// 6// 5. Object remove(int index):移除指定位置的元素list.remove(6);System.out.println("list="+list);// 输出 list=[jake, 中国, 100, false, majunyi, mary]// 6. Object set(int index,Object obj):设置指定index 位置的元素为obj ,相当于是替换// 注意:不能越界使用list.set(3,true);System.out.println("list="+list);// 输出 list=[jake, 中国, 100, true, majunyi, mary]// 7. List subList(int formIndex, int toIndex): 返回从 forIndex 到 toIndex位置的子集合List list2 = list.subList(1, 5);System.out.println("list2="+list2);// 输出 list2=[中国, 100, true, majunyi]//也就是说 subList(int formIndex, int toIndex) 返回的元素并不包含 toIndex位置的元素,// 可以理解为返回 [formIndex,toIndex) 区间位置的元素}
}
另外让我们来了解一下Set接口实现类的相关性质:
package jihe.Collection_.com;import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;//Collection 中 Set 集合是无序的,且对象元素不能重复,也没有索引,即无法通过索引来获取元素,最多只能有一个空值
//方法和Collection接口相同,迭代器都相同 Iterator
// HashSet, LinkedHashSet,TreeSet
@SuppressWarnings({"all"})
public class CollectionSet_ {public static void main(String[] args) {Set set=new HashSet();set.add("ject");set.add("majunyi");set.add(true);set.add(null);set.add(168);System.out.println("set="+set);//输出 set=[null, majunyi, 168, ject, true]//可以看出取出顺序和添加顺序不一致// 但他的去除顺序是固定的也就是 下一次取出显示也为 set=[null, majunyi, 168, ject, true]set.add("zhangfei");System.out.println("set="+set+"\n\n\n");set.remove("zhangfei");//迭代器Iterator iterator= set.iterator();while (iterator.hasNext()) {Object next = iterator.next();System.out.println("next="+next);// System.out.println(iterator.next());}System.out.println("\n\n\n");//增强for 遍历for (Object o :set) {System.out.println(o);}//set 不能用普通for 遍历}
}
同样我来为大家演示一下HashSet的底层Hashtabe的底层机制:(这里我建议大家去追一遍,顺便了解一下Set接口的实现类不能重复的原因和标准):
package jihe.Collection_.com;
@SuppressWarnings({"all"})
public class HashSet_ {public static void main(String[] args) {//模拟 HashSet->HashMap的底层 数组+单向链表+红黑树// 1.创建一个数组,数据的类型是 Noed_Noed_[] tabe = new Noed_[16];System.out.println("tabe="+tabe);// 2. 将john放到 tabe[2]Noed_ john=new Noed_("john",null);tabe[2]=john;Noed_ jact=new Noed_("jact",null);john.next=jact;//john->jactNoed_ rose = new Noed_("rose",null);jact.next=rose;//jact->roseSystem.out.println("tabe="+tabe[2]);Noed_ lucy=new Noed_("lucy",null);tabe[1]=lucy;Noed_ majunyi=new Noed_("majunyi",null);lucy.next=majunyi;System.out.println("tabe="+tabe[1]);}
}class Noed_{//节点,存储数据,可以指向下一个节点,从而形成链表(单项链表)Object item;//存放数据Noed_ next;//指向下一个节点public Noed_(Object item, Noed_ next) {this.item = item;this.next = next;}@Overridepublic String toString() {return "Noed_{" +"item=" + item +", next=" + next +'}';}
}
下面让我们来看看HashSet 元素加入的规则:
package jihe.Collection_.com;
//Set 添加
import java.util.HashSet;
import java.util.Set;@SuppressWarnings({"all"})//HashSet 的底层是HashMap,HashMap 的底层是(数组+单向链表+红黑树)
public class Set_HashSet {public static void main(String[] args) {Set set = new HashSet();System.out.println(set.add("jact"));System.out.println(set.add("jact"));//加入不了System.out.println(set.add(new cat("tom")));System.out.println(set.add(new cat("tom")));//没有问题 相当于使用匿名类生成对象,虽然内部属性相同,// 但由于没有类名所以成功//底层通过 equals 方法进行比较System.out.println("set="+set);//经典面试题System.out.println(set.add(new String("has")));System.out.println(set.add(new String("has")));//加入不成功}
}@SuppressWarnings({"all"})
class cat{private String name;public cat(String name) {this.name = name;}@Overridepublic String toString() {return "cat{" +"name='" + name + '\'' +'}';}
}
接下来我们来看一个HashSet的练习,以及看看Set接口实现类不能重复的标准以及操作方法:
package jihe.Collection_.com;
//HashSet 底层源码 HashSet 练习
import java.util.HashSet;
import java.util.Iterator;
import java.util.Objects;@SuppressWarnings({"all"})
public class HashSetSoure {public static void main(String[] args) {Test1();Test2();}public static void Test1() {/* 定义一个 Employee 类 该类包含 private: name,age 要求:创建3个Employee对象 放入 HashSet中当name,age值相同时,认为员工相同,不能添加入HashSet集合中*/HashSet hashSet = new HashSet();hashSet.add(new Employee("milan", 18));hashSet.add(new Employee("majunyi", 28));hashSet.add(new Employee("milan", 17));System.out.println("hashSet=" + hashSet);}public static void Test2(){/* 定义Employee_类,该类包括 private: neme,sal,birthday(MyDate)类,其中 birthday 为 MyDate类包括: year,month,day,要求:创建3个Employee对象 放入 HashSet中当name,birthday值相同时,认为员工相同,不能添加入HashSet集合中*/HashSet set=new HashSet();set.add(new Employee_("majunyi",5000.67,new MyDate(2002,10,23)));set.add(new Employee_("zhangfei",40056,new MyDate(2003,9,21)));set.add(new Employee_("tom",6005.23,new MyDate(2001,7,17)));set.add(new Employee_("zhangfei",40056,new MyDate(2003,9,21)));set.add(new Employee_("shengjri",8004.32,new MyDate(2001,9,24)));Iterator iterator = set.iterator();while (iterator.hasNext()) {Object obj = iterator.next();System.out.println("obj="+obj);}}
}class Employee_{private String name;private double sal;//薪水private MyDate birthday;public Employee_(String name, double sal, MyDate birthday) {this.name = name;this.sal = sal;this.birthday = birthday;}public String getName() {return name;}public void setName(String name) {this.name = name;}public double getSal() {return sal;}public void setSal(double sal) {this.sal = sal;}public MyDate getBirthday() {return birthday;}public void setBirthday(MyDate birthday) {this.birthday = birthday;}@Overridepublic boolean equals(Object o) {if (this == o) return true;if (!(o instanceof Employee_)) return false;Employee_ employee_ = (Employee_) o;return Double.compare(employee_.sal, sal) == 0 && Objects.equals(name, employee_.name) && Objects.equals(birthday, employee_.birthday);}@Overridepublic int hashCode() {return Objects.hash(name, sal, birthday);}@Overridepublic String toString() {return "Employee_{" +"name='" + name + '\'' +", sal=" + sal +", birthday=" + birthday +'}';}
}class MyDate{private int year;private int month;private int day;public MyDate(int year, int month, int day) {this.year = year;this.month = month;this.day = day;}public int getYear() {return year;}public void setYear(int year) {this.year = year;}public int getMonth() {return month;}public void setMonth(int month) {this.month = month;}public int getDay() {return day;}public void setDay(int day) {this.day = day;}@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;MyDate myDate = (MyDate) o;return year == myDate.year && month == myDate.month && day == myDate.day;}@Overridepublic int hashCode() {return Objects.hash(year, month, day);}@Overridepublic String toString() {return "MyDate{" +"year=" + year +", month=" + month +", day=" + day +'}';}
}class Employee{private String name;private int age;public Employee(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "Employee{" +"name='" + name + '\'' +", age=" + age +'}';}//当name,age值相同时,认为员工相同,不能添加入HashSet集合中//那就必须在当 当name,age值相同时,返回相同的哈希值@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Employee employee = (Employee) o;return age == employee.age && Objects.equals(name, employee.name);}@Overridepublic int hashCode() {return Objects.hash(name, age);}}
从以上例子我们可以看出,我们可以通过重写类的hashCode方法和equals方法来实现对Set接口实现类不能重复的标准的控制及操作。
接下来我们通过这个例子来分析一下HashSet的子类LinkedHashSet的底层和应用场景:
package jihe.Collection_.com;import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.Objects;
import java.util.Set;//HashSet子类
//LinkedHashSet 底层为 LinkedHashMap 底层维护 数组+双向链表 存取元素顺序相同,但不能重复
@SuppressWarnings({"all"})
public class LinkedHashSet_ {public static void main(String[] args) {Test1();Test2();}public static void Test1(){//分析LinkedHashSet 底层Set set=new LinkedHashSet();set.add(new String("AA"));set.add(456);set.add(456);//添加失败set.add(new Customer("刘",1001));set.add(123);set.add("hsp");System.out.println("set="+set);//加入顺序和取出顺序相同}public static void Test2(){//创建Car 类,包含name ,price 要求://当name 和 price 相同时不能添加LinkedHashSet linkedHashSet = new LinkedHashSet();linkedHashSet.add(new Car("奥迪",300000));linkedHashSet.add(new Car("法拉利",1000000));linkedHashSet.add(new Car("奥拓",10000));linkedHashSet.add(new Car("奥迪",300000));linkedHashSet.add(new Car("保时捷",70000000));linkedHashSet.add(new Car("奥拓",10000));Iterator iterator = linkedHashSet.iterator();while (iterator.hasNext()) {Object next = iterator.next();System.out.println("next="+next);}}
}class Car{private String neme;private double price;//价格public Car(String neme, double price) {this.neme = neme;this.price = price;}public String getNeme() {return neme;}public void setNeme(String neme) {this.neme = neme;}public double getPrice() {return price;}public void setPrice(double price) {this.price = price;}@Overridepublic String toString() {return "Car{" +"neme='" + neme + '\'' +", price=" + price +'}';}@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Car car = (Car) o;return Double.compare(car.price, price) == 0 && Objects.equals(neme, car.neme);}@Overridepublic int hashCode() {return Objects.hash(neme, price);}
}class Customer{private String name;private int no;public Customer(String name, int no) {this.name = name;this.no = no;}@Overridepublic String toString() {return "Customer{" +"name='" + name + '\'' +", no=" + no +'}';}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getNo() {return no;}public void setNo(int no) {this.no = no;}
}
下面我来为大家介绍TreeSet类,其中我为大家展示了他的排序规则以及相关源码的触发:
package jihe.Collection_.com;import java.util.Comparator;
import java.util.TreeSet;// 源码解读 可排序
// TreeSet 底层是 TreeMap
@SuppressWarnings({"all"})public class TreeSet_ {public static void main(String[] args) {TreeSet treeSet = new TreeSet(new Comparator() {@Overridepublic int compare(Object o1, Object o2) {// 下面 调用String 的comparatTo 比较字符串大小(与C语言中字符串比较strcmp()函数效果相同)即按照字典排序 从小到大// 1. 若要从大到小 则交换下面的o1和o2return ((String) o1).compareTo((String) o2);// 2. 如果按照字符串长度大小排序//return ((String) o1).length()-((String) o2).length();// 但是认为长度相同的字符串就是相同的元素// 即认为 tom 和 jac 是相同的元素 ,不建议使用}});// 添加数据treeSet.add("majunyi");treeSet.add("风煞");treeSet.add("zhangyi");treeSet.add("tom");treeSet.add("tom");System.out.println(treeSet);/* 1. 当使用无参构造器创建 Treeset 对象时,仍然是无序的2. 希望按照添加元素,按照字符串大小来排序3. 那就需要使用TreeSet 的一个构造器,可以传入一个比较器(匿名内部类) 并指定排序方式TreeMap treeMap = new TreeMap(new Comparator() {@Overridepublic int compare(Object o1, Object o2) {return 0;}});构造器将传入的比较对象赋值给 TreeMap 的属性this.comparatorpublic TreeMap(Comparator<? super K> comparator) {this.comparator = comparator;}在 调用 treeSet.add("")时,底层执行if (cpr != null) {//cpr 就是我们的匿名内部类do {parent = t;// 动态绑定到 匿名内部类(对象)comparecmp = cpr.compare(key, t.key);if (cmp < 0)t = t.left;else if (cmp > 0)t = t.right;else {// 如果相等,即返回0,这个 Key就没有加入V oldValue = t.value;if (replaceOld || oldValue == null) {t.value = value;}return oldValue;}} while (t != null);}*/}
}
另外 让我们来看一道TreeSet的相关练习:
定义一个学生类(Student),它包含private成员变量name(姓名),id(学号),age(年龄)。每个属性都要写get,set方法,并重写 toString 方法输出 name, id,age,balance
要求:
创建Student类的 10个对象,并把这些对象放入 TreeSet 集合中(成员变量自定义)
按下面的要求对集合中的元素进行排序,并遍历输出:
-
按年龄从小到大排序
-
当年龄相同时,按学号从大到小排序
package jihe.zuoye;import java.util.Comparator;
import java.util.Iterator;
import java.util.TreeSet;@SuppressWarnings({"all"})
public class Tree_Set {public static void main(String[] args) {TreeSet treeSet = new TreeSet(new Comparator() {@Overridepublic int compare(Object o1, Object o2) {if (((Student) o1).getAge() != ((Student) o2).getAge()) {return ((Student) o1).getAge() - ((Student) o2).getAge();} elsereturn ((Student) o2).getId() - ((Student) o1).getId();}});treeSet.add(new Student("tom", 202101, 15));treeSet.add(new Student("jact", 2021021, 16));treeSet.add(new Student("zhangfei", 202203, 17));treeSet.add(new Student("风煞", 2022012, 18));treeSet.add(new Student("smith", 20221025, 16));treeSet.add(new Student("bhfdhjs", 2021045, 19));treeSet.add(new Student("dfdjst", 202109, 14));treeSet.add(new Student("nfhafrojiti", 2000156, 19));treeSet.add(new Student("王刚", 2002031, 17));treeSet.add(new Student("dfreejwgru", 2003051, 18));Iterator iterator = treeSet.iterator();while (iterator.hasNext()) {Object next = iterator.next();System.out.println("Student=" + next);}}
}class Student {private String name;private int id;private int age;public Student(String name, int id, int age) {this.name = name;this.id = id;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getId() {return id;}public void setId(int id) {this.id = id;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", id=" + id +", age=" + age +'}';}
}
运行效果展示:
接下来就到了我们的双列集合Map,Map存储的是Key-Value键值对,其底层机制为 Node类,在上面HashSet的底层介绍中有讲到,那么我们还是再来对HashMap 的底层解读一边吧:
package jihe.Map_.com;// HashMap 的底层为 数组+单向链表+红黑树
// 扩容机制和 HashSet 完全相同 底层为一个 tabe 数组 <K,V> 实际是 HashMap$Node 类,而且他还实现了 entry 接口import java.util.HashMap;
import java.util.Map;
import java.util.Set;// 模拟 HashMap 扩容树化
@SuppressWarnings({"all"})
public class HashMap_ {public static void main(String[] args) {HashMap map = new HashMap();for (int i=0;i<=12;i++){map.put(new A(i),"majunyi"); //Value 可以重复}//12个Key->Value,因为 虽然hashCode 都为100,但没有重写equals 方法,所以有12个对象Set set = map.entrySet();for (Object o :set) {Map.Entry entry=(Map.Entry) o;System.out.println(entry);}}
}class A{private int num;public A(int num) {this.num = num;}public int getNum() {return num;}public void setNum(int num) {this.num = num;}// 所有 的A对象 hashCode 都为100;@Overridepublic int hashCode() {return 100;}@Overridepublic String toString() {return "A{" +"num=" + num +'}';}
}
可能大家看不懂上面的entry遍历HashMap的实现,没关系,接下来我将会为大家详细介绍,以及为大家展示Map接口类的六大遍历方法:
package jihe.Map_.com;import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;@SuppressWarnings({"all"})
public class HashMapTest {public static void main(String[] args) {Map map=new HashMap();/* 创建 Preson 类,包括 name, slo, id, 要求 添加三个员工对象键 id值 员工对象用两种不同的遍历方法 输出工资大于等于18000的员工*/map.put(20221001,new Preson("jact",40002.23,202221001));map.put(20221012,new Preson("tom",3000.45,202221012));map.put(20222023,new Preson("majunyi",20005.65,20222023));//获取 Value// map.keySet() 方法System.out.println("map.keySet()方法:");// 1.增强 forSet set = map.keySet();//得到的是 Key 通过 map.get(Key)=Valuefor (Object o :set) {Preson preson=(Preson) map.get(o);if(preson.getSlo()>=18000){System.out.println(preson);}}System.out.println("\n\n\n");// 2. 迭代器Iterator iterator = set.iterator();while (iterator.hasNext()) {Object next = iterator.next();Preson preson=(Preson) map.get(next);if(preson.getSlo()>=18000){System.out.println(preson);}}// map.entrySet() 方法System.out.println("\n\n\nmap.entrySet() 方法:");Set set1 = map.entrySet();//得到 Node 键值对// 1.增强 forfor (Object o :set1) {Map.Entry entry=(Map.Entry) o;Preson preson=(Preson) entry.getValue();if(preson.getSlo()>=18000){System.out.println(preson);}}System.out.println("\n\n\n");// 2. 迭代器Iterator iterator1 = set1.iterator();while (iterator1.hasNext()) {Object next = iterator1.next();Map.Entry entry=(Map.Entry) next;Preson preson=(Preson) entry.getValue();if(preson.getSlo()>=18000){System.out.println(preson);}}}
}class Preson{private String name;private double slo;private long id;public Preson(String name, double slo, long id) {this.name = name;this.slo = slo;this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public double getSlo() {return slo;}public void setSlo(double slo) {this.slo = slo;}public long getId() {return id;}public void setId(long id) {this.id = id;}@Overridepublic String toString() {return "Preson{" +"name='" + name + '\'' +", slo=" + slo +", id=" + id +'}';}
}
另外还有 另一种遍历方式 Collection values = map.values(); 我没有为大家展示,因为他和Set set = map.keySet();//得到的是 Key,而且最重要的是他不能向下转型为Object 类和Set的实现类,因此不能通过 map.get(Key)=Value 来获取Value,因此不常用,我就不给大家展示了。
如果大家有兴趣那就请看下面这个例子,其中展示了Map接口实现类的六大遍历方式:
package jihe.Map_.com;import java.util.*;//Map 接口方法和六大遍历方式
// HashMap 键无序 ,Hashtabe 键无序, LinkedHashMap 键存取顺序有序相同
@SuppressWarnings({"all"})
public class MapTest {public static void main(String[] args) {Test2();}public static void Test0(){//Map 接口特点// 1. Map 和 Collection 并列,Map 实现用于保存具有映射关系的数据: Key-Value(双列元素)Map map = new HashMap();map.put("no1","风煞");map.put("no2","张无忌");map.put("no1","majunyi");//Map 中 Key 不能重复,若出现Key重复 则替换Valuemap.put("no3","张无忌");//Map 中Value可以重复map.put(null,null);//可以有空System.out.println("map="+map);//无序,HashMap 双向链表//输出: map={no2=张无忌, no1=majunyi, no3=张无忌}map.put(75,"tom");map.put("tom",46);System.out.println("map="+map);//Key 和 Value 之间存在单项一对一的关系,即通过Key 总能找到对应的Value//通过 get 方法传入Key ,会返回对应的 ValueSystem.out.println(map.get("no1")+"\n\n\n");// 输出:majunyi/* 1. Key-Value 是放在 HashMap$Node里的 node = newNode(hash, key, value, null)2. K-V 为了方便程序员的遍历,还会 创建 EntrySet 集合,该集合存放元素的类型 Entry ,而一个Entry对象就有K,V Entry<Entry<K,V>> 即: transient Set<Map.Entry<K,V>> entrySet;3. entrySet 中,定义的类型是Map.Entry,但是实际上存放的是 HashMap$Node这是因为 static class Node<K, V> implements Map.Entry<K,V>4. 当把 HashMap$Node 对象存放到entrySet 方便我们的遍历,因为 Map.Entry 提供了重要方法K getKey(); V getValue();*/Set set=map.entrySet();System.out.println(set.getClass());//为了从HashMap$Node 中取出K-V// 1. 首先做一个向下转型for (Object obj : set) {//System.out.println("obj="+obj);Map.Entry entry = (Map.Entry) obj;System.out.println(entry.getKey()+"-"+entry.getValue());}Set set1 = map.keySet();System.out.println(set1.getClass());Collection values = map.values();System.out.println(values.getClass());// 由于 Map 没有迭代器 因此需要将Map 进行封装成为数组便于遍历}public static void Test1(){//Map 接口方法Map map=new HashMap();// 1. put:添加map.put("邓超","孙俪");map.put("王宝强","马蓉");map.put("宋茜","马蓉");map.put("刘玲博",null);map.put(null,"刘亦菲");map.put("鹿晗","关晓彤");System.out.println("map="+map);// 2. remove:根据键(Key)删除映射map.remove(null);System.out.println("map="+map);// 3. get:根据键获取System.out.println(map.get("鹿晗"));// 4. size: 获取元素个数System.out.println(map.size());// 5. isEmpty:判断是否为空System.out.println(map.isEmpty());// 6. clear:清空所有// 7. containsKey 和 containsValue :查找System.out.println(map.containsKey("鹿晗"));System.out.println(map.containsValue("孙俪"));}public static void Test2(){//Map 六大遍历方法Map map=new HashMap();map.put("邓超","孙俪");map.put("王宝强","马蓉");map.put("王宝强","majnuyi");map.put("宋茜","马蓉");map.put("刘玲博",null);map.put(null,"刘亦菲");map.put("鹿晗","关晓彤");System.out.println(" 第一组");// 第一组. 先取出所有的Key 再取出 每一个Key 所对应的Value// 1. 增强 for map.keySet方法转化为 Set 类System.out.println("****第一种方式****");Set set = map.keySet();//得到的是 Key 通过 map.get(Key)=Valuefor (Object o :set) {System.out.println(o +"-"+map.get(o));}// 2. 迭代器 利用上一步转化的 Set 集合System.out.println("****第二种方式****");Iterator iterator = set.iterator();while (iterator.hasNext()) {Object next = iterator.next();System.out.println(next+"-"+map.get(next));}System.out.println(" 第二组");// 第二组:Collection values = map.values();//无法反向取 Key 即 map.get(value) 会报错// 1.增强 forSystem.out.println("****第一种方式****");for (Object o :values) {System.out.println(o);}// 2. 迭代器System.out.println("****第二种方式****");Iterator iterator1 = values.iterator();while (iterator1.hasNext()) {Object next = iterator1.next();System.out.println("next="+next);}System.out.println(" 第三组");// 第三组:通过 EntrySet 来获取 K-V 即 map.entrySet方法转化为Set类Set set1 = map.entrySet();// 1. 增强 forSystem.out.println("****第一种方式****");for (Object o :set1) {// 运行多态 都为 HashMap$Node类对象// System.out.println("o="+o);Map.Entry entry=(Map.Entry) o;//System.out.println("entry="+entry);System.out.println(entry.getKey()+"-"+entry.getValue());}// 2. 迭代器System.out.println("****第二种方式****");Iterator iterator2 = set1.iterator();while (iterator2.hasNext()) {Object next = iterator2.next();//System.out.println("next-"+next);Map.Entry entry=(Map.Entry) next;System.out.println(entry.getKey()+"-"+entry.getValue());}}
}
下面我来为大家介绍一下Hashtabe 的扩容规则:
package jihe.Map_.com;import java.util.Hashtable;/* Hashtabe 存放 K-V 键值对hashtabe 的键值 K-V 都不能为 null其他原则和HashMap 相同Hashtabe(线程安全)synchronize 使用方法 和HashMap(线程不安全) 一样*/
@SuppressWarnings({"all"})
public class Hashtabe_ {public static void main(String[] args) {Hashtable hashtable = new Hashtable();// hashtable.put("majunyi",null); 异常hashtable.put("majunyi",100);hashtable.put("zhangfei",200);hashtable.put("hello1",467);hashtable.put("129",364);hashtable.put(756,"5689");hashtable.put("yiweiyi",345);hashtable.put("maying","liyu");hashtable.put("shijei","liwieyi");hashtable.put(1233,7878);// 简单说一下Hashtabe 的底层// 1. 底层有数组 Hashtabe$Entry[] 数组,初始化大小为 11// 2. 临界值 threshold 11*0.75=8;// 3. 扩容:按照自己的扩容机制来扩容,并不是两倍// 4. 执行方法 addEntry(hash, key, value, index); 添加K-V 封装到Entry// 5. 当 if (count >= threshold) 成立时,即当前值大于等于临界值时,就进行扩容// 5. 按照 int newCapacity = (oldCapacity << 1) + 1; 的值进行扩容}
}
下面来看看 properties 类及其作用:
package jihe.Map_.com;/* properties 继承自 Hashtabe 类并实现了Map接口,K-V
使用特点和 Hashtabe 类似
Properties 还可以从xxx.properties文件中,加载到Properties 类对象并进行读取和修改
说明: 工作后 xxx.properties 文件通常作为配置文件,这个知识点在IO 流例举*/import java.util.Properties;// Properties 方法@SuppressWarnings({"all"})public class MapProperties_ {public static void main(String[] args) {Properties properties = new Properties();properties.put("john",100);properties.put("majunyi",200);properties.put("zhamgyi","majunyi");// 1. put:添加 键值对(K-V)不能为空// properties.put("majunyi",null); 空指针异常System.out.println(properties); //输出 {majunyi=200, zhamgyi=majunyi, john=100}// 通过 Key 获取对应值 properties.get();System.out.println(properties.get("majunyi"));// 输出 200// 删除properties.remove("john");System.out.println(properties); //输出 {majunyi=200, zhamgyi=majunyi}// 修改properties.setProperty("majunyi","zhangyi");System.out.println(properties); // 输出 {majunyi=zhangyi, zhamgyi=majunyi}}
}
最后让我们来看看 TreeMap类,在上面介绍 TreeSet的时候也有说到,那我们来进行进一步了解吧:
package jihe.Map_.com;import java.util.Comparator;
import java.util.TreeMap;// K-V 键值对 和TreSet 相同可以排序使元素存取有序 针对的都是(标准) Key
@SuppressWarnings({"all"})
public class TreeMap_ {public static void main(String[] args) {TreeMap treeMap = new TreeMap(new Comparator() {@Overridepublic int compare(Object o1, Object o2) {// 按照字符串大小// 下面 调用String 的comparatTo 比较字符串大小 Key (与C语言中字符串比较strcmp()函数效果相同)即按照字典排序 从大到小// 1. 若要从大到小 则交换下面的o1和o2return ((String) o1).compareTo((String) o2);// 2. 如果按照字符串长度大小排序 从小到大// return ((String) o1).length()-((String) o2).length();// 但是认为长度相同的字符串就是相同的元素// 即认为 (Key)tom 和(Key)jac 是相同的元素,不会发生Value替换,直接添加失败 ,不建议使用}});treeMap.put("jact","杰克");treeMap.put("tom","汤姆");treeMap.put("smith","史密斯");treeMap.put("majunyi","风煞");// System.out.println(treeMap); // 输出:{jact=杰克, majunyi=风煞, smith=史密斯, tom=汤姆}// 可以发现 现在是无序的System.out.println(treeMap);/*1. 当使用无参构造器创建 Treeset 对象时,仍然是无序的2. 希望按照添加元素,按照字符串大小来排序3. 那就需要使用TreeMap 的一个构造器,可以传入一个比较器(匿名内部类) 并指定排序方式TreeMap treeMap = new TreeMap(new Comparator() {@Overridepublic int compare(Object o1, Object o2) {return 0;}});构造器将传入的比较对象赋值给 TreeMap 的属性this.comparatorpublic TreeMap(Comparator<? super K> comparator) {this.comparator = comparator;}*//*2.1 put: 第一次添加,把K-V 封装到 Entry 对象,放入 rootEntry<K,V> t = root;if (t == null) {addEntryToEmptyMap(key, value);return null;}2.2 以后添加Comparator<? super K> cpr = comparator;if (cpr != null) {do {// 遍历所有的 Key,给Key找合适的位置parent = t;cmp = cpr.compare(key, t.key);// 动态绑定到我们的匿名内部类的compareif (cmp < 0)t = t.left;else if (cmp > 0)t = t.right;else {// 如果遍历过程中,发现准备添加的Key 和当前已有的Key 相等,就不添加V oldValue = t.value;if (replaceOld || oldValue == null) {t.value = value;}return oldValue;}} while (t != null);}*/}
}
他的排序规则和TreeSet 一样只不过他的排序标准是参照Key 来实现的。
完啦!谢谢看完的朋友,那就送大家一个彩蛋吧
小彩蛋 🥚
public class HashSetSoure {public static void main(String[] args) {System.out.println(" ::## ##:: \n" +"::::::## ##::::::\n" +"::::::## ## : ## ##::::::\n" +"::::::::## ##::##::## ##::::::::\n" +"::::::::## ####::##::#### ##::::::::\n" +":::::::::: ####::::::::::::::#### ::::::::::\n" +":::::::::: ##::::::::::::::::::::::## ::::::::::\n" +"::::::::::##@@::::::::::::::::::::::@@##::::::::::\n" +"::::::::##@@##@@::::::::::::::::::@@##@@##::::::::\n" +"::::::##@@######@@::::::::::::::@@######@@##::::::\n" +" ##::##@@#### ##@@::::::::::@@## ####@@##::## \n" +" ::##@@########@@::::::::::@@########@@##:: \n" +" ####@@## ####@@::######::@@#### ##@@#### \n" +" ##::@@####@@::##########::@@####@@::## \n" +" ##::::@@@@::::::######::::::@@@@::::## \n" +" :::::::::::::::::::::::::::::::::: \n" +" ::@@@@@@@@@@@@@@@@@@@@@@@@@@:: \n" +" ##::@@@@@@::## \n" +" ##::::##@@##::::## \n" +" ######::##@@##::###### \n" +" ##::::::####@@####::::::## \n" +" ######::##@@@@@@##::###### \n" +" ######::##@@@@@@##::###### \n" +" ##::::::##########::::::## \n" +" ###### ###### ");}
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
相关文章
- 【汇编与接口技术】8086CPU 与寻址方式
1、有两个16位字1EE5H和2A3CH分别存放在微机存储器000B0H和000B3H单元中,请用图示表示出它们在存储器里的存储情况。 2、微机存储器里存放的信息如右图示,试读出30022H和30024H字节单元的内容,以及30021H和30022H字单元中的内容。 答&#x…...
2024/4/7 15:08:24 - UT2014学习笔记
3.1 踢 之前:模仿另一个代理的现有踢球来学习从已知的起点进一步踢球。 现在:采取必要的步骤接近球后可靠地踢球。 改进的方法:通过学习为团队的全方位步行引擎设置的一个新的踢进方式步行参数。 目的:在目标点的一个小边界框…...
2024/4/19 19:51:19 - 任务安排问题
(1)问题描述:输入:活动集合S,每个活动的起始时间集合和每个活动的终止时间,其中1in;输出:S的最大相容集合S。 (2)问题分析: 相容活动的理解: 贪心思想: 1.选择最早开始时间(不一定是最优解&a…...
2024/4/16 23:11:50 - 使用条件结构实现,如果用户名等于字符‘青’,密码等于数字‘123’,就输出“欢迎你,青”,否则就输出“对不起,你不是青”。
先声明两个变量,一个是char型的,用来存放用户名,一个是int型的,用来存放密码。 import java.util.Scanner;class Exer1 {public static void main(String[] args) {Scanner scan new Scanner(System.in);char username; //首先…...
2024/4/14 23:53:46 - 利用docker构建samba服务
1.启动 docker run -dit -p 139:139 -p 445:445 --restart always --name samba -v /data:/data --privileged centos:latest /usr/sbin/init2.进入 docker exec -it samba /bin/bash3.进入docker内安装samba服务 3.1修改字符集,支持中文字符 yum -y install g…...
2024/4/14 11:16:45 - python多进程multiprocessing使用,看这篇就够了(二)
1.上篇都是直接创建Process对象来创建子进程,其实还可以通过继承来创建子进程。 来看看Process源码,可以通过承继Process,重写run方法来启动子进程。因为对一个不包括target属性(即当targetNone时)的Process类执行sta…...
2024/4/14 11:17:20 - springsecurity - 生成BCryptPasswordEncoder密码
依赖 <!-- spring security 安全认证 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId></dependency> 工具类 import org.springframework.security.crypto.bc…...
2024/5/1 9:44:53 - Discuz X3综合新闻资讯类门户网站模板/适合做科技类新闻综合类资讯门户行业网站源码
☑️ 编号:ym251 ☑️ 品牌:Discuz X3 ☑️ 语言:PHP ☑️ 大小:7.5MB ☑️ 类型:综合新闻资讯类 ☑️ 支持:pcwap 🎉 欢迎免费领取(注明编号) 🎉 ✨ 源码介绍…...
2024/4/14 11:17:15 - JAVA String 类
与String相关的知识点 String的声明是final的,不可被继承String 实现了Serializable接口:表示String支持序列化String实现了Comparable:表示String可以比较大小String 内部定义了final char[] value 用于存储字符串数据String 为不可变字符序…...
2024/5/1 5:32:11 - 【word】双栏写作如何调整为写满左栏再写右栏
word双栏写作一般默认都是写满了左栏再跳到右栏,如果不小心设置了添加了设置标记。 问题图: 步骤: 点击显示段落标记 2.然后原文就可以看到标记: 3,直接删掉即可...
2024/5/1 5:07:59 - 《Netlogo多主体建模入门》学习笔记(3)
第四章 朗顿的蚂蚁 代码实现:Langton ant to setupclear-allreset-tickscreate-turtles 1[set heading random 3 * 90] endto goask turtles [ifelse (pcolor white)[right 90set pcolor blackforward 1][left 90set pcolor whiteforward 1]]tick end 代码效果&…...
2024/4/14 11:17:20 - picgo图片不显示问题以及转外链失败问题(mac版)
picgo图片不显示问题以及转外链失败问题(mac版) 把gitee里的私有仓库改为公有的 再重启picgo,可以解决同时解决上传csdn的源站可能有防盗链接的问题 转载:这儿...
2024/5/1 7:06:42 - JavaSE 第六章
1、封装 我们程序设计追求“高内聚,低耦合”。高内聚 :类的内部数据操作细节自己完成,不允许外部干 涉;低耦合 :仅对外暴露少量的方法用于使用。 隐藏对象内部的复杂性,只对外公开简单的接口。便于外界调…...
2024/4/17 22:50:24 - Java日记之封装
封装类,可以联想以下c语言的结构体;定义类,定义其属性、方法的过程称为封装类。 class Students {int age;String name;//Java中没有char,所以字符型用Stringdouble score;//上面定义了数据,以下要定义方法void intro…...
2024/4/7 15:08:11 - 【Flink】【第八章】 ProcessFunctionAPI
1.ProcessFunction介绍 1.1 API上的说明 A function that processes elements of a stream.For every element in the input stream processElement(Object, ProcessFunction.Context, Collector) is invoked. This can produce zero or more elements as output. Implementa…...
2024/4/27 0:26:13 - 计算机毕业设计php_thinphp_vue的教材管理系统(源码+系统+mysql数据库+Lw文档)
运行环境 开发语言:PHP 数据库:MYSQL数据库 应用服务:apache服务器 使用框架:ThinkPHPvue 开发工具:VScode/Dreamweaver/PhpStorm等均可 项目简介 教材是每个学生和学校都必须具备的教学资源之一,它是知识的载体,是学生汲取知识的土壤&…...
2024/4/20 6:08:00 - LeetCode——石子游戏 IX
题目: 解题思路: 一开始拿到题目想到思路就是两个人轮流拿石子只要保证每次拿到的石子不会导致已移除的所有石子的值之和能够被整除3即可。这一思路存在的问题就是忽略了最佳,就仅仅是保证了当下这一步自己不会输掉游戏但是并没有考虑对手以…...
2024/4/19 11:42:20 - git分布式版本控制工具入门与使用
Git源代码管理工具 一、Git概述 1.0 Git作用 源代码管理Git 是目前世界上最先进的分布式版本控制系统(没有之一) 1.1 Git的特点 ① GIT 是分布式管理.服务器和客户端都有版本控制能力,都能进行代码的提交、合并、… ② Git 会在根目录下创建一个.g…...
2024/4/14 11:17:10 - 2021年茶艺师(初级)考试及茶艺师(初级)报名考试
题库来源:安全生产模拟考试一点通公众号小程序 安全生产模拟考试一点通:茶艺师(初级)考试是安全生产模拟考试一点通生成的,茶艺师(初级)证模拟考试题库是根据茶艺师(初级࿰…...
2024/4/19 23:39:12 - 【算法分析与设计期末复习】贪心算法交换论证
给定正整数数组A,请设计一个方法把这些整数拼接起来,使得拼接结果数最大。例如:A [1, 32, 212],拼接结果为322121。 1)设计一个贪心算法,输出拼接结果(字符串格式),并分…...
2024/4/7 15:08:09
最新文章
- Python+PYGObject/PYGtk+CSS样式--2024python示例
隔久点不用老是会忘,留个笔记。。 PythonPYGObject/PYGtk,加载 CSS 样式的演示代码 demo 运行的效果截图: #!/usr/bin/env python3 import sys import gigi.require_version("Gtk", "3.0") from gi.repository import …...
2024/5/1 10:06:31 - 梯度消失和梯度爆炸的一些处理方法
在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言,在此感激不尽。 权重和梯度的更新公式如下: w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...
2024/3/20 10:50:27 - 推荐学习什么编程语言?
选择编程语言学习时,除了就业因素外,还可以考虑以下几个方面来决定学习哪些编程语言: 个人兴趣与目标:如果你对某个特定领域感兴趣,比如游戏开发、数据分析、人工智能等,可以选择与该领域紧密相关的编程语言…...
2024/4/30 1:20:07 - [C++/Linux] UDP编程
一. UDP函数 UDP(用户数据报协议,User Datagram Protocol)是一种无连接的网络协议,用于在互联网上交换数据。它允许应用程序发送数据报给另一端的应用程序,但不保证数据报能成功到达,也就是说,它…...
2024/4/30 4:30:51 - llama.cpp运行qwen0.5B
编译llama.cp 参考 下载模型 05b模型下载 转化模型 创建虚拟环境 conda create --prefixD:\miniconda3\envs\llamacpp python3.10 conda activate D:\miniconda3\envs\llamacpp安装所需要的包 cd G:\Cpp\llama.cpp-master pip install -r requirements.txt python conver…...
2024/4/30 5:06:46 - 【外汇早评】美通胀数据走低,美元调整
原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...
2024/4/29 23:16:47 - 【原油贵金属周评】原油多头拥挤,价格调整
原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...
2024/4/30 18:14:14 - 【外汇周评】靓丽非农不及疲软通胀影响
原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...
2024/4/29 2:29:43 - 【原油贵金属早评】库存继续增加,油价收跌
原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...
2024/4/30 18:21:48 - 【外汇早评】日本央行会议纪要不改日元强势
原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...
2024/4/27 17:58:04 - 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响
原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...
2024/4/27 14:22:49 - 【外汇早评】美欲与伊朗重谈协议
原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...
2024/4/28 1:28:33 - 【原油贵金属早评】波动率飙升,市场情绪动荡
原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...
2024/4/30 9:43:09 - 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试
原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...
2024/4/27 17:59:30 - 【原油贵金属早评】市场情绪继续恶化,黄金上破
原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...
2024/4/25 18:39:16 - 【外汇早评】美伊僵持,风险情绪继续升温
原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...
2024/4/28 1:34:08 - 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势
原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...
2024/4/26 19:03:37 - 氧生福地 玩美北湖(上)——为时光守候两千年
原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...
2024/4/29 20:46:55 - 氧生福地 玩美北湖(中)——永春梯田里的美与鲜
原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...
2024/4/30 22:21:04 - 氧生福地 玩美北湖(下)——奔跑吧骚年!
原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...
2024/5/1 4:32:01 - 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!
原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...
2024/4/27 23:24:42 - 「发现」铁皮石斛仙草之神奇功效用于医用面膜
原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...
2024/4/28 5:48:52 - 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者
原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...
2024/4/30 9:42:22 - 广州械字号面膜生产厂家OEM/ODM4项须知!
原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...
2024/4/30 9:43:22 - 械字号医用眼膜缓解用眼过度到底有无作用?
原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...
2024/4/30 9:42:49 - 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...
解析如下:1、长按电脑电源键直至关机,然后再按一次电源健重启电脑,按F8健进入安全模式2、安全模式下进入Windows系统桌面后,按住“winR”打开运行窗口,输入“services.msc”打开服务设置3、在服务界面,选中…...
2022/11/19 21:17:18 - 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。
%读入6幅图像(每一幅图像的大小是564*564) f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...
2022/11/19 21:17:16 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...
win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面,在等待界面中我们需要等待操作结束才能关机,虽然这比较麻烦,但是对系统进行配置和升级…...
2022/11/19 21:17:15 - 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...
有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows,请勿关闭计算机”的提示,要过很久才能进入系统,有的用户甚至几个小时也无法进入,下面就教大家这个问题的解决方法。第一种方法:我们首先在左下角的“开始…...
2022/11/19 21:17:14 - win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...
置信有很多用户都跟小编一样遇到过这样的问题,电脑时发现开机屏幕显现“正在配置Windows Update,请勿关机”(如下图所示),而且还需求等大约5分钟才干进入系统。这是怎样回事呢?一切都是正常操作的,为什么开时机呈现“正…...
2022/11/19 21:17:13 - 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...
Win7系统开机启动时总是出现“配置Windows请勿关机”的提示,没过几秒后电脑自动重启,每次开机都这样无法进入系统,此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一:开机按下F8,在出现的Windows高级启动选…...
2022/11/19 21:17:12 - 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...
有不少windows10系统用户反映说碰到这样一个情况,就是电脑提示正在准备windows请勿关闭计算机,碰到这样的问题该怎么解决呢,现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法:1、2、依次…...
2022/11/19 21:17:11 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...
今天和大家分享一下win7系统重装了Win7旗舰版系统后,每次关机的时候桌面上都会显示一个“配置Windows Update的界面,提示请勿关闭计算机”,每次停留好几分钟才能正常关机,导致什么情况引起的呢?出现配置Windows Update…...
2022/11/19 21:17:10 - 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...
只能是等着,别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚,只能是考虑备份数据后重装系统了。解决来方案一:管理员运行cmd:net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...
2022/11/19 21:17:09 - 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?
原标题:电脑提示“配置Windows Update请勿关闭计算机”怎么办?win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢?一般的方…...
2022/11/19 21:17:08 - 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...
关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!关机提示 windows7 正在配…...
2022/11/19 21:17:05 - 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...
钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...
2022/11/19 21:17:05 - 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...
前几天班里有位学生电脑(windows 7系统)出问题了,具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面,长时间没反应,无法进入系统。这个问题原来帮其他同学也解决过,网上搜了不少资料&#x…...
2022/11/19 21:17:04 - 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...
本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法,并在最后教给你1种保护系统安全的好方法,一起来看看!电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中,添加了1个新功能在“磁…...
2022/11/19 21:17:03 - 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...
许多用户在长期不使用电脑的时候,开启电脑发现电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机。。.这要怎么办呢?下面小编就带着大家一起看看吧!如果能够正常进入系统,建议您暂时移…...
2022/11/19 21:17:02 - 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...
配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!配置windows update失败 还原更改 请勿关闭计算机&#x…...
2022/11/19 21:17:01 - 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...
不知道大家有没有遇到过这样的一个问题,就是我们的win7系统在关机的时候,总是喜欢显示“准备配置windows,请勿关机”这样的一个页面,没有什么大碍,但是如果一直等着的话就要两个小时甚至更久都关不了机,非常…...
2022/11/19 21:17:00 - 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...
当电脑出现正在准备配置windows请勿关闭计算机时,一般是您正对windows进行升级,但是这个要是长时间没有反应,我们不能再傻等下去了。可能是电脑出了别的问题了,来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...
2022/11/19 21:16:59 - 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...
我们使用电脑的过程中有时会遇到这种情况,当我们打开电脑之后,发现一直停留在一个界面:“配置Windows Update失败,还原更改请勿关闭计算机”,等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢࿰…...
2022/11/19 21:16:58 - 如何在iPhone上关闭“请勿打扰”
Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...
2022/11/19 21:16:57