java(19):数据结构(2)--List

Java中有100万个对象,用list map泛型存储和用list对象泛型存储,那个占用空间大,为什么... 在 Java 中,使用 List<Map<泛型类型, 泛型类型>> 存储 100 万个对象和使用 List<对象类型> 存储 100 万个对象,通常情况下 List<Map<泛型类型, 泛型类型>> 占用的空间更大。下面详细分析原因:内存占用情况分析1. List... 阅读详情

日期:2017/11/11


二、List接口

java.util 
接口 List<E>

所有超级接口:
Collection<E>,  Iterable<E>
所有已知实现类:
AbstractList,  AbstractSequentialList,  ArrayList,  AttributeList,  CopyOnWriteArrayList,  LinkedList,  RoleList,  RoleUnresolvedList,  Stack,  Vector

       List 接口,成为有序的 Collection 也就是序列。该接口可以对列表中的每一个元素的插入位置进行精确的控制,同时用户可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素。 下图是 List 接口的框架图:

fig.1


      通过上面的框架图,可以对 List 的结构了然于心,其各个类、接口如下:

      Collection:Collection 层次结构 中的根接口。它表示一组对象,这些对象也称为 collection 的元素。对于 Collection 而言,它不提供任何直接的实现,所有的实现全部由它的子类负责。

      AbstractCollection:提供 Collection 接口的骨干实现,以最大限度地减少了实现此接口所需的工作。对于我们而言要实现一个不可修改的 collection,只需扩展此类,并提供 iterator 和 size 方法的实现。但要实现可修改的 collection,就必须另外重写此类的 add 方法(否则,会抛出 UnsupportedOperationException),iterator 方法返回的迭代器还必须另外实现其 remove 方法。

      Iterator:迭代器。

      ListIterator:系列表迭代器,允许程序员按任一方向遍历列表、迭代期间修改列表,并获得迭代器在列表中的当前位置。

      List:继承于 Collection 的接口。它代表着有序的队列。

      AbstractList:List 接口的骨干实现,以最大限度地减少实现“随机访问”数据存储(如数组)支持的该接口所需的工作。

      Queue:队列。提供队列基本的插入、获取、检查操作。

      Deque:一个线性 collection,支持在两端插入和移除元素。大多数 Deque 实现对于它们能够包含的元素数没有固定限制,但此接口既支持有容量限制的双端队列,也支持没有固定大小限制的双端队列。

      AbstractSequentialList:提供了 List 接口的骨干实现,从而最大限度地减少了实现受“连续访问”数据存储(如链接列表)支持的此接口所需的工作。从某种意义上说,此类与在列表的列表迭代器上实现“随机访问”方法。

      LinkedList:List 接口的链接列表实现。它实现所有可选的列表操作。

      ArrayList:List 接口的大小可变数组的实现。它实现了所有可选列表操作,并允许包括 null 在内的所有元素。除了实现 List 接口外,此类还提供一些方法来操作内部用来存储列表的数组的大小。
      Vector:实现可增长的对象数组。与数组一样,它包含可以使用整数索引进行访问的组件。

      Stack:后进先出(LIFO)的对象堆栈。它通过五个操作对类 Vector 进行了扩展 ,允许将向量视为堆栈。

      Enumeration:枚举,实现了该接口的对象,它生成一系列元素,一次生成一个。连续调用 nextElement 方法将返回一系列的连续元素。


代码例子1:


package com.colection;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/*
 * 练习:用List集合存储自定义并遍历。
 * Student:name,age
 */
public class ListDemo2 {
	public static void main(String[] args){
		List  list = new ArrayList();
		
		// 创建学生对象
		Student s1 = new Student("潘金莲", 21);
		Student s2 = new Student("孙二娘", 19);
		Student s3 = new Student("扈三娘", 20);
		Student s4 = new Student("李师师", 21);

		// 把元素添加到集合
		list.add(s1);
		list.add(s2);
		list.add(s3);
		list.add(s4);
		//匿名对象
//		list.add(new String("mmb"));
		list.add(new Student("aaa",22));
		
		Iterator  it = list.iterator();
		
		while(it.hasNext()){
			Student s = (Student) it.next();
			System.out.println(s.getName()+"---"+s.getAge());
		}
	}

}

代码例子2:


package com.colection;

import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;
/*
 * ListIterator listIterator()
 * 虽然有逆向遍历功能这样的特有功能,但是没什么意义,因为,它需要先正向遍历,才能逆向遍历。
 */
public class ListDemo7 {

	public static void main(String[] args) {
		// 创建集合对象
		List list = new ArrayList();

		// 测试功能
		list.add("hello");
		list.add("world");
		list.add("java");

		// 正向遍历
		ListIterator lit = list.listIterator();
		 while (lit.hasNext()) {
		 String s = (String) lit.next();
		 System.out.println(s);
		 }
		System.out.println("---------------");
		System.out.println(lit.hasPrevious());
		while(lit.hasPrevious()){
			String s = (String) lit.previous();
			System.out.println(s);
		}
	}

}

     ---------------------------------------------------------------------------------------------------------------------------

     下面介绍实现List接口的三个

     2.1 ArrayList

java.util 
类 ArrayList<E>

java.lang.Object
  继承者 java.util.AbstractCollection<E>
      继承者 java.util.AbstractList<E>
          继承者 java.util.ArrayList<E>
所有已实现的接口:
Serializable,  Cloneable,  Iterable<E>,  Collection<E>,  List<E>,  RandomAccess
直接已知子类:
AttributeList,  RoleList,  RoleUnresolvedList

public class ArrayList<E>
     
      extends 
      AbstractList<E>
     
     
      implements 
      List<E>, 
      RandomAccess, 
      Cloneable, 
      Serializable
     
例子2.1.1,arraylist+itetator:

package com.colection.ArrayList_Vector_LinkedList;

import java.util.ArrayList;
import java.util.Iterator;
/*
 * List:
 * 		ArrayList:
 * 			底层数据结构是数组,查询快,增删慢
 * 			线程不安全,效率高
 * 		Vector:
 * 			底层数据结构是数组,查询快,增删慢
 * 			线程安全,效率低
 * 		LinkedList:
 * 			底层数据结构是链表,查询慢,增删快
 * 			线程不安全,效率高
 * 
 * 面试题:ArrayList,Vector和LinkedList的各自特点?
 * 
 * 思考题:ArrayList,Vector和LinkedList我们到底使用谁呢?
 * 			看情况
 * 			
 * 			要安全吗?
 * 				要:Vector(这个现在也不常用,在Collections里面有新的方式)
 * 				不要:ArrayList和LinkedList
 * 					查询多:ArrayList
 * 					增删多:LinkedList
 * 
 * 		不知道用哪个,就用ArrayList。
 * 
 * 需求:用ArrayList存储字符串并遍历
 */
public class ArrayListDemoi {
	public static void main(String [] args){
		ArrayList<String> arr = new ArrayList();
		ArrayList ss = new ArrayList();
		arr.add("Hello");
		arr.add("world");
		arr.add("java");
		ss.add("mmb");
		//Error:arr has been dedicated to store String partern
		//类型 ArrayList<String> 中的方法 add(int, String)对于参数(int)不适用
//		arr.add(1000);
		
		//Iterator
		Iterator it = arr.iterator();
		while(it.hasNext()){
			String s = (String) it.next();
			System.out.println(s);
		}
		System.out.println("-----------");
		
		//for
		for(int i=0;i<arr.size();i++){
			String s = arr.get(i);
			System.out.println(s);
		}
		System.out.println("-----------");
		System.out.println(ss);
		
	}

}
package com.colection.ArrayList_Vector_LinkedList;

public class Student {
	private String name;
	private int age;

	public Student() {
		super();
	}

	public Student(String name, int age) {
		super();
		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;
	}

}


例子2.1.2,arraylist+Listitetator(list_iterator动态数组的专用迭代器,因为多态的使用,Collection接口只能产生iterator):

package com.colection.ArrayList_Vector_LinkedList;

import java.util.ArrayList;
import java.util.ListIterator;

/*
 * 去除集合中字符串的重复值(字符串的内容相同)
 * 举例:
 * 		hello,world,java,android,world,java,javaee,java,java,java,android
 * 结果:
 * 		hello,world,java,android,javaee
 * 
 * 创建新集合的方式:
 * 		A:定义集合,存储带重复的元素
 * 		B:创建新集合
 * 		C:遍历旧集合,获取到旧集合中的每一个元素
 * 		D:那旧集合的每一个元素到新集合中去找,看有没有
 * 			有:就不添加(不搭理它)
 * 			木有:就添加
 * 		E:遍历新集合
 */
public class ArrayListTest2 {

	public static void main(String[] args) {
		ArrayList list = new ArrayList();
		ArrayList list2 = new ArrayList();
		String[] a ={"dfasf","asdfgasdga","adfaf","asdgertcv","asdfgasdga","adfaf","d8f97asg84"}; 
		list.add("hello");
		list.add("world");
		list.add("java");
		list.add("android");
		list.add("world");
		list.add("java");
		list.add("javaee");
		list.add("java");
		list.add("java");
		list.add("java");
		list.add("android");
		list.add(a);
		//两个迭代器
		ListIterator it = list.listIterator();
		ListIterator it2 = list2.listIterator();
		System.out.println("list: "+list);
		for(int i =0; i<list.size();i++){
			System.out.println(list.get(i));
			try{
				String temp = (String) list.get(i); 		
				System.out.println(temp);
			}catch ( java.lang.ClassCastException e){
				e.printStackTrace();
				String[] temp = (String[]) list.get(i);
				System.out.println(temp);
			}
//			if( ! list2.contains(temp)){
//				list2.add(temp);
//			}
		}
		
		}

}

例子2.1.3 可以使用for循环迭代,ArrayList有特点--能根据具体索引处理元素:

package com.colection.ArrayList_Vector_LinkedList;

import java.util.ArrayList;
import java.util.Iterator;

public class ArrayListTest3 {

	public static void main(String[] args) {
		ArrayList array = new ArrayList();
		array.add("hello");
		array.add("world");
		array.add("java");
		array.add("android");
		array.add("world");
		array.add("java");
		array.add("javaee");
		array.add("java");
		array.add("java");
		array.add("java");
		array.add("android");
		for(int i=0; i<array.size(); i++){
			for(int y=i+1; y<array.size();y++){
				if(array.get(i).equals(array.get(y))){
					array.remove(y);
				}
			}
		}
		
		// 遍历集合
		Iterator it = array.iterator();
		while (it.hasNext()) {
			String s = (String) it.next();
			System.out.println(s);
		}
	}

}

例子2.1.4,ArrayList的元素为对象,因此当然可以存放ArrayList作为元素了:

package com.colection.ArrayList_Vector_LinkedList;

import java.util.ArrayList;

/*
 * 需求:四大名著
 * 三国演义
 * 		吕布,典韦,赵云
 * 红楼梦
 * 		贾宝玉,林黛玉,王熙凤,秦可卿
 * 水浒传
 * 		武松,鲁智深,李逵,卢俊义,索超,吴用
 * 西游记
 * 		白骨精,观音姐姐,孙悟空,牛魔王,红孩儿
 * 
 * 我国有四大名著,每部名著里有很多代表性角色。
 */
public class ArrayListTest5 {

	public static void main(String[] args) {
		ArrayList<String> sgyy = new ArrayList<String>();
		sgyy.add("吕布");
		sgyy.add("典韦");
		sgyy.add("赵云");
		
		ArrayList<String> hlm = new ArrayList<String>();
		hlm.add("贾宝玉");
		hlm.add("林黛玉");
		hlm.add("王熙凤");
		hlm.add("秦可卿");
		
		// 水浒传小集合
		ArrayList<String> shz = new ArrayList<String>();
		shz.add("武松");
		shz.add("鲁智深");
		shz.add("李逵");
		shz.add("卢俊义");
		shz.add("索超");
		shz.add("吴用");

		// 西游记小集合
		ArrayList<String> xyj = new ArrayList<String>();
		xyj.add("白骨精");
		xyj.add("观音姐姐");
		xyj.add("孙悟空");
		xyj.add("牛魔王");
		xyj.add("红孩儿");
		
		ArrayList<ArrayList<String>> sdmz = new ArrayList<ArrayList<String>>();
		sdmz.add(hlm);
		sdmz.add(xyj);
		sdmz.add(shz);
		sdmz.add(sgyy);
		
		for(int i = 0; i<sdmz.size();i++){
			System.out.println("__________");
			ArrayList<String> temp = sdmz.get(i);
			for(int k = 0; k<temp.size();k++){
				System.out.println(temp.get(k));
			}
		}
		
		// 遍历集合
		for (ArrayList<String> array : sdmz) {
			for (String s : array) {
				System.out.print(s + " ");
			}
			System.out.println();
		}
		
	}

}


     2.2 Vector

java.util 
类 Vector<E>

java.lang.Object
  继承者 java.util.AbstractCollection<E>
      继承者 java.util.AbstractList<E>
          继承者 java.util.Vector<E>
所有已实现的接口:
Serializable,  Cloneable,  Iterable<E>,  Collection<E>,  List<E>,  RandomAccess
直接已知子类:
Stack

public class Vector<E>
   
    extends 
    AbstractList<E>
   
   
    implements 
    List<E>, 
    RandomAccess, 
    Cloneable, 
    Serializable
   

        Vector 类可以实现可增长的对象数组。与数组一样,它包含可以使用整数索引进行访问的组件。但是,Vector 的大小可以根据需要增大或缩小,以适应创建 Vector 后进行添加或移除项的操作。

        每个向量会试图通过维护 capacity 和 capacityIncrement 来优化存储管理。capacity 始终至少应与向量的大小相等;这个值通常比后者大些,因为随着将组件添加到向量中,其存储将按 capacityIncrement 的大小增加存储块。应用程序可以在插入大量组件前增加向量的容量;这样就减少了增加的重分配的量。

        由 Vector 的 iterator 和 listIterator 方法所返回的迭代器是快速失败的:如果在迭代器创建后的任意时间从结构上修改了向量(通过迭代器自身的 remove 或 add 方法之外的任何其他方式),则迭代器将抛出 ConcurrentModificationException。因此,面对并发的修改,迭代器很快就完全失败,而不是冒着在将来不确定的时间任意发生不确定行为的风险。Vector 的 elements 方法返回的 Enumeration 不是 快速失败的。

        注意,迭代器的快速失败行为不能得到保证,一般来说,存在不同步的并发修改时,不可能作出任何坚决的保证。快速失败迭代器尽最大努力抛出 ConcurrentModificationException。因此,编写依赖于此异常的程序的方式是错误的,正确做法是:迭代器的快速失败行为应该仅用于检测 bug。

        从 Java 2 平台 v1.2 开始,此类改进为可以实现 List 接口,使它成为 Java Collections Framework 的成员。与新 collection 实现不同,Vector 是同步的。


      ArrayList是非线程安全,Vector是线程安全的。

      例子2.2.1,下面是接口多态的使用:


package com.colection.ArrayList_Vector_LinkedList;

import java.util.Collection;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
import java.util.Vector;

/*
 * 特有功能:
 * 		A:添加元素
 * 			public void addElement(Object obj)		--		add(Object obj)
 * 		B:获取元素
 *			public Object elementAt(int index)		--		get(int index)
 *			public Enumeration elements()			--		Iterator iterator()
 *						hasMoreElements()							hasNext()
 *						nextElement()								next()
 *
 *		JDK版本升级:
 *			A:安全
 *			B:效率
 *			C:简化书写
 */
public class VectorDemo {
	public static void main(String [] args){
		// 创建集合对象
		 Collection c = new Vector();
		 List list = new Vector();
		Vector v = new Vector();
		
		v.addElement("Hello");
		v.addElement("dadf");
		v.addElement("world");
		v.addElement("java");
		
		//没有为类型 List 定义方法 addElement(String),多态,addelement是Vector独有的方法		
//		list.addElement("Hello");
		list.add(0, "mmb");		
		ListIterator li = list.listIterator();
		System.out.println("li.next(): "+li.next());
		//没有为类型 Collection 定义方法 addElement(String),同理
//		c.addElement("dadf");
		c.add("mmb");
		Iterator it = c.iterator();
		System.out.println("it.next(): "+it.next());
		 //public Object elementAt(int index)
		 System.out.println(v.elementAt(0));
		 System.out.println(v.elementAt(1));
		 System.out.println(v.elementAt(2));
		// 普通for
		 for (int x = 0; x < v.size(); x++) {
		 String s = (String) v.elementAt(x);
		 System.out.println(s);
		 }
		 System.out.println("-----------------");
		 Enumeration en = v.elements();
		 while(en.hasMoreElements()){
			 String s = (String) en.nextElement();
			 System.out.println(s);
		 }
	}

}


     2.3 LinkedList

java.util 
类 LinkedList<E>

java.lang.Object
  继承者 java.util.AbstractCollection<E>
      继承者 java.util.AbstractList<E>
          继承者 java.util.AbstractSequentialList<E>
              继承者 java.util.LinkedList<E>
类型参数:
E - 在此 collection 中保持的元素的类型
所有已实现的接口:
Serializable,  Cloneable,  Iterable<E>,  Collection<E>,  Deque<E>,  List<E>,  Queue<E>

public class LinkedList<E>
   
    extends 
    AbstractSequentialList<E>
   
   
    implements 
    List<E>, 
    Deque<E>, 
    Cloneable, 
    Serializable
   
List 接口的链接列表实现。实现所有可选的列表操作,并且允许所有元素(包括 null)。除了实现 List 接口外,LinkedList 类还为在列表的开头及结尾 get、remove 和 insert 元素提供了统一的命名方法。这些操作允许将链接列表用作堆栈、队列或双端队列。

此类实现 Deque 接口,为 add、poll 提供先进先出队列操作,以及其他堆栈和双端队列操作。

所有操作都是按照双重链接列表的需要执行的。在列表中编索引的操作将从开头或结尾遍历列表(从靠近指定索引的一端)。

注意,此实现不是同步的。如果多个线程同时访问一个链接列表,而其中至少一个线程从结构上修改了该列表,则它必须 保持外部同步。(结构修改指添加或删除一个或多个元素的任何操作;仅设置元素的值不是结构修改。)这一般通过对自然封装该列表的对象进行同步操作来完成。如果不存在这样的对象,则应该使用 Collections.synchronizedList 方法来“包装”该列表。最好在创建时完成这一操作,以防止对列表进行意外的不同步访问,如下所示:

List list = Collections.synchronizedList(new LinkedList(...));

此类的 iterator 和 listIterator 方法返回的迭代器是快速失败 的:在迭代器创建之后,如果从结构上对列表进行修改,除非通过迭代器自身的 remove 或 add 方法,其他任何时间任何方式的修改,迭代器都将抛出 ConcurrentModificationException。因此,面对并发的修改,迭代器很快就会完全失败,而不冒将来不确定的时间任意发生不确定行为的风险。

注意,迭代器的快速失败行为不能得到保证,一般来说,存在不同步的并发修改时,不可能作出任何硬性保证。快速失败迭代器尽最大努力抛出 ConcurrentModificationException。因此,编写依赖于此异常的程序的方式是错误的,正确做法是:迭代器的快速失败行为应该仅用于检测程序错误。

此类是 Java Collections Framework 的成员。


例子2.3.1,LinkedList的增删改查:


package com.colection.ArrayList_Vector_LinkedList;

import java.util.LinkedList;

/*
 * LinkedList的特有功能:
 * 		A:添加功能
 * 			void addFirst()
 * 			void addLast()
 * 		B:移除功能
 * 			Object removeFirst()
 * 			Object removeLast()
 * 		C:获取功能
 * 			Object getFirst()
 * 			Object getLast()
 */
public class LinkedListDemo {

	public static void main(String[] args) {
		LinkedList<String> link = new LinkedList<String>();
		link.add("hello");
		link.add("world");
		link.add("java");	
		link.add("白夜");
		System.out.println(link);
		// void addFirst()
		// void addLast()
		link.addFirst("first");
		link.addLast("last");
		System.out.println(link);
		// Object removeFirst()
		// Object removeLast()
		System.out.println("removeFirst:" + link.removeFirst());
		System.out.println("removeFirst:" + link.removeLast());
		System.out.println(link);
		// Object getFirst()
		// Object getLast()
		System.out.println("getFirst:" + link.getFirst());
		System.out.println("getLast:" + link.getLast());
		System.out.println(link);

	}

}

例子2.3.2 ,LinkedList 的 使用于堆栈:


package com.colection.ArrayList_Vector_LinkedList;

import java.util.Iterator;
import java.util.LinkedList;
import java.util.Stack;

public class LinkedListDemoTest {

	public static void main(String[] args) {
		// 创建集合对象
		 LinkedList link = new LinkedList();
		 // 添加元素
		 link.addFirst("hello");
		 link.addFirst("world");
		 link.addFirst("java");
		 Iterator it = link.iterator();
		 while (it.hasNext()) {
		 String s = (String) it.next();
		 System.out.println(s);
		 }
		 
		System.out.println("----------");
		
		MyStack my = new MyStack();
		
		//添加元素
		my.add("hello");
		my.add("world");
		my.add("java");
		//获取
		try{
			System.out.println(my.gete());
			System.out.println(my.gete());
			System.out.println(my.gete());
			System.out.println(my.gete());			
		}catch( java.util.NoSuchElementException e){
			System.out.println("null");
		}
		
		while(!my.isEmpty()){
			System.out.println(my.gete());
		}
	
	}

}

package com.colection.ArrayList_Vector_LinkedList;

import java.util.LinkedList;

/*
 * 定义自己的集合类
 */
public class MyStack {
	private LinkedList link;
	
	public MyStack(){
		link = new LinkedList();
	}
	
	public void add(Object obj){
		link.addFirst(obj);
	}
	
	public Object gete(){
		return  link.removeFirst();
	}
	
	public boolean isEmpty(){
		return link.isEmpty();
	}

}

        LinkedList与ArrayList一样实现List接口,只是ArrayList是List接口的大小可变数组的实现,LinkedList是List接口链表的实现。基于链表实现的方式使得LinkedList在插入和删除时更优于ArrayList,而随机访问则比ArrayList逊色些。


      2.4 Stack

      在Java中Stack类表示后进先出(LIFO)的对象堆栈。栈是一种非常常见的数据结构,它采用典型的先进后出的操作方式完成的。每一个栈都包含一个栈顶,每次出栈是将栈顶的数据取出,如下:

2014070800001_thumb

Stack通过五个操作对Vector进行扩展,允许将向量视为堆栈。这个五个操作如下:

            操作                                           说明

empty()

测试堆栈是否为空。

peek()

查看堆栈顶部的对象,但不从堆栈中移除它。

pop()

移除堆栈顶部的对象,并作为此函数的值返回该对象。

push(E item)

把项压入堆栈顶部。

search(Object o)

返回对象在堆栈中的位置,以 1 为基数。

Stack继承Vector,他对Vector进行了简单的扩展。








Orale EBS R12 AP应付模块 发票导入接口(Interface) ap_interface_groups_s.nextval; ap_invoices_interface_s.nextval; ap_invoice_lines_interface_s.nextval; SELECT * FROM ap_invoices_interface ih; SELECT * FROM ap_invoice_lines_interface il; SELECT * FROM... 阅读详情

相关推荐

2025浏览器指纹伪装终极指南:Playwright修改WebGL+时区+分辨率,小红书爬1000条零验证

2025年小红书的反爬已经进入“多维校验”时代,单纯修改某一个指纹维度已失效。本文方案的核心是“让所有特征都一致且合理”——WebGL+Canvas+时区+分辨率+UA+行为,形成一个完整的“真实用户画像”,让小红书的反爬系统无法区分是爬虫还是真人。这套方案不仅适用于小红书,也可迁移到知乎、抖音、跨境电商等其他高反爬平台,只需替换对应的指纹库和数据提取逻辑。记住:指纹伪装的本质不是“欺骗”,而是“模拟真实”,把每个细节都做到和人类一致,自然就能实现“零验证”爬取。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 3069

JDK 1.8 LinkedList源码分析

LinkedList是一个实现了List接口和Deque接口的双端链表。 有关索引的操作可能从链表头开始遍历到链表尾部,也可能从尾部遍历到链表头部,这取决于看索引更靠近哪一端。 LinkedList不是线程安全的,如果想使LinkedList变成线程安全的,可以使用如下方式: List list=Collections.synchronizedList(new LinkedList(...))

xingfeng_coder的博客 9585

全面解析:时延扩展与相干带宽、多普勒扩展与相干时间——无线通信基础

时延扩展与相干带宽 多径时延扩展与多径衰落 接收机所接收到的信号是通过不同的直射、反射、折射等路径到达接收机。由于电波通过各个路径的距离不同, 因而各条路径中发射波的到达时间不同,造成多径时延扩展。距离不同所以到达接收机的相位也不相同,不同相位的多个信号在接收端叠加, 如果同相叠加则会使信号幅度增强, 而反相叠加则会削弱信号幅度。 这样,接收信号的幅度将会发生急剧变化,就会产生多径衰落。 ...

king阿金 4万+

java基础知识总结

------- android培训、java培训、期待与您交流! ----------  Java基础知识精华部分(个人总结) 写代码: 1,明确需求。我要做什么? 2,分析思路。我要怎么做?1,2,3。 3,确定步骤。每一个思路部分用到哪些语句,方法,和对象。 4,代码实现。用具体的java语言代码把思路体现出来。   学习新技术的四点: 1,该技术是什么? 2,该技术有

th676759829的专栏 2501

【Get深一度】小波分析概念1——紧支撑集是什么意思,通俗解释

最近学到小波,在仿真中也用到了紧支撑函数;紧支撑性越好,说明能量越集中;用最通俗的话来讲,紧支撑是这样的: 对于函数f(x),如果自变量x在 0附近的取值范围内,f(x)能取到 C; 而在此之外,f(x)取值为 0; 那么这个函数f(x)就是紧支

Trey_优快云 的优快云博客 8348

谈谈 FOC和BLDC 电机控制

更具体地说,通过 “Park 变换”,我们可以把三相交流电流信号转换成两相直流电流信号,从而可以把三相交流电机的控制变得和两相直流电机控制一样简单。在内环 “电流环”中,一些比较重要的模块有 “Clark 变换” 和 “Park 变换” 等数学模块、电机电流信号检测模块以及能够提供电机的转速和转角位置信息的模块。日前,Qorvo 电机控制应用高级系统/应用工程师张绍发表了一个与 BLDC 和 FOC 相关的演讲,科普了 FOC 的相关知识,还讲解了 Qorvo 用于简化 FOC 实施方案的方法。

U_YAO的博客 2118

java集合详解(转自楼道小组)

       集合 版本号:1.0         作者:huangdos 日期:2006年6月06日摘    要 摘要内容Java里面最重要,最常用也就是集会一部分了。能够用好集合和理解好集合对于做Java程序的开发拥有无比的好处。本文详细解释了关于Java中的集合是如何实现的,以及他

有梦就是幸福的 4674

VS Code/TRAE集成Cppcheck并启用MISRA规则

本文探讨了嵌入式开发中Cppcheck工具集成与MISRA规则检查的必要性。详细介绍了安装配置步骤:安装VSCode/TRAE、Cppcheck软件、配置插件参数、安装Python环境,并重点说明了MISRA规则文件的设置方法。通过完整的配置流程,实现了嵌入式开发环境下静态检查与安全标准的落地。

SDFangFang2025的博客 1282

JAVA基础(LinkedList的介绍and常用方法)

1,LinkedList介绍 LinkedList是一个继承于AbstractSequentialList的双向链表。它也可以被当作堆栈、队列或双端队列进行操作。 它实现List接口,能对它进行队列操作。 实现Deque接口,即能将LinkedList当作双端队列使用。 实现了Cloneable接口,即覆盖了函数clone(),能克隆。 实现...

Cricket_7的博客 200

存储关键技术·RAID技术·RAID2.0·华为RAID2.0+·华为服务器·云计算

一.RAID基本概念 常见的RAID级别组合RAID级别 二.RAID的数据组织形式 三.RAID的数据保护功能 方法一:镜像方法二:奇偶校验算法(XOR) 四.RAID热备和重构 1.热备(Hot Spare)的定义2.热备的分类3.热备的工作原理 五.RAID 2.0技术 1.RAID 2.02.RAID 2.0+3.华为RAID 2.0+ 六.RAID 2.0+块虚拟化技术 1.什么会出现RAID 2.0+技术?2.什么是RAID 2.0?3.RAID 2.0+的原理是什么?

qq_47480932的博客 3320

国产数据库迁移必看:达梦到ES的CDC方案优化全记录(含完整代码)

本文详细记录了从达梦数据库到Elasticsearch的CDC方案优化全过程,涵盖触发器方案局限性、Debezium架构优势及完整代码实现。通过Flink集成和性能调优,实现毫秒级延迟同步,显著降低数据库负载,为国产数据库迁移提供可落地的技术方案。

weixin_29079671的博客 497

多标签分类评估:Macro-F1与Micro-F1的计算、差异与选择

在机器学习分类任务中,模型评估指标是衡量算法性能的核心工具。精确率(Precision)和召回率(Recall)是最基础的二分类评估维度,而F1分数通过调和平均综合两者,成为平衡性能的常用指标。当面对多标签分类任务时,传统单标签评估方式不再适用,需要引入标签粒度或样本粒度的汇总策略。Macro-F1对每个类别单独计算F1后取平均,对少数类更敏感;Micro-F1将所有类别的预测结果汇总后计算全局F1,更贴近整体正确率。理解两者的数学原理和适用场景,有助于在类别不平衡的数据中选择合适的评估标准,避免被单一数字

weixin_34253126的博客 451

nvidia jetson orin调试 MAX96712 serdes相机(SG2-AR0233C-GMSL2)

背景:想了解一下关于nvidia orin camera相关的模块,基于Drive Orin demo板的话,没有合适的相机,用 nvsipl框架点亮 GMSL相机不知如何下手,那么基于nvidia Jetson orin的话,目前国内有对应的转接板以及GMSL相机可以参考,基于此,那么本文详细记录一下关于nvidia orin的相关踩坑记录;需要Nvidia Jetson Orin开发板一个,MIPI转接板一个,MIPI转GMSL转接板一个,GMSL线束(fakra单线束),GMSL摄像头一个。

qq_30025621的博客 4445

Java学习高级篇19_List、Set、数据结构初步、Collections

上一篇博客:Collection、Iterator迭代器、泛型、扑克牌案例之lbwnb 目录 数据结构初步 栈 队列 数组 链表 红黑树 List集合 List接口 List的子类ArrayList、LinkedList Set接口 HashSet集合 LinkedHashSet 可变参数 Collections 练习—对象Comparetor排序 开始 一、数据结构初步 1.1 数据结构有什么用 当你用着java里面的容器类很爽的时候,你有没有想过,怎么ArrayList就像一

xiaosi的博客 390

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Java day19 List集合和作业

1、集合 1.1、概述 集合和数组意义都是一种容器工具,可以用来存储多个数据 集合和数组的区别: 数组的长度固定,集合长度可变 数组存储同一类型(包括兼容)的元素,集合中可以存储不同类型的数据 数组中可以存放基本类型数据或者对象,集合中只能存放对象 数组只要一个length属性和充Object中继承的方法 集合由接口和实现类组成,在这其中定义了许多方法 集合框架三个要素 接口 整个集合框架的上层结构,都是用接口进行组织的 接口中定义了集合中必须要有的基本方法 通过接口还把集合划分了几种不同的类型

weixin_45331493的博客 386

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Java list与list匹配

Java List与List匹配的完整指南 在Java编程语言中,List接口是一个重要的数据结构,它提供了一种按照顺序存储元素的方式。List的实现类如ArrayList, LinkedList等,在开发中被广泛使用。在本文中,我们将深入探讨Java中的List,并将其与匹配操作结合,以帮助你更好地理解它们的用法。 什么...

weixin_40342265的博客 240

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Java学习19-List、set容器

List集合类中元素有序(即添加顺序和取出顺序一致)、且可重复。List集合中的每个元素都有其对应的顺序索引,即支持索引。List容器中的元素都对应一个整数型的序号记载其在容器中的位置,可以根据序号存取容器中的元素。ArrayList是由数组来实现数据存储的,ArrayList可以加入多个null。ArrayList基本等同于Vector,除了ArrayList是线程不安全的。Vector底层是一个对象数组,Vector是线程同步的,即线程安全。

2302_79866417的博客 2058

Java入门到精通-19 集合框架:List——ArrayList与LinkedList深度对比

本文深入探讨Java集合框架中的List接口及其实现类ArrayList与LinkedList,从源码层面分析两者的底层实现与性能差异。主要内容包括: 集合框架概述:介绍Java集合框架的优势与体系结构,解决数组固定长度的局限性。 List接口规范:详解List核心方法与特性,包括有序性、可重复、允许null等特性。 ArrayList深度分析: 基于动态数组实现,默认初始容量10 扩容机制:1.5倍增长,通过Arrays.copyOf()复制数据 时间复杂度:随机访问O(1),中间插入/删除O(n) Li

weixin_56693899的博客 397

java 一个list里面还有list

Java中List中还有List的使用 在Java编程中,List是一个非常常用的集合类,它可以存储一组元素并保持它们的顺序。有时候我们需要在List中存储另一个List,这种嵌套的数据结构在实际开发中也是经常遇到的。本文将介绍如何在Java中使用List中还有List的情况,并给出相应的代码示例。 List中嵌套List...

weixin_41359767的博客 524

java list加list_java把一个list中的内容添加到另一个list中

展开全部如果list是按bean对象62616964757a686964616fe4b893e5b19e31333431356666存,则对象要改变:之前List对象存2个属性:DepartID,num,添加后的对象有3个属性:DepartID,num,dpsNum,所以要定义新的List对象来存两个List的结果。(见下面代码,已调通,1个main类,3个对象类)如果list是按string存而...

weixin_32127545的博客 1万+

【Java集合】单列集合List详解

List接口属于单列集合Collection接口下的其中一条分支,它最常用的三个实现类分别是——。这三个实现类各有各的特点,但又有着一些相同的特性。本文将从List集合的介绍、特点、使用,再到它的三个常用实现类的底层源码分析,完完整整地梳理清楚List位于,是单列集合Collection接口下的一个子接口。接口不能直接被实例化,因此需要通过创建其子类对象来完成该接口的实例化(即多态List 接口最常用的3个子类有。本文以ArrayList类为例演示List接口中的常用方法。

m0_55908255的博客 1085

java list 重复数据结构_Java中常见数据结构:list与map

1 1:集合2 Collection(单列集合)3 List(有序,可重复)4 ArrayList5 底层数据结构是数组,查询快,增删慢6 线程不安全,效率高7 Vector8 底层数据结构是数组,查询快,增删慢9 线程安全,效率低10 LinkedList11 底层数据结构是链表,查询慢,增删快12 线程不安全,效率高13 Set(无序,唯一)14 HashSet15 底层数据结构是哈希表。16...

weixin_39865204的博客 140

Java 如何把字符串放入list

Java 如何把字符串放入 List 在 Java 编程中,通常会使用 List 接口来存储一组元素。List 提供了一种线性数据结构,可以方便地进行插入、删除、查找等操作。本文将详细介绍如何将字符串放入 Java 的 List,并通过具体的示例来说明。同时,还会包含流程图和序列图,以帮助更好地理解流程。 1. 需求分析 ...

weixin_36854988的博客 478

Java集合框架 list接口

Java 集合框架是 Java 标准库中的一个重要组成部分,它提供了一组强大的数据结构和算法,用于存储和操作数据。其中,List是 Java 集合框架中最常用的数据结构之一,用于存储有序的元素集合。下面详细介绍 Java 集合框架中的List接口及其主要实现类。

yuehua00的专栏 1449

Java中常见数据结构:list与map

1:集合 2 Collection(单列集合) 3 List(有序,可重复) 4 ArrayList 5 底层数据结构是数组,查询快,增删慢 6 线程不安全,效率高 7 Vector 8 底层数据结构是数

qq_37568658的博客 334

Java中Map和List组合使用的例子

使用Java很方便的一条就是Java封装了很多方便使用的Map和List,这是我在开发过程中遇到的问题,通过传入的字符串封装成List>格式,然后进行想要的操作,奉上代码! /* 输入参数: * [{"index":"SB001","value":"0.380658"},{"indexNo":"SB002","value":"19.801300"}, * {"index":"SB003"

wangshuang1631的博客 1万+
上一篇: 前端基础(6):html语法(5): <META> <H1-H6><UL><ol><LI><code>标签
下一篇: java(24):IO(1):OutPutStream
后台技术汇
博客等级 码龄11年 670粉丝 531原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

后台技术汇

对你的帮助,是对我的最好鼓励。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值