数组与集合的区别、Collection集合及常见的方法
数组与集合的区别
存储类型:
- 数组可以储存基本数据类型,有可以储存引用数据类型,基本数据储存的是值,引用数据类型储存的是地址值
- 集合只能储存引用数据类型(对象)集合中也可以储存基本数据类型,但是在储存的时候会自动装箱变成对象
长度:
- 数组的长度是固定的
- 集合的长度是可变的,可以根据元素的增加而增长
- 数组中长度的大小用length,集合中用size()
应用场景:
- 如果元素的长度是固定的推荐使用数组
- 如果数组元素的个数不是固定的推荐使用集合
Collection
- Collection 是一个接口
- 有很多实现类如ArrayList、HashSet、LinkedList等等
public class Test {
public static void main(String[] args) {
//报红,Collection是一个接口,不能实例化
// Collection<String> c = new Collection<String>();
}
}
怎么办看看api,有哪些实现类,没有api,也没有关系,在idea中选中此接口 ctrl + alt + B
public class Test {
public static void main(String[] args) {
//报红,Collection是一个接口,不能实例化
//向上转型
Collection<String> c = new ArrayList<>();
c.add("a");
c.add("b");
System.out.println(c);
}
}
Collection的方法
建议没事的时候自己使用使用方法,增加熟练度,当然我所说的不是看着别人的代码敲
- boolean add(E e); //添加
- boolean remove(Objiect o); //删除
- void clear(); //清除
- boolean contains(Object o); //是否包含
- boolean isEmpty(); //是否为空
- int size(); //集合大小
- Collection带All的基本方法
- boolean addAll(Collection c) //把集合看作一个对象添加给另外一个集合
- boolean removeAll(Collection c) //删除两个集合的是交集,返回值是布尔值
- boolean containsAll(Collection c) //这个集合是否包含另外一个集合的所有元素,返回值是布尔值
- boolean retainAll(Collection c); 取交集,如果调用的集合改变就返回true,如果调用的集合不变就返回false,主要看c
例子
import java.util.ArrayList;
import java.util.Collection;
public class Collection1 {
public static void main(String[] args) {
// demo1();
Collection c = new ArrayList();
c.add("a");
c.add("b");
c.add("c");
c.add("d");
System.out.println(c); //[a,b,c,d]
c.remove("b");
System.out.println(c); //[a,c,d]
c.clear();
System.out.println(c); //[]
c.add("a");
c.add("b");
c.add("c");
System.out.println(c.contains("b")); //[a,b,c]
System.out.println(c.isEmpty()); //false
System.out.println(c.size()); //3
}
private static void demo1() {
/*
* add()的参数是一个对象,返回值是布尔值
* ArrayList的父类的父类重写toString()方法,所以在打印对象的引用的时候,输出结果不是Object类中toString的结果
*/
Collection c = new ArrayList();
boolean b = c.add("abc");
boolean b2 = c.add("abc");
boolean b3 = c.add(true);
boolean b4 = c.add(100);
boolean b5 = c.add(new Student("张三",23));
System.out.println(b); //true
System.out.println(b2); //true
System.out.println(b3); //true
System.out.println(b4); //true
System.out.println(b5); //true
System.out.println(c.toString());
}
}
Student类
public class Student {
private String name;
private int age;
public Student() {
super();
// TODO Auto-generated constructor stub
}
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;
}
@Override
public String toString() {
return "Student [name=" + name + ", age=" + age + "]";
};
}
Cipher389: 博主,while 解法没有考虑n=0或n=1的情况
2301_78275612: 不是,你写错了也不改一下,这不是误导那些刚学的人嘛,真的无语,要么你直接删了也可以
HANrandom: 原题没有问题,字符型变量就当是char吧,char只有8bit,所以064的二进制不是1...00110100而是00110100这样算下来最后就一点问题都没有了
2401_83154477: ✓石
Eternal_meteor03: [code=csharp] #include <stdio.h> int main(void) { int x, y, z; //x * 5 + y * 3 + z * (1.0 / 0.3) == 100; for (x = 1; x <= 19; x++) { for (y = 1; y <= 31; y++) { z = 100 - x - y; if ((int)(x * 5 + y * 3 + z * (1.0 / 3.0)) == 100 && x + y + z == 100) { printf("公鸡:%d 母鸡:%d 小鸡:%d\n", x, y, z); } } } return 0; } [/code]