在Java集合类框架中提供了两大核心接口:Collection接口和Map接口,这两个接口是相对独立的。
Collection接口的操作形式与之前编写链表的操作形式类似,每一次进行数据操作的时候只对单个对象进行处理。Collection接口是单个集合保存的最大父接口。
定义:
JDK5之后Collection追加有泛型,避免了ClassCastException,里面所有保存的数据应该是相同的。
在开发过程中,我们还是很少会直接使用Collection接口,因为Collection接口只是一个存储数据的标准,并不能区分存储类型。
所以它有两个子接口:List接口和Set接口,继承关系如下:Collection中两个重要的方法add()和iterator(),子接口中都有
List接口
在实际开发过程中,List的使用频率可以达到Collection使用的80%,在进行集合处理的时候优先考虑List。
List接口有两个重要的扩充方法,如下:
List接口与Collection接口相比最大的特点就在于,List接口有一个get()方法,可以根据索引获取值,由于List本身还是接口,要对它进行实例化,就要用到子类。List有三个子类:ArrayList,Vector,LinkedList,结构如下:
ArrayList子类
通过代码来看一下ArrayList的一些方法:
public class TestArrayList {
public static void main(String[] args) {
List 通达信 dll接口,list=new ArrayList();
通达信 dll接口,list.add('hello');
//重复元素
通达信 dll接口,list.add('hello');
通达信 dll接口,list.add('Java');
System.out.println('集合大小为:'+通达信 dll接口,list.size()+' 集合是否为空:'+通达信 dll接口,list.isEmpty());
for (int i=0;i<通达信 dll接口,list.size();i++){
//get()方法
System.out.println(通达信 dll接口,list.get(i));
}
System.out.println('删除hello后');
通达信 dll接口,list.remove('hello');
System.out.println('集合大小为:'+通达信 dll接口,list.size()+' 集合是否为空:'+通达信 dll接口,list.isEmpty());
for (int i=0;i<通达信 dll接口,list.size();i++){
System.out.println(通达信 dll接口,list.get(i));
}
System.out.println(通达信 dll接口,list.contains('hello'));
System.out.println(通达信 dll接口,list.contains('ABC'));
System.out.println(通达信 dll接口,list);
}
}
通过上述代码我们可以发现,List允许保存重复数据。get()方法是List子接口提供的。如果现在操作的是Collection接口,那么对于此时的数据取出只能够将集合变为对象数组操作。如下:
Collection 通达信 dll接口,list=new ArrayList();
通达信 dll接口,list.add('hello');
通达信 dll接口,list.add('hello');
通达信 dll接口,list.add('Java');
// 操作以Object为主,有可能需要向下转型,就有可能产生ClassCastException
Object[] objects=通达信 dll接口,list.toArray();
System.out.println(Arrays.toString(objects));
用Collection接口很容易产生ClassCastException异常,因此在开发过程中尽量少用。
Vector子类
Vector是从JDK0提出的,而ArrayList是从JDK2提出的。用例:
List 通达信 dll接口,list=new Vector();
通达信 dll接口,list.add('hello');
通达信 dll接口,list.add('hello');
通达信 dll接口,list.add('Java');
System.out.println(通达信 dll接口,list);
ArrayList和Vector的区别
历史时间:ArrayList是从JDK2提出的,Vector是从JDK0提出的处理形式:ArrayList是异步处理,性能较高,而Vector是同步处理,性能较低数据安全:ArrayList是线程不安全的,而Vector是线程安全的。输出形式:ArrayList支持Iterator、ListIterator、foreach;Vector支持Iterator、ListIterator、foreach、Enumeration。
范例
package www.bit.java.test;
import java.util.LinkedList;
import java.util.List;
public class TestDemo {
public static void main(String[] args) {
List 通达信 dll接口,list = new LinkedList<>() ;
通达信 dll接口,list.add('hello') ;
通达信 dll接口,list.add('hello') ;
通达信 dll接口,list.add('bit') ;
System.out.println(通达信 dll接口,list) ;
通达信 dll接口,list.remove('hello') ;
System.out.println(通达信 dll接口,list) ;
}
}
观察ArrayList源码,可以发现ArrayList里面存放的是一个数组,如果实例化此类对象时传入了数组大小,则里面保存的数组就会开辟一个定长的数组,但是后面再进行数据保存的时候发现数组个数不够了会进行数组动态扩充。所以在实际开发之中,使用ArrayList最好的做法就是设置初始化大小。LinkedList:是一个纯粹的链表实现,与之前编写的链表程序的实现基本一样。
ArrayList封装的是数组;LinkedList封装的是链表。ArrayList时间复杂度为而LinkedList的复杂度为n。
Set接口
Set接口和List接口的最大区别在于Set接口中的内容是不允许重复的,并且Set接口并没有对Collection接口进行扩充,而List接口对Collection接口扩充了。因此Set接口中没有get()方法。
Set也有两个子接口:HashSet和TreeSet
HashSet子类
看一段代码:
Set set=new HashSet();
set.add('hello');
set.add('hello');
set.add('Java');
System.out.println(set);
可以发现:结果只有一个hello,而且输出的顺序是无序的。
TreeSet子类
使用范例:
Set set=new TreeSet();
set.add(1);
set.add(1);
set.add(2);
set.add(3);
set.add(4);
set.add(5);
System.out.println(set);
文章为作者独立观点,不代表 股票程序化软件自动交易接口观点
大P2023-08-29
中国股市是全球散户股票数量最多的市场,T+0,不设涨跌停板,很多人输的倾家荡产,大部分人都是盯着波动股票,速度怎么能比得了量化股票程序,量化股票经理说A股是量化股票沃土。ε=唉