集合框架

Java集合框架(Java Collections Framework,JCF)是为表示和操作集合而规定的一种统一的标准的体系结构。任何集合框架都包含三大块内容:对外的接口、接口的实现和对集合运算的算法。

集合框架-Collection:

 

Collection

集合框架
* java.util.Collection接口,该接口是所有接口的顶级接口,规定了所有集合都应当 具备的功能方法
Collection 下面又分为不同的集合类型,常见的有两个:
* java.util.Set;接口: 不可重复集,常用实现类java.util.HashSet
* java.util.List:可重复集,并且有序,常见 实现类:java.util.ArrayListjava.util.LinkedList
* 这里指的重复元素是否可以重复,二重复元素的判定标准是元素自身equals比较是否为true

List和Set

  • 在实际开发中,需要将使用的对象存储于特定数据结构的容器中。JDK提供 了这样的容器----集合(Collection)。
  • Collection是一个接口, 定义了集合相关的操作方法,其有两个子接口: ListSet
  • List:可重复集,元素是否重复,取决于元素的equals( )比较的结果
  • Set:不可重复集



集合持有对象的引用

集合中存储的都是引|用类型元素, 并且集合只保存每个元素对象的引用,而并非将元素对象本身存入集合。

public void testRef( {Collection<Cell> cells = new ArrayList <Cell> 0;cells.add(new Cell(1, 2));Cellcell = new Cell(2, 3);cells.add(cell);System.out.println(cell);// (2,3)System.out.printIn(cells);// [(1,2), (2,3)]cell.drop();System.out.printn(cell);// (3,3)System.out.println(cells);// [(1,2), (3,3)]
}

集合中常见方法

方式方法说明
集合中的操作boolean add(E e)向当前集合中添加给定的元素,返回值为true时表示该元素成功添加到集合中
int size( )返回当前集合的元素个数
boolean isEmpty( )判断当前集合是否为空集(集合不含有任何元素,size为0时)
void clear( )清空集合
boolean contains(E e)

判断当前集合是否包含给定元素,判断依据是给定元素与集合现有元素是否存在.

equals比较为true的情况,存在则认为包含。

boolean remove(E e)删除给定元素,删除的也是与给定元素equals比较为true的元素。对于List集合而言重复元素只会删除一次

集合间操作

 

boolean addAll(Collection c)将给定集合中的所有元素添加到当前集合中。
boolean containsAll(Collection c)判断当前集合是否包含给定集合中的所有元素。
removeAll(Collection c)删除交集,即:删除当前集合中与给定集合的共有元素。但是给定的集合元素不受影响。

 

 

 

 

 

 

 

 

 

 

 

 

add方法

  • Collection定义了一个add方法用于向集合中添加新元素。
  • boolean add(E e)
  • 该方法会将给定的元素添加进集合,若添加成功则返回true,否则返回false

size、clear、 isEmpty

int size( )
该方法用于返回当前集合中的元素总数。
void clear( )
该方法用于清空当前集合。
boolean isEmpty( )
该方法用于判断当前集合中是否不包含任何元素

package collection;import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;public class CollectionDemo1 {public static void main(String[] args) {	Collection c = new ArrayList();
//		Collection c = new HashSet();/** boolean add(E e)* 向当前集合中添加给定的元素,返回值为true时表示该元素成功添加到集合中*/c.add("one");c.add("two");c.add("three");c.add("four");c.add("five");
//		c.add("one");//List集合可以存放,Set集合就不行了。System.out.println(c);/** int size()* 返回当前集合的元素个数*/int size = c.size();System.out.println("size:"+size);/** boolean isEmpty()* 判断当前集合是否为空集(集合不含有任何元素,size为0时)*/boolean isEmpty = c.isEmpty();System.out.println("是否为空集:"+isEmpty);/** void clear()* 清空集合*/c.clear();System.out.println(c);System.out.println("size:"+c.size());System.out.println("是否为空集:"+c.isEmpty());}
}

contains方法

  • boolean contains(Object o)
  • 该方法会用于判断给定的元素是否被包含在集合中。若包含则返回true,否则返回false。
  • 这里需要注意的是,集合在判断元素是否被包含在集合中是根据每个元素的equals(方法进行比较后的结果。
  • 通常有必要重写equals(保证contains(方法的合理结果

remove方法

  • boolean remove(E e)
  • 删除给定元素,删除的也是与给定元素equals比较为true的元素。对于List集合而言重复元素只会删除一次
package collection;import java.util.ArrayList;
import java.util.Collection;/*** 集合的很多操作与元素的equals方法有关。**/
public class CollectionDemo2 {public static void main(String[] args) {Collection c = new ArrayList();c.add(new Point(1,2));c.add(new Point(3,4));c.add(new Point(5,6));c.add(new Point(7,8));c.add(new Point(1,2));System.out.println(c);Point p = new Point(1,2);/** boolean contains(E e)* 判断当前集合是否包含给定元素,判断依据是给定元素与集合现有元素是否存在* equals比较为true的情况,存在则认为包含。*/boolean contains = c.contains(p);System.out.println("是否包含:"+contains);/** boolean remove(E e)* 删除给定元素,删除的也是与给定元素equals比较为true的元素。对于List* 集合而言重复元素只会删除一次*/c.remove(p);System.out.println(c);}
}
package collection;import java.util.ArrayList;
import java.util.Collection;/*** 集合只能存放引用类型元素,并且保存的也是元素的引用(地址)**/
public class CollectionDemo3 {public static void main(String[] args) {Point p = new Point(1,2);Collection c = new ArrayList();c.add(p);System.out.println("p:"+p);//(1,2)System.out.println("c:"+c);//[(1,2)]p.setX(2);System.out.println("p:"+p);//(2,2)System.out.println("c:"+c);//[(2,2)]}
}

addAll、containsAll、removeAll

boolean addAll(Collection<? extends E> c) 
该方法需要我们传入一个集合, 并将该集合中的所有元素添加到当前集合中。
如果此collection由于调用而发生更改,则返回true
boolean containsAll(Collection<?> c)
该方法用于判断当前集合是否包含给定集合中的所有元素,若包含则返回true。
removeAll(Collection c)

删除交集,即:删除当前集合中与给定集合的共有元素。但是给定的集合元素不受影响。

package collection;import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;/*** 集合间的操作* @author 范传奇**/
public class CollectionDemo4 {public static void main(String[] args) {Collection c1 = new ArrayList();c1.add("java");c1.add("c++");c1.add(".net");System.out.println("c1:"+c1);Collection c2 = new HashSet();c2.add("android");c2.add("ios");c2.add("java");System.out.println("c2:"+c2);/** boolean addAll(Collection c)* 将给定集合中的所有元素添加到当前集合中。*/
//		c2.addAll(c1);//重复元素不能放入Set集合两次c1.addAll(c2);System.out.println("c1:"+c1);System.out.println("c2:"+c2);Collection c3 = new ArrayList();c3.add(".net");c3.add("ios");
//		c3.add("php");System.out.println("c3:"+c3);/** boolean containsAll(Collection c)* 判断当前集合是否包含给定集合中的所有元素。* * 注意区别昨天学习的contains方法,如果是:* c1.contains(c3)* 则是判断当前c1集合中是否有一个元素是c3集合。此时是把c3当成一个元素看待* 由于c1集合中没有一个元素是一个集合类型,因此返回为false.*/boolean contains = c1.containsAll(c3);System.out.println("c1是否包含c3所有元素:"+contains);/** removeAll(Collection c)* 删除交集,即:删除当前集合中与给定集合的共有元素。但是给定的集合元素不受* 影响。* */c1.removeAll(c3);//删除交集,删除c1当中与c3集合的共有元素System.out.println("c1:"+c1);//c1元素减少了System.out.println("c3:"+c3);//c3元素没有变化}
}

Iterator

 java.util.Iterator接口
该接口是迭代器接口,规定了迭代器遍历集合的相关操作,不同的集合实现类都提供了一个用于遍历自身元素的迭代器实现类。我们无需知道每种集合提供的迭代器实现类的名字,只需要当它是Iterator看待即可。迭代器遍历集合的步骤遵循:问,取,删
其中删除元素不是遍历过程中的必须操作。

hasNext、next方法

  • 迭代器用于遍历集合元素。获取迭代器可以使用Collection定义的方法:Iterator iterator( )
  • 迭代器Iterator是个接口,集合在重写Collectioniterator( )方法时利用内部类提供了迭代器的实现。
  • Iterator提供了统一的遍历集合元素的方式,其提供了用于遍历集合的两个方法:
  1. boolean hasNext( ):判断集合是否还有元素可以遍历。
  2. E next( ):返回迭代的下一个元素


remove方法

  • 在使用迭代器遍历集合时,不能通过集合的remove方法删除集合元素,否则会抛出并发更改异常。我们可以通过迭代器自身提供的remove( )方法来删除通过next(迭代出的元素。
  • - - -void remove( )
  • 迭代器的删除方法是在原集合中删除元素
  • 这里需要注意的是,在调用remove方法前必须通过迭代器的next( )方法迭代过元素,那么删除的就是这个元素。并且不能再次调用remove方法,除非再次调用next( )后方可再次调用。
package collection;import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;/*** 集合的遍历* Collection提供了统一的遍历集合元素的操作:迭代器* * 方法:* Iterator iterator()* 该方法会获取一个用于遍历当前集合的迭代器* * java.util.Iterator接口* 该接口是迭代器接口,规定了迭代器遍历集合的相关操作,不同的集合实现类都提供了* 一个用于遍历自身元素的迭代器实现类。我们无需知道每种集合提供的迭代器实现类* 的名字,只需要当它是Iterator看待即可。迭代器遍历集合的步骤遵循:问,取,删* 其中删除元素不是遍历过程中的必须操作。* @author 范传奇**/
public class CollectionDemo5 {public static void main(String[] args) {Collection c = new ArrayList();c.add("one");c.add("#");c.add("two");c.add("#");c.add("three");c.add("#");c.add("four");c.add("#");c.add("five");System.out.println(c);//获取遍历该集合的迭代器Iterator it = c.iterator();/** boolean hasNext()* 判断集合是否还有下一个元素可以遍历(第一次遍历时相当于询问有没有第一个元素)*/while(it.hasNext()) {/** E next()* 获取集合下一个元素,同样的,第一次调用时获取的是第一个元素*/String str = (String)it.next();System.out.println(str);//遍历的过程中删除所有#if("#".equals(str)) {/** 迭代器有一个要求,遍历的过程中不可以通过集合的方法增删元素* 否则遍历过程中会抛出异常:ConcurrentModificationException*/
//				c.remove(str);/** 迭代器提供了remove方法,删除的是通过next获取的元素*/it.remove();}}System.out.println(c);}
}



增强型for循环

 

  • Java5.0之后推出了一个新的特性,增强for循环,也称为新循环。该循环不通用于传统循环的工作,其只用于遍历集合或数组。
  • 语法:
  •         for( 元素类型  e  集合或数组  ){
  •                  循环体
  •        }
  •          
  • 新循环并非新的语法,而是在编译过程中,编译器会将新循环转换为迭代器模式。所以新循环本质上是迭代器。

泛型机制

泛型在集合中的应用

  • 泛型是Java SE 5.0引入的特性,泛型的本质是参数化类型。在类、接口和方法的定义过程中,所操作的数据类型被传入的参数指定。
  • Java泛型机制广泛的应用在集合框架中。所有的集合类型都带有泛型参数,这样在创建集合时可以指定放入集合中元素的类型。Java编译 器可以据此进行类型检查,这样可以减少代码在运行时出现错误的可能性。
  • ArrayList类的定义中,<E>中的E为泛型参数,在创建对象时可以将类型作为参数传递,此时, 类定义所有的E将被替换成传入的参数;
package collection;import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;/*** JDK5推出时,推出了一个特性:增强型for循环。* 该特性使得我们可以用相同的语法遍历数组和集合。* * 语法:* for(接收元素的变量定义 : 集合或数组){* 	循环体* }* * JDK5推出时还推出了一个特性:泛型* 泛型又称为参数化类型,可以在使用一个类时指定该类中某个属性或者方法的参数,返回值* 的类型。使得使用时更灵活。* 泛型在集合中广泛应用,用于指定集合中的元素类型。支持泛型的类在使用时若不指定泛型* 的实际类型时,默认为Object* **/
public class NewForDemo {public static void main(String[] args) {String[] array = {"one","two","three","four","five"};for(int i=0;i<array.length;i++) {String str = array[i];System.out.println(str);}/** 新循环语法是编译器认可的而非虚拟机,我们使用新循环遍历数组时会被* 编译器改为使用普通for循环遍历。*/for(String str : array) {System.out.println(str);}/** Collection<E>,集合定义时有一个泛型类型E,那么使用时可以指定E表示的* 实际类型是什么,下面的例子中实际类型指定的为Integer*/Collection<Integer> c = new ArrayList<Integer>();c.add(1);//自动装箱c.add(2);c.add(3);c.add(4);c.add(5);
//		c.add("one");//编译不通过,编译器会检查传入的参数是否为IntegerSystem.out.println(c);//迭代器使用时同样要指定泛型,类型与遍历的集合指定的泛型一致即可。Iterator<Integer> it = c.iterator();while(it.hasNext()) {Integer i = it.next();//获取元素时无需再造型。System.out.println(i);}/** 新循环遍历集合会被编译器改为迭代器遍历,因此使用新循环遍历集合的过程* 中不能通过集合的方法增删元素。*/for(Integer i : c) {//集合指定泛型后,这里可以直接用泛型指定类型接收System.out.println(i);}/** 使用新循环(迭代器)遍历集合不是并发安全的,也不会和集合的增删元素做* 互斥,因此在多线程使用下,要自行维护多个线程对该集合的操作,避免一个* 线程遍历的过程中其他线程进行增删元素操作,否则遍历这里会抛出异常。*/}
}

新的方法:foreach

JDK8之后集合推出了一个新的方法:foreach,可以使用lambda表达式进行遍历。

package collection;import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;/*** JDK8之后集合推出了一个新的方法:foreach,可以使用lambda表达式进行遍历。* 如果一个集合是并发安全的集合,使用foreach方法遍历是可以和增删元素互斥的。* 注:* 哪怕是一个并发安全的集合,迭代器方式遍历也不和增删元素互斥,只能自行使用同步块* 维护互斥关系。* * 我们常用的集合实现类:ArrayList,LinkedList,HashSet都不是线程安全的。* @author 范传奇**/
public class ForeachDemo {public static void main(String[] args) {//JDK7之后,实例化集合时,泛型可以只写<>,而不用再写一遍实际类型。Collection<String> c = new ArrayList<>();c.add("one");c.add("two");c.add("three");c.add("four");c.add("five");System.out.println(c);for(String s : c) {System.out.println(s);}c.forEach((e)->System.out.println(e)	);/** 将现有的集合转换为并发安全的集合*/List<String> list = new ArrayList<>();list.add("1");list.add("2");list.add("3");System.out.println(list);//将给定的list集合转换为线程安全的list集合list = Collections.synchronizedList(list);System.out.println(list);		/** 同样的也有synchronizedSet方法,可以将一个set集合转换为线程安全的* */}
}

 

package collection;import java.util.ArrayList;
import java.util.Collections;
import java.util.List;/*** 线程安全的集合foreach方法和增删元素是互斥的,但是新循环(迭代器)则不是。*/
public class ForeachDemo2 {public static void main(String[] args) {//创建一个线程安全的集合List<String> list = Collections.synchronizedList(new ArrayList<>());list.add("1");list.add("2");list.add("3");list.add("4");list.add("5");System.out.println(list);Thread t1 = new Thread() {public void run() {//新循环遍历(迭代器)
//				for (String s : list) {
//					System.out.println(getName()+":"+s);
//					try {
//						Thread.sleep(1000);
//					} catch (InterruptedException e) {
//					}
//				}//使用forEach遍历 list.forEach(//forEach会和下面线程调用add方法互斥保证并发安全(e)->{System.out.println(getName()+":"+e);try {Thread.sleep(1000);} catch (InterruptedException e1) {}});System.out.println(getName()+":遍历集合完毕!");}};Thread t2 = new Thread() {public void run() {try {Thread.sleep(2000);} catch (InterruptedException e) {}System.out.println(getName()+":开始添加新元素");list.add("6");System.out.println(getName()+":新元素添加完毕!");System.out.println(list);}};t1.start();t2.start();}
}

 

集合操作线性表:

List

ArrayList和LinkedList

  • List接口是Collection的子接口,用于定义线性表数据结构。可以将List理解为存 放对象的数组,只不过其元素个数可以动态的增加或减少。
  • List接口的两个常见实现类为ArrayListLinkedList ,分别用动态数组和链表的方式实现了List接口。
  • 可以认为ArrayListLinkedList的方法在逻辑上完全一样,只是在性能上有定的差别。 ArrayList更适合 于随机访问,而LinkedList更适合于插入和删除。在性能要求不是特别苛刻的情形下可以忽略这个差别。


get和set

List除了继承Collection定义的方法外,还根据其线性表的数据结构定义了一系列方法,其中最常用的就是基于下标的get和set方法:
E get(int index)
获取集合中指定下标对应的元素,下标从0开始。
E set(int index, E elment)
将给定的元素存入给定位置,并将原位置的元素返回。

插入和删除

List根据下标的操作还支持插入与删除操作。
void add(int index,E element):
将给定的元素插入到指定位置,原位置及后续元素都顺序向后移动。
E remove(int index):
删除给定位置的元素,并将被删除的元素返回。

package collection;import java.util.ArrayList;
import java.util.List;/*** java.util.List集合* List集合可以保存重复元素,并且有序。提供了一套通过下标操作元素的方法。* * 常用实现类:* java.util.ArrayList:内部由数组实现,查询性能更好* java.util.LinkedList:内部由链表实现,增删元素性能更好。* 如果不是对性能有特别苛刻要求下,一般都使用ArrayList**/
public class ListDemo {public static void main(String[] args) {List<String> list = new ArrayList<>();list.add("one");list.add("two");list.add("three");list.add("four");System.out.println(list);/** E get(int index)* 获取指定下标处对应的元素*///获取List集合中第三个元素String str = list.get(2);System.out.println(str);for(int i=0;i<list.size();i++) {str = list.get(i);System.out.println(str);}/** E set(int i,E e)* 将给定元素设置到指定位置,返回值为原位置对应的元素(被替换的元素)。*///[one,2,three,four]String old = list.set(1,"2");//指定的下标如果超范围会抛异常System.out.println(list);System.out.println(old);/** 重载的add方法:* void add(int index,E e)* 将给定元素插入到指定位置*///[one,2,3,three,four]list.add(2,"3");System.out.println(list);/** 重载的remove方法* E remove(int index)* 删除并返回指定位置上的元素*///[one,2,3,four]old = list.remove(3);System.out.println(list);System.out.println(old);//three}
}

List subList(int start,int end)获取指定范围内的子集

package collection;import java.util.ArrayList;
import java.util.List;/*** List subList(int start,int end)* 获取指定范围内的子集**/
public class ListDemo2 {public static void main(String[] args) {List<Integer> list = new ArrayList<>();for(int i=0;i<10;i++) {list.add(i);}System.out.println(list);List<Integer> subList = list.subList(3, 8);System.out.println(subList);//将subList中每个元素扩大10倍for(int i=0;i<subList.size();i++) {subList.set(i,subList.get(i) * 10);}	//[30,40,50,60,70]System.out.println(subList);/** 对子集元素的操作就是对原集合对应的操作*/System.out.println(list);/** 删除list集合中2-8的元素*/list.subList(2,9).clear();System.out.println(list);}
}

List转换为数组

List的toArray方法用于将集合转换为数组。但实际上该方法是在Collection中定义的,所以所有的集合都具备这个功能。
其有两个方法:
  Object[ ] toArray( )
< T > T [ toArray(TO a)

其中第二个方法是比较常用的,我们可以传入一个指定类型的数组,该数组的元素类型应与集合的元素类型一致。返回值则是转换后的数组,该数组会保存集合中所有的元素。

package collection;import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;/*** 集合转换为数组**/
public class CollectionToArrayDemo {public static void main(String[] args) {Collection<String> c = new ArrayList<>();c.add("one");c.add("two");c.add("three");c.add("four");System.out.println(c);String[] arr = c.toArray(new String[c.size()]);System.out.println(arr.length);System.out.println(Arrays.toString(arr));}
}

数组转换为List

 

  • Arrays类中提供了一个 静态房方法asList ,使用该方法我们可以将一个数组转换为对应的List集合 。
  • 其方法定义为: static <T>List<T> asList<T.. a>
  • 返回的List的集合元素类型由传入的数组的元素类型决定。
  • 并且要注意的是,返回的集合我们不能对其增删元素否则会抛出异常。并且对集合的元索进行修改会影响数组对应的元素。
package collection;import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;/*** 数组转换为集合* 使用数组的工具类Arrays的asList方法,可以将一个数组转换为一个List集合。* 不支持转换为Set集合,因为Set集合不能放重复元素。**/
public class ArrayToListDemo {public static void main(String[] args) {String[] array = {"one","two","three","four"};System.out.println("array:"+Arrays.toString(array));List<String> list = Arrays.asList(array);System.out.println("list:"+list);/** 修改集合元素就是修改原数组对应的元素*/list.set(1,"2");System.out.println("list:"+list);System.out.println("array:"+Arrays.toString(array));//由于数组是定长的,因此该集合不支持增删元素,会抛出异常的。
//		list.add("five");////单独创建一个集合,将数组转换的集合元素导入就可以随意增删了/** 所有的集合都支持一个参数为Collection的构造方法,作用是在创建当前集合的* 同时包含给定集合的所有元素。*///创建list2集合的同时包含list所有元素List<String> list2 = new ArrayList<>(list);System.out.println("list2:"+list2);list2.add("five");System.out.println("list2:"+list2);}
}

Collections是集合的工具类

Collection 是顶级接口

 

List排序

Colletions. sort方法实现排序

Collections是集合的工具类,它提供了很多便于我们操作集合的方法,其中就有用于集合排序的sort方法。
该方法定义为:
void sort(List<T> list)
该方法的作用是对给定的集合元素进行自然排序。

package collection;import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;/*** 集合的排序* 集合的工具类java.util.Collections提供了一个静态方法sort,可以对List集合进行* 自然排序,即:从小到大**/
public class SortListDemo1 {public static void main(String[] args) {List<Integer> list = new ArrayList<>();Random random = new Random();for(int i=0;i<10;i++) {list.add(random.nextInt(100));}System.out.println(list);Collections.sort(list);System.out.println(list);//反转集合,如果是排序后的集合,则变为从大到小Collections.reverse(list);System.out.println(list);//打乱集合Collections.shuffle(list);System.out.println(list);}
}

Comparable

Collectionssort方法是对集合元索进行自然排序,那么两个元素对象之间就一定要有大小之分。这个大小之分是如何界定的?实际上,在使用Collectionssort排序的集合元素都必须是Comparable接的实现类,该接口表示其子类是可比较的,因为实现该接口必须重写抽象方法:
- int compareTo(T t);

  • 该方法用于使当前对象与给定对象进行比较。
  1. -若当前对象大于给定对象,那么返回值应为> 0的整数。
  2. -若小于给定对象,那么返回值应为< 0的整数。
  3. -若两个对象相等,则应返回0。
package collection;import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;/*** 排序自定义元素的集合**/
public class SortListDemo2 {public static void main(String[] args) {List<Point> list = new ArrayList<>();list.add(new Point(3,4));list.add(new Point(8,9));list.add(new Point(6,5));list.add(new Point(7,2));list.add(new Point(1,8));System.out.println(list);/** 该sort方法要求集合元素必须实现Comparable,否则编译不通过。* 当我们调用某个API时,该API要求我们为其修改其他额外的代码时,这样的操作* 称为侵入性。修改的代码越多,侵入性越强。侵入性不利于系统架构的健康,不利* 与程序的维护,应当尽量避免。* */
//		Collections.sort(list);
//		Collections.sort(list, new Comparator<Point>() {
//			public int compare(Point o1, Point o2) {
//				int len1 = o1.getX()*o1.getX()+o1.getY()*o1.getY();
//				int len2 = o2.getX()*o2.getX()+o2.getY()*o2.getY();
//				return len1-len2;
//			}
//		});		//lambda表达式创建比较器Collections.sort(list, (o1,o2)->o1.getX()*o1.getX()+o1.getY()*o1.getY()-o2.getX()*o2.getX()-o2.getY()*o2.getY());		System.out.println(list);}
}


Comparator

 

  • 一旦Java类实现了Comparable接口, 其比较逻辑就已经确定;如果希望在排序的操作中临时指定比较规则,可以采用Comparator接口回调的方式。
  • Comparator接要求实现类必须重写其定义的方法:  int compare(T o1,T o2)
  • 该方法的返回值要求:
  1. -若o1> o2则返回值应>0
  2. -若01 < o2则返回值应<0
  3. -若o1= =o2则返回值应为0
package collection;import java.util.ArrayList;
import java.util.Collections;
import java.util.List;/*** 排序字符串**/
public class SortListDemo3 {public static void main(String[] args) {List<String> list = new ArrayList<>();		list.add("苍老师");list.add("传奇");list.add("小泽老师");System.out.println(list);/** String本身实现了Comparable接口,比较规则为按照字符的unicode编码的* 大小比较,先看首字符,如果一样再看第二个字符。* 对于中文而言,几乎没有规律可言。*/
//		Collections.sort(list);/** 自定义一个比较器,比较规则为按照字符多少排序,字少的在前,字多的在后*/Collections.sort(list,(o1,o2)->o1.length()-o2.length());System.out.println(list);}
}

练习:生成10个随机数(100)以内,按照大小顺序排序.要求自定义有比较规则

package collection;import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Random;/*** 生成10个随机数(100)以内,按照大小顺序排序.要求自定义有比较规则**/
public class Test {public static void main(String[] args) {List<Integer> list = new ArrayList<>();Random random = new Random();for(int i=0;i<10;i++){list.add(random.nextInt(100));}System.out.println(list);Collections.sort(list, new Comparator<Integer>(){public int compare(Integer o1, Integer o2) {return 	o2 -o1;}});System.out.println(list);Collections.sort(list, (o1,o2)->o2-o1);System.out.println(list);}
}

 

 

 

队列和栈

Queue

 java.util.Queue;接口,队列接口.集成自己的Collection.
常用实现类:java.util.LinkedList;

  •   队列( Queue )是常用的数据结构,可以将队列看成特殊的线性表,队列限制了对线性表的访问方式:只能从线性表的一端添加(offer)元素,从另一端取出(poll)元素。
  • 队列遵循先进先出( FIFO First Input First Output )的原则。
  • JDK中提供了Queue接口,同时使得LinkedList实现了该接口(选择LinkedList实现Queue的原因在于Queue经常要进行添加和删除的操作,而LinkedList在这方面效率较高)

package collection;import java.util.Iterator;
import java.util.LinkedList;
import java.util.Queue;/*** 队列* 队列是经典的数据结构,可以保存一组元素,但是保存元素必须遵循先进先出原则.* * java.util.Queue;接口,队列接口.集成自己的Collection.* 常用实现类:java.util.LinkedList;**/
public class QueueDemo {public static void main(String[] args) {Queue<String> queue = new LinkedList<>();//入队操作,将元素添加到队列末尾queue.offer("one");queue.offer("two");queue.offer("threee");queue.offer("four");queue.offer("five");queue.offer("six");System.out.println(queue);//poll 出队操作,获取队首元素同时,将其从队列删除String str = queue.poll();System.out.println(str);System.out.println(queue);//peek 引用队首元素,获取队首元素后该元素不会出队str = queue.peek();System.out.println(str);System.out.println(queue);System.out.println("size:"+queue.size());//迭代器遍历队列后,,元素还在队列for(String s : queue){System.out.println(s);}System.out.println(queue);/** 用 poll 方法遍历队列,这种操作是一次性的,遍历后队列中就没有元素了*///		while(queue.size()>0){
//			String s = queue.poll();
//			System.out.println(s);
//		}
//		System.out.println(queue);while(!queue.isEmpty()){String s = queue.poll();System.out.println(s);}System.out.println(queue);}}

Deque 

java.util.Deque 接口.双端队列.Deque接口继承自Qeque接口.双端队列的特点是
* 队列两端都可以进行出入队操作
* 实现类:java.util.LinkedList;

  • DequeQueue的子接口, 定义了所谓“双端队列”即从队列的两端分别可以入队( offer )和出队( poll),LinkedList实现了该接口。
  • 如果将Deque限制为只能从端入队和出队,则可实现"栈”( Stack )的数据结构,对于栈而言, 入栈称之为push ,出栈称之为pop。
  • 栈遵循先进后出( FILO First Input Last Output )的原则。

 

package collection;import java.util.Deque;
import java.util.LinkedList;/*** java.util.Deque 接口.双端队列.Deque接口继承自Qeque接口.双端队列的特点是* 队列两端都可以进行出入队操作* 实现类:java.util.LinkedList;**/
public class DequeDemo {public static void main(String[] args) {Deque<String> deque = new LinkedList<>();deque.offer("one");deque.offer("two");deque.offer("three");System.out.println(deque);//队首入队deque.offerFirst("four");System.out.println(deque);//队尾入队deque.offerLast("five");System.out.println(deque);String str = deque.poll();System.out.println(str);System.out.println(deque);//队尾出队str = deque.pollLast();System.out.println(str);System.out.println(deque);//队首出队str = deque.pollFirst();System.out.println(str);System.out.println(deque);//peekFirst 引用队首元素,获取队首元素后该元素不会出队。str = deque.peekFirst();System.out.println(str);//peekLast 引用队尾元素,获取队首元素后该元素不会出队。str =  deque.peekLast();System.out.println(str);}
}

stack( 栈)

栈( stack )是限定仅在表尾进行插入和删除操作的线性表

进栈 push( )

入栈:在栈顶(数组的尾部)添加指定的元素,并返回新数组的长度。

出栈 pop( )

出栈:删除栈顶(数组的尾部)的一个元素,并返回删除的元素。

 

 

 

package collection;import java.util.Deque;
import java.util.LinkedList;/*** 栈结构,栈是经典的数据结构之一,可以保存一组元素,但是存取元素必须遵循先进后出* 原则。* 使用栈一般是为了实现如:后退,前进这样的功能**/
public class StackDemo {public static void main(String[] args) {Deque<String> stack = new LinkedList<>();//push(入栈)stack.push("one");stack.push("two");stack.push("three");stack.push("four");stack.push("five");System.out.println(stack);//pop (出栈)String str = stack.pop();System.out.println(str);System.out.println(stack);}
}

集合操作-Map

Map接口

  • java.util.Map;查找表
  1. Map 体现的样子是一个多行两列的表格,其中左列为Key,右列为value
  2. Map总是根据Key获取对应的value ,因此我们可以将查询的条件作为Key,对应的值作为value保存.
  3. Map有一个要求,Key是不允许重复的.
  • 常用实现类:
  • java.util.HashMap:散列表,当今查询速度最快的数据结构


Map接口

  • Map接口定义的集合又称查找表,用于存储所谓"Key-Value"映射对。Key可以看 成是Value的索引,作为Key的对象在集合中不可以重复。
  • 根据内部数据结构的不同, Map接有多种实现类,其中常用的有内部为hash表实现的HashMap和内部为排序二叉树实现的TreeMap

put( )方法

Map接口中定义了向Map中存放元素的put方法:
一  V put(K key, V value)
Key-Value对存入Map ,如果在集合中已经包含该Key ,则操作将替换该Key所对应的Value,返回值为该Key原来所对应的Value (如果没有则返回null )。

package map;import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;public class MapDemo {public static void main(String[] args) {Map<String,Integer> map = new HashMap<>();/** V put(K k,V v);* 将给定的key,value 保存到Map中* 由于Map要求Key不允许重复,因此如果使用Map中已有key保存value,则是替换* value 操作,此时put 方法返回为就是被替换的value,否则返回值为null.*/map.put("语文", 99);map.put("数学", 98);map.put("英语", 97);map.put("物理", 96);Integer num = map.put("化学", 99);System.out.println(map);System.out.println(num);num = map.put("数学", 77);//数学作为key 已经存在,因此77会替换原来的98System.out.println(map);System.out.println(num);//98}
}

get( )方法

Map接中定义了从Map中获取元素的get方法:
- V get(Object key)
返回参数key所对应的Value对象,如果不存在则返回null

package map;import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;public class MapDemo {public static void main(String[] args) {Map<String,Integer> map = new HashMap<>();/** V get(Object key)* 根据给定的key获取对应的value ,若是给定的key不存在,则返回值为null*///获取语文的成绩?num = map.get("语文");System.out.println(num);//98num = map.get("体育");System.out.println(num);//null}
}


containsKey ( )方法

Map接口中定义了判断某个key是否在Map中存在
-- boolean containsKey(Object key);
若Map中包含给定的key则返回true ,否则返回false

package map;import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;public class MapDemo {public static void main(String[] args) {Map<String,Integer> map = new HashMap<>();boolean has = map.containsKey("数学");System.out.println("是否有数学科目:"+ has); //true}
}

size()

获取当前Map元素个数

//获取当前Map元素个数
int size = map.size();
System.out.println("size:"+size);

remove(Object key)

删除给定的key 所对应的这组键值对,返回值为该key对应的value.

num = map.remove("语文");
System.out.println(map);//{物理=96, 数学=77, 化学=99, 英语=97}System.out.println(num);//99


HashMap

Hash表原理


hashCode方法

  • HashMap的原理中我们可以看到, keyhashCode()方法的返回值对HashMap存储元素时会起着很重要的作用。而hashCode()方法实际上是在Object中定义的。那么应当妥善重写该方法:
  • 对于重写了equals方法的对象, -般要妥善的重写继承自Object类的hashCode方法( Object提供的hashCode方法将返回该对象所在内存地址的整数形式)
  • 重写hashCode方法是需注意两点:其一、与equals方法的一致性,即equals比较返回true的两个对象其hashCode方法返回值应该相同;其二、hashCode返回的数值应符合hash算法的要求,试想如果有很多对象的hashCode方法返回值都相同,则会大大降低hash表的效率,一般情况下可以使用IDE (如Eclipse )提供的工具自动生成hashCode方法。

重写hashCode方法

public int hashCode() {finalint prime = 31;int result = 1;result = prime * result + age;result = prime * result + ((gender == nul)? 0:gender.hashCodeO);result = prime * result + ((name== nul) ? 0 :name.hashCode();long temp;Temp = Double.doubleToLongBits(salary);result = prime * result +(int) (temp ^ (temp>>> 32));return result;
}

装在因子及HashMap优化

  • Capacity :容量,hash表里bucket(桶)的数量,也就是散列数组大小。
  • Initial capacity :初始容量,创建hash表时,初始bucket的数量,默认构建容量是16.也可以使用特定容量。
  • Size :大小,当前散列表中存储数据的数量。
  • Load factor :加载因子,默认值0.75(就是75%),当向散列表增加数据时如果size/capacity的值大于Load factor则发生扩容并且重新散列(rehash)。
  • 性能优化:加载因子较小时,散列查找性能会提高,同时也浪费了散列桶空间容量。0.75是性能和空间相对平衡结果。在创建散列表时指定合理容量减少rehash提高性能。


Map的遍历

  • Map提供了三种遍历方式:
  1. 遍历所有的Key
  2. 遍历所有的Key-Value对
  3. 遍历所有的Value(不常用)

建议:使用keysetentryset来进行遍历能取得相同的结果,但两者的遍历速度是有差别的,keySet( )的速度比entrySet( )慢了很多,也就是keySet方式遍历Map的性能不如entrySet性能好,为了提高性能,以后多考虑用entrySet( )方式来进行遍历。

 源码比对:

public V get(Object key) {|if (key == nu11)return getForNullKey();Entry<K,V> entry = getEntry(key);return nu11 = entry ? nu1l : entry. getValue();
}final Entry<K, V> getEntrykobject key) {if (size == 0) {return nu11;}int hash = (key = nu11) ? θ : hash(key);for (Entry<K,V> e = table[indexFor(hash, table. 1ength)];e != nu1l;e = e.next) {http://blog. csdn. net/object k;if (e.hash == hash 8&&((k = e.key) == key | (key != nu11 && key. equals()))return e;}return nu1l ;
}

使用keySet( )方法

遍历所有Key的方法:
-Set<K>  keySet ( )
该方法会将当前Map中所有的key存入-个Set集合后返回。

将Map中所有的key存放到Set集合中。应为Set集合有迭代器,可以通过迭代器循环key,在通过get()方法,得到每个key所对应的value;

   /**Set keySet()* 将当前Map中所有的key以一个Set集合形式返回,遍历该集合等于遍历所有key*/Set<String> keySet = map.keySet();for(String key: keySet){System.out.println("key:"+key);}


使用entrySet( )方法

遍历所有的键值对的方法:
- Set <Entry <K,V>>  entrySet( )
该方法会将当前Map中每一组key-value对封装为一个Entry对象并存入一个Set集合后返回。

java.util.Map.Entry
Entry的每一个实例表示Map的一组键值对,其中提供了两个常用方法:
getKey getValue 分别用来获取 对应key 和value

Set<Map.Entry<K,V>> entrySet() //返回此映射中包含的映射关系的 Set 视图。 Map.Entry表示映射关系。entrySet():迭代后可以e.getKey(),e.getValue()取key和value。返回的是Entry接口 。

/*
* 遍历每一组键值对
* Set<Entry> entrySet();
* 
* java.util.Map.Entry
* Entry的每一个实例表示Map的一组键值对,其中提供了两个常用方法:
* getKey 和 getValue 分别用来获取 对应key 和value
*/Set<Entry<String,Integer>> entrySet = map.entrySet();for(Entry<String,Integer> e : entrySet){String key = e.getKey();Integer value = e.getValue();System.out.println(key+":"+value);}

使用Collection values();方法

遍历所有value,该方法会将当前Map中所有的value以一个集合形式返回

获取集合中的所有的value值,也就是获取集合中的所有的值----没有键,没有对应关系,

Collection<Integer> values = map.values();for(Integer value: values){System.out.println(value);
}


有序的Map


LinkedHashMap实现有序Map

 

  • 使用Map接口的哈希表和链表实现,具有可预知的迭代顺序。此实现与HashMap的不同之处在于:
  • LinkedHashMap维护着一个双向循环链表。此链表定义了迭代顺序,该迭代顺序通常就是存放元素的顺序。
  • 需要注意的是,如果在Map中重新存入已有的key,那么key的位置不会发生改变,只是将value值替换。

统计各点PM2.5最大值(要求顺序)

public void testLinkedHashMap(String[ positions, int] datas) {LinkedHashMap <String,Integer> map = new LinkedHashMap < String,Integer> 0;for(int i=0; i<positions.length; i++){Integer data = map.get(positions[i]);int max = data==null ? 0 : data;max = max> datas[] ? max:datas[i];map.put(positions[i], max);}System.out.println(map);
}

 

查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. 数据库(二)之关系模型介绍

    一、关系模型概述关系模型用表表示;行指代一个数据元组;列指代数据属性; 关系模式图: department(dept_name, building, budget);二、码超码:一个或多个属性的集合,这些属性的组合可以使我们在一个关系中唯一标识一个元组; 候选码:最小的超码; 主码:被数据库设计者选中…...

    2024/4/25 0:26:51
  2. deepin,真好用-08-VS Code编译运行调试C/C++

    作为一个程序员,调试C/C++程序的能力还是要有的。推荐使用vscode(vs,真好用) 安装 vs code 安装方法有三:应用商店里有,可以一键安装 官网下载deb文件安装 命令行sudo apt install code插件安装C/C++(制作者是microsoft,最基础的插件) Code Runner(实用工具,可以选中…...

    2024/4/25 0:26:49
  3. 求旋转体体积

    1.圆盘法将图形想象成无数个超级小的圆柱体叠在一起,则dV=πr^2dx或dy,其中r根据函数和旋转轴确定,dx或dy由旋转轴的选择确定。一般情况下(即y用x表示),绕x轴或y=a旋转时,用圆盘法例如y=x^2与y=2和y轴围成的图形绕y轴旋转,则r=√(y),选择dy,积分上下限为0到2y=x^2与x…...

    2024/4/25 0:26:51
  4. Docker学习笔记九:初识Dockerfile

    由于commit在构建镜像时,很容易将无关内容添加到镜像且维护起来十分困难。所以我们不推荐使用commit来构建一个镜像。官方推荐使用Dockerfile来构建一个镜像。 Dockerfile简介 镜像的定制实际上就是定制每一层所添加的配置、文件。那么如果我们可以把每一层修改、安装、构建、…...

    2024/4/25 0:26:47
  5. 3.1.4 使用Actuator管理你的Spring程序

    Actuator介绍端点配置Http端点配置端点讲解 - Health健康检查端口讲解 - 日志配置端口讲解 - metrics自定义端点快速理解JMX机制...

    2024/4/25 0:26:47
  6. KVO实现原理分析

    在开发过程中,很多时候会用到KVO键值观察,它能够很轻松地去监听某对象属性的变化,监听一些带状态的控件的状态变化,字符串的改变等等,今天就来探讨一下KVO的使用及实现原理。 先来引用一下苹果官方文档对KVO的定义:Key-value observing is a mechanism that allows objec…...

    2024/4/25 0:26:48
  7. 信息技术-计算机程序计算

    信息技术选修部分计算机程序算法...

    2024/4/25 0:26:47
  8. python-装饰器-为函数添加功能但不改变调用方式

    使用闭包简单模拟装饰器的实现原理 def verify(func):def test():print("验证通过")func()return test def func1():print("func1被调用")func1()#普通调用func1 = verify(func1)#装饰器修饰后func1()#装饰器调用运行结果func1被调用 -------装饰器-------…...

    2024/4/24 4:55:56
  9. Java安装(win10)

    下载Java 官方链接:https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 这里下载的是JDK1.8 安装 按步骤安装 设置环境变量 (1)此电脑 --> 右键–> 属性–> 高级系统设置 (2)点击环境变量 (3)新增一个JAVA_HOME变量,指向…...

    2024/4/25 0:26:42
  10. 顶会期刊整理

    中国计算机学会推荐国际学术刊物(人工智能) A类序号 刊物名称 刊物全称 出版社 地址1 AI Artificial Intelligence Elsevier http://dblp.uni-trier.de/db/journals/ai/2 TPAMI IEEE Trans on Pattern Analysis and Machine Intelligence IEEE http://dblp.uni-trier.de/db/jou…...

    2024/4/25 0:26:48
  11. 359、Java中级14 -【多线程 - 线程池】 2020.06.26

    0、目录1、线程池2、线程池设计思路3、开发一个自定义线程池4、测试线程池5、参考链接 1、线程池 每一个线程的启动和结束都是比较消耗时间和占用资源的。 如果在系统中用到了很多的线程,大量的启动和结束动作会导致系统的性能变卡,响应变慢。 为了解决这个问题,引入线程池这…...

    2024/4/25 0:26:42
  12. 多态的应用

    多态的优势:可替换性:多态对已存在的代码具有可替换性。可扩充性:多态对代码具有可扩充性。增加新的子类不影响已存在类的多态行、继承性,以及其他特性的运行和操作。实际上新加子类更容易获得多态功能。接口性:多态是父类向子类提供了一个共同接口,有子类来具体实现。灵…...

    2024/4/25 0:26:40
  13. SQLyog将mysql字符编码改成utf-8

    第一步,右键需要更改的数据库,点击改变数据库表,然后,把下面的基字符集改成utf-8就好了,一般的中文字符问题就可以解决了。另外,贴两个直接用mysql语句改变字符集的博客链接: 第一个 第二个...

    2024/4/25 0:26:39
  14. 12864多级菜单实现方法

    前言一般来说使用12864进行显示,配合按键作为人机界面交互,如果显示的内容较多的话,往往不能在一个页面显示完全,这里就需要用到多级菜单来进行管理,根据显示内容的不同,将其划分成不同的菜单,通过按键操作来选择不同的界面进行显示。这里介绍一种我自己使用的多级菜单实…...

    2024/4/14 20:38:45
  15. python数据结构与算法04-栈和队列

    东阳的学习记录文章目录栈的特点栈的实现队列队列的特点队列实现双端队列双端队列的实现 栈的特点先进后出栈的实现Stack() 创建一个新的空栈 push(item) 添加一个新的元素item到栈顶 pop() 弹出栈顶元素 peek() 返回栈顶元素 is_empty() 判断栈是否为空 size() 返回栈的元素个…...

    2024/4/14 20:38:44
  16. gdb小结

    简写记号breakbdeletedinfoiregisterr零、开始gdb [filename]一、断点相关(一)加断点break [function_name] 给函数加断点break [line_number] 给某一行加断点break *[address] 给可执行文件的某一地址加断点其他内容见这篇文章(二)删除断点delete [break_point_id] 删除某…...

    2024/4/14 20:38:43
  17. 在不知道get或者post方式参数个数的情况下,怎么接收参数?

    请求参数信息:<%= new HashMap<String,String[]>(request.getParameterMap()){@Overridepublic String toString(){if (this==null)return null;String result = "来自匿名对象-";for(String key:this.keySet()){result +=key;result +=":"+Arra…...

    2024/4/25 2:36:15
  18. JAVA中properties文件的换行

    JAVA中properties文件的换行前言开门见山 前言 最近开始学习JAVA,一些小东西。 开门见山 只要在properties文件中想换行的位置加上\n即可。 例如: code.properties文件中的配置 title=String subject\nString subjectmain方法为: System.out.println(readProperty("tit…...

    2024/4/25 0:26:37
  19. onNewIntent调用时机

    Android四个启动模式的进入时的生命周期: 1. singleInstance: 第一次进入:onCreate => onStart 在栈顶再次进入: onNewIntent 不在栈顶再次进入:onNewIntent => onRestart => onStart 按home键再次进入:onRestart => onStart 按返回键:onRestart => onStar…...

    2024/4/25 0:26:36
  20. Windows服务器配置Java环境 (JDK,Redis) 以及后台式部署Java项目

    前言 最近做一个项目,实现用户免密单点登录腾讯企业邮箱https://exmail.qq.com/。 项目是Springboot + Redis类型,客户给予的是一台未配置Java环境的Windows服务器。所以需要先搭建Java环境,再将Java服务部署上去。 对腾讯企业邮箱免密单点登录感兴趣的可以到官方开发者中心…...

    2024/4/25 0:26:35

最新文章

  1. 干货:一篇文章让你掌握用户运营 沈阳新媒体运营培训

    用户对于产品的重要性不言而喻&#xff0c;而用户运营作为最接近用户的一环&#xff0c;自然而然受到了各大互联网公司的重视。想要掌握用户运营&#xff0c;必须得先知道其市场需求和主要技能&#xff0c;本文从这两个方面对用户运营展开了分析拆解&#xff0c;梳理用户运营的…...

    2024/4/25 18:10:56
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. 探索进程控制第一弹(进程终止、进程等待)

    文章目录 进程创建初识fork函数fork函数返回值fork常规用法fork调用失败的原因 写时拷贝进程终止进程终止是在做什么&#xff1f;进程终止的情况代码跑完&#xff0c;结果正确/不正确代码异常终止 如何终止 进程等待概述进程等待方法wait方法waitpid 进程创建 初识fork函数 在…...

    2024/4/22 16:14:13
  4. 【项目新功能开发篇】开发编码

    作者介绍&#xff1a;本人笔名姑苏老陈&#xff0c;从事JAVA开发工作十多年了&#xff0c;带过大学刚毕业的实习生&#xff0c;也带过技术团队。最近有个朋友的表弟&#xff0c;马上要大学毕业了&#xff0c;想从事JAVA开发工作&#xff0c;但不知道从何处入手。于是&#xff0…...

    2024/4/23 6:10:38
  5. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/4/25 11:51:20
  6. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/4/23 13:30:22
  7. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/4/23 13:28:06
  8. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/4/24 18:16:28
  9. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/4/23 13:27:44
  10. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/4/19 11:57:53
  11. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/4/23 13:29:53
  12. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/4/25 16:48:44
  13. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/4/25 13:39:44
  14. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/4/23 22:01:21
  15. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/4/23 13:29:23
  16. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/4/25 0:00:17
  17. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/4/25 4:19:21
  18. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/4/19 11:59:23
  19. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/4/19 11:59:44
  20. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/4/25 2:10:52
  21. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/4/24 16:38:05
  22. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/4/25 13:19:01
  23. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/4/23 13:27:51
  24. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/4/23 13:27:19
  25. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  26. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; 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
  27. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  28. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  29. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  30. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  31. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  32. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  33. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  34. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  35. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  36. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  37. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  38. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  39. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  40. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  41. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  42. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  43. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  44. 如何在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