数组和集合的区别
一、数组声明了它容纳的元素的类型,而集合不声明。
二、数组是静态的,一个数组实例具有固定的大小,一旦创建了就无法改变容量了。而集合是可以动态扩展容量,可以根据需要动态改变大小,集合提供更多的成员方法,能满足更多的需求。
三、数组的存放的类型只能是一种(基本类型/引用类型),集合存放的类型可以不是一种(不加泛型时添加的类型是Object)。
四、数组是java语言中内置的数据类型,是线性排列的,执行效率或者类型检查都是最快的.
Arrays.toString:输出String数组的所有值
重写toString() 只会对类生效,并不能字符串生效 (要重写他的方法才会有用)
集合框架
Collection
List和Set
在实际开发中,需要将使用的对象存储于特定的数据结构的容器中,JDK提供了这样的容器----集合(Collection)
Collection是一个接口,定义了集合相关的各种操作方法
其有两个子接口:List和Set
List 可重复集合
Set 不可重复集合
元素是否重复,取决于元素的equals()比较结果.
集合持有对象的引用
集合中存储都是引用数据类型,并且集合只保存每个元素对象的引用,而并非将元素对象本身存入集合
//创建集合,证明持有的只是对象的引用
Collection<Cell> cells = new ArrayList<Cell>();
cells.add(new Cell("1","2"));
cells.add(new Cell("1","2"));
Cell a = new Cell("2","3");
cells.add(a);
System.out.println(a);
System.out.println(cells);
a.drop();
System.out.println(cells);
addAll,ContainsAll
boolean addAll(Collection<?extends E> c)
该方法需要我们传入一个集合,并将该集合中的所有集合添加到当前集合中.
boolean containsAll(Collection<?> c)
该方法用于判断当前集合是否包含给定集合中的所有元素,诺包含则返回true.
//测试addAll方法和containsAll方法
Collection<String> strCol = new ArrayList<String>();
strCol.add("java");
strCol.add("php");
strCol.add("c++");
strCol.add("c#");
System.out.println(strCol);
Collection<String> c = new HashSet<String>();
c.add("it");
c.add("blue");
strCol.addAll(c);
System.out.println(strCol);
Collection<String> strCol2 = new ArrayList<String>();
strCol2.add("java");
System.out.println(strCol.containsAll(strCol2));
hashNext,next方法
迭代器用于遍历集合元素,获取迭代器可以使用Collection定义的方法
Iterator iterator();
迭代器Iterator 是一个接口,集合在重写了Collection的iteration方法利用内部类提供了迭代器的实现.
Iterator 提供了统一的遍历集合元素的方式,其提供了用户遍历集合的两个方法
Boolean hasNext():判断集合是否还有元素可以遍历
next():返回迭代的下一个元素
Collection<String> strCol = new ArrayList<String>();
strCol.add("java");
strCol.add("php");
strCol.add("c++");
strCol.add("c#");
Iterator<String> iterator = strCol.iterator();//集合的方法
while(iterator.hasNext()){//判断是否还有元素遍历
String str = iterator.next();
System.out.println(str);
remove方法
void remove();
在使用迭代器遍历集合时,不能通过集合的remove方法删除集合元素,否则会抛出异常
我们可以通过迭代器自身提供的remove()方法来删除通过next()方法迭代出的元素
迭代器的删除方法是源集合中删除元素
在调用迭代器的remove()方法前必须通过迭代器的next()方法迭代过元素,那么删除的就是这个元素,
并且不能再次调用remove()方法,除非调用next()方法可再次调用
//练习:删除包含c字母的元素
Collection<String> strCol = new ArrayList<String>();
strCol.add("java");
strCol.add("php");
strCol.add("c++");
strCol.add("c#");
//通过迭代器的方式删除包含字母c的元素
Iterator<String> iterator = strCol.iterator();
while (iterator.hasNext()) {
String str = iterator.next();
if (str.indexOf("c") != -1) {//找不到这个元素为-1
iterator.remove();
}
}
System.out.println(strCol);//刪除的是源集合元素
}
以下會有異常
Iterator<String> iterator = strCol.iterator();
while (iterator.hasNext()) {
String str = iterator.next();
strCol.remove("php");
if (str.indexOf("c") != -1) {//找不到这个元素为1
}
}
//java.util.ConcurrentModificationException
for加強型循环
for(元素类型 e:集合或数组){}
for(String e:strCol){System.out.println(e)}
get和set方法
List除了基础Collection定义的方法外,还根据其线性表的数据结果定义一系列的方法
其中最常用的就是基于下标的get和set方法
语法
E get(int index)
获取集合中指定下标对应的元素,下标从0开始
E set(int index,E element)
将给定的元素存入给定位置,并将原位置的元素返回.
List<String> list = new ArrayList<String>();
list.add("DACAa");
list.add("java");
list.add("111");
list.add("333");
list.add("444");
System.out.println(list);//已经调用了toString方法
for(int i =0;i<list.size();i++){
System.out.println(list.get(i).toUpperCase());
}
//String value = list.set(1, "c++");//替换掉的会输出出来
System.out.println(list);
//System.out.println(value);
list.set(1, list.set(3, list.get(1)));
System.out.println(list);
如何增加oracle中的查询效率
增加索引
使用with结构化语句
使用缓存
使用List 的 set()方法和get()方法设置和获取集合中的元素
1.创建集合并初始化
2.使用List接口提供的set和get方法遍历List集合,并将每一个字符串元素转换成大写
3.将 索引位置的1 的元素替换成c++,并输出被替换的元素以及List
交换集合List中的索引位置为1和索引位置为3的元素
插入和删除
void add(int index,E element)
将给定的元素插入到指定的位置,原位置以及后续的元素都顺序向后移动
E remove(int index)
删除给定位置的元素,并将被删除的元素返回
subList:
List的subList方法用于获取子List
ps:subList获取子List和原List具有相同的存储空间.对子List操作会影响原List.
语法:
List<E>subList(int formIndexm,int toIndex).
formIndexm和toIndex是截取自List的首尾下标(左闭右开)
List<Integer> list = new ArrayList<Integer>();
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.size() == list.size(); size 返回元素个数
// 虽然subList和List拥有相同的存储空间,但是size()方法只是返回集合中元素个数,不是返回存储空间大小
clear()方法用于清除元素 ,表示全量清除
List<Integer> list = new ArrayList<Integer>();
for(int i =0;i<10;i++){
list.add(i);
}
System.out.println(list);
list.subList(3, 8).clear();
System.out.println(list);
List转换数组
List的toArray方法用于将集合转换为数组,但实际上该方法定义在Collection中定义的所有的集合都具备这个功能
其有两个方法
Object[] toArray
<T> T[] toArray(T[] a)
String[] ll = list.toArray(new String[4]);
该方法是比较常用,我们可以传入一个指定的类型的数组,该数组的元素类型应该与集合的元素类型一致,返回则
是转换后的数组,该数组
数组转化为集合.
Arrays类中提供了一个静态方法asList,使用该方法我们就可以将一个数组转化为集合
static <T>list<T> asList<T>
对于返回的集合我们不能对其增加或删除元素,否则会抛出异常,并且对集合的元素进行修改会影响数组对于的元素.
List排序
Collections.sort方法实现排序
Collection是集合工具类,他提供很多便于操作集合的方法,其中就有用于排序的sort方法
语法:
void sort(List<T> list)
List<Integer> list = new ArrayList<Integer>();
Random ran = new Random();
for(int i =0;i<10;i++){
list.add(ran.nextInt(100));
}
System.out.println(list);
Collections.sort(list);
System.out.println(list);
Collections的sort方法 是对集合元素进行自然排序,那么对元素之间一定要有大小之分,那么这个大小之分如何鉴定
实际上,在使用Collections的sort方法排序的集合元素都必须是Comparable接口的实现类,
该接口表示其子类是可比较的,因为必须要是先该接口的一个抽象方法
int comparaTo(T t)
该方法用于使用当前对象与给定对象进行比较
诺当前对象大于给定对象,那么返回值为>0的整数
诺当前对象小于给定对象,那么返回值为<0的整数
诺两个对象相等,返回0