20170824 - A - 集合框架

Posted 清及

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了20170824 - A - 集合框架相关的知识,希望对你有一定的参考价值。

1 集合存储的是什么类型数据?如果存储的是基本类型数据呢?
引用类型。会自动装箱。

2 集合存储的是什么?
引用的地址。

3 集合分为几种?
两种,List,可重复集
Set,不可重复集

4 如果改变元素的值,集合内存放的元素会改变吗?
会,因为集合存放的是地址。

5
public static void main(String[] args) {
// TODO Auto-generated method stub
Collection c = new ArrayList();
point p = new point(1,2);
c.add(p);
System.out.println("p:"+p);
System.out.println("c:"+c);

test(p);
System.out.println("p:"+p);
System.out.println("c:"+c);
}

public static void test(point p){
p.setX(3);
p = new point(3,5);

p的值为多少?
(3,2);

6 集合的add方法返回的是什么?
boolean值。

7 contains(element)判断的是什么?如何判断,调用集合内元素的equals方法判断和传入参数是否相同。
集合内是否有重复元素

8 如果不重写equals方法调用?
相当于调用==判断。

9 如何获取集合内的元素个数?
int size = c.size()

10 如何清空集合内元素?
c.clear()

11 如何判断集合是否为空?
boolean b = c.isEmpty();

12 Collection c1 = new ArrayList();发生的是什么?
向上造型

13 如何讲一个集合内的所有元素添加到另一个?
c.addAll(c2)

14 hashSet添加c2集合时,c2内含有重复元素是否会继续添加?返回值是什么?
会,但不会添加重复的元素。
true,只要集合有变化就会返回true

15 如何判断某集合是否包含另一集合所有元素?
c1.containsAll(c2);

16 如何通过另外一个集合来删除原有集合的相同元素?
c1.removeAll(c2);
c1删除c2出现的共有元素。

17 如何遍历集合?为何遍历出的元素需要强转?
public static void main(String[] args) {
// TODO Auto-generated method stub
Collection c = new ArrayList();
c.add("one");
c.add("two");
c.add("three");
c.add("four");
System.out.println(c);

Iterator it = c.iterator();
while(it.hasNext()){
String str = (String)it.next();
System.out.println(str);
}
it.next()为object类型——从而能适应各种数据。

18 比较两个字符串应如何写判断式?
“#”.equals(str)

18 如何使用迭代器?
使用问取模式。

Iterator<String> it = c.iterator() 
while(it.hasNext()){
String str = it.next();

//如果没有泛型,
//String str = (String)it.next();
}

19 使用迭代器时可否更改集合(集合的方法)?可以通过什么方法删除?
不可。
直接使用it.remove(),删除的便是该次的it.next()
Iterator it = c.iterator();
while(it.hasNext()){
String str = (String)it.next();
/*
* 在使用迭代器遍历集合元素的过程
* 中,不能通过集合的方法增删元素
* 否则会引发迭代器遍历集合的异常
*/
if("#".equals(str)){
it.remove();
}

20 java特性是什么认可,有什么含义?
编译器,非虚拟机JVM认可。
相当于自动简化,并非新语法

21 接口的实现类实例化的对象向上造型给接口对象,是否能调用toString()方法?
可以,概念要清晰。(,本身造型后是不能访问子类的方法,但因为所有接口已然含有Object的方法)

22 如何使用加强for循环?

//加强for循环遍历
String[] array = {"one","two","three","four"};
for(String str:array){
System.out.println(str);
}

//加强for循环遍历集合
/*
* 新循环并非新的语法,JVM并不认可新循环。
* 新循环是编译器认可的,当编译器发现在使用
* 新循环在遍历集合时,会将代码改编为使用迭代器遍历。
* 所以使用新循环遍历集合的过程是不能通过集合的方法增删元素的。
*/

Collection c = new ArrayList();
c.add("one");
c.add("#");
c.add("two");
c.add("#");
c.add("three");
c.add("#");
c.add("four");
for(Object o:c){
String oo = (String)o;
System.out.println(oo);
}
加强for循环可否再循环中用集合的方法更改集合元素?
不可,因为加强for循环实际调用的也是数组的迭代器循环。

23 泛型可以用于规定基本类型数据吗?如何定义?
不可以。但可以用包装类。
Point<Integer> p = new Point<Integer>(1,2);

public class Point<E> {
private E x;
private E y;

public Point(E x,E y){
super();
this.x = x;
this.y = y;
}

public E getX(){
return x;
}

public void setX(E x){
this.x = x;
}

public String toString(){
return "["+x+","+y+"]";
}

public static void main(String[] args) {
// TODO Auto-generated method stub

}

}


Point p1 = p;
p1.setX("一");
int x1 = p.getX();
System.out.println(p);
System.out.println(p1);

24 泛型用于?泛型可以指定多少个类型?泛型不指定时是什么型?
规定类内参数类型/集合传入参数类型,多个,Object

25
public class Point<E> {
private E x;
private E y;

public Point(E x,E y){
super();
this.x = x;
this.y = y;
}

public E getX(){
return x;
}

public void setX(E x){
this.x = x;
}

public String toString(){
return "["+x+","+y+"]";
}

public static void main(String[] args) {
// TODO Auto-generated method stub

}

}


Point p1 = p;
p1.setX("一");
int x1 = p.getX();
System.out.println(p);
System.out.println(p1);
是否会报错,为什么?

会,p.getX()处,由于x1指向的X已经变成了字符串"一"

26 如何规定集合内的元素类型?
使用泛型定义。
Collection<String> c = new ArrayList<String>();

27 掌握迭代器循环及新循环。
public class CollectionDemo3 {

public static void main(String[] args) {
// TODO Auto-generated method stub
Collection<String> c = new ArrayList<String>();
c.add("一");
c.add("one");
c.add("二");
c.add("two");

System.out.println(c);


Iterator<String> it = c.iterator();
//Iterator<Object> it = c.iterator();
//若集合泛型,则相应的迭代器及新循环不能再用Object
while(it.hasNext()){
String str = it.next();
System.out.println(str);
}

for(String str:c){
System.out.println(str);
}

}

}

29 数组 动态数组 链表 集合的特点与区别
数组:查询快,增删慢
动态数组:属于集合接口,查询快
链表:增删快(比数组快)
集合:包含List(即动态数组及链表)及Set

30 使用list时需注意?
不要导错包
import java.util.List;
import java.awt.List;

31 如何更换list内元素?返回的是什么?
使用set方法,返回的是被替换的元素。

List<String> l = new ArrayList<String>();
l.add("one");
l.add("two");

String old = l.set(1,"2");

32 List是Collection的子类型接口,List是可重复集,并且有序,提供了一套可以根据下标操作元素的方法
*
* 常见实现类:
* java.util.ArrayList:数组实现,查询效率高
* java.util.LinkedList:链表实现,增删元素效率高
* 尤其是首尾增删元素

33 List的更换,删除,追加,添加所调用的方法及返回值。
set(更换元素下标,更换成的元素),返回更换的元素
remove(删除元素下标),返回删除的元素
add(追加元素下标,追加的元素),返回布尔
add(添加的元素),返回布尔

34 下方代码是否能正常运行?
List<Integer> list = new ArrayList<Integer>();
ArrayList<Integer> subList = list.subList(2,7)
System.out.println(subList);

ArrayList<Integer> subList ... 错误,需强转
正确:List<Integer> subList = list.subList(3,8);

35 使用List统合数据的思路
必须先定义列表内元素类型

36 如何获取List型数据某段的集合,对获取的该段子集进行操作后原集合是否会改变?
List<Integer> sList = list.subList(3,8);



37 如何快速删除集合内某段元素?
获取该段子集并clear()

38 集合和数组的互转。
public class CollectionToArrayDemo {

public static void main(String[] args) {
// TODO Auto-generated method stub
Collection<String> list = new ArrayList<String>();
list.add("one");
list.add("one");
list.add("one");
String[] oo = list.toArray(new String[list.size()]);
for(String str:oo){
System.out.println(str );
}

}

}

public class ArrayToCollection {

public static void main(String[] args) {
// TODO Auto-generated method stub
String[] array = {"one","one","one","one","one"};
/*
*
* 数组转换的集合是不能添加元素的
* 更改转换而来的集合的元素原有的数组亦会改变
*/
List<String> list = Arrays.asList(array);
System.out.println("size:"+list.size());
System.out.println(list);
list.set(0, "1");
System.out.println(list);
for(String str:array){
System.out.println(str);
}

List<String> list1 = new ArrayList<String>(list);

System.out.println("list1:"+list1);
list1.add("six");
System.out.println("list1:"+list1);
}

}

39 int[]/Integer[]

 

41 数组可以直接输出显示吗?集合呢?
不可以,必须通过遍历输出显示。
可以。

 

A.Collection是一个接口,定义了集合相关的操作方法

B.List接口与Set接口继承自顶级接口Collection,

C1.List中的实现类为ArrayList,LinkedList→D1
C2.Set接口的实现类为...

D1.ArrayList及LinkedList的比较,
ArrayList:增删慢,读取快
LinkedList:增删快,读取慢,

E.List类元素的更换,删除,追加,添加,切片所调用的方法及返回值。
set(更换元素下标,更换成的元素),返回更换的元素
remove(删除元素下标),返回删除的元素
add(追加元素下标,追加的元素),返回布尔
add(添加的元素),返回布尔
subList(起始下标,终止下标+1)

F.一些通用方法,
判断集合A是否包含所有集合B的元素用什么方法?又是怎么判断的?
A.contains(B),调用类的equals方法。
如何获取集合内的元素个数?
int size = A.size()
如何清空集合内的元素?
A.clear();
如何判断集合是否为空?
c.isEmpty();
如何让A集合添加B集合所有元素?
A.addAll(B)
C列表如何在初始化时便添加所有D数组的元素?
List<String> c = new ArrayList<String>(D);
如何遍历集合?
利用迭代器或加强for循环
如何使用迭代器和加强for循环?


OTHER.
集合中存储的是什么?
引用类型数据。
可以直接往集合中存储基本类型数据吗?
可以,会自动装箱
有序A集合添加到无序B集合,会出现什么?
重复元素不添加。
如何快捷删除集合中的某一段?如何快速删除集合内某些元素?
获取该段切片并clear(),c1.removeAll(c2);
c1删除c2出现的共有元素。
数组可以转化为随机集吗?
不可。

---
泛型
如何设置?

类的泛型
将规定传入数据类型的权限交给用户
public class Point<E> {
private E x;
private E y;

public Point(E x,E y){
super();
this.x = x;
this.y = y;
}

public E getX(){
return x;
}

public void setX(E x){
this.x = x;
}

public String toString(){
return "["+x+","+y+"]";
}

public static void main(String[] args) {
// TODO Auto-generated method stub

}

}

集合的泛型
集合原本可以存储各种数据。
用泛型规定传入数据类型。
List<String> list = Arrays.asList(array);
System.out.println("size:"+list.size());


---
如何调用加强for循环?
for(数据类型 str:数组/List/Set){
System.out.println(str);
}

 


---
什么情况下操作切片会使得原有集合或数组元素改变?
操作集合切片
数组转集合,操作集合

泛型后的集合及方法可传入参数及返回值的类型?

泛型后的类型。

以上是关于20170824 - A - 集合框架的主要内容,如果未能解决你的问题,请参考以下文章

集合框架

集合框架与迭代器

初始集合框架 List Map Set

java集合框架

集合框架-数组与集合互转

java集合框架