java 集合学习笔记2-ArrayList LinkedList Vector 泛型 增强for 可变参数
2016-12-25 17:36
756 查看
1、集合-去除ArrayList中重复字符串元素
public static void main(String[] args) {
ArrayList list = new ArrayList();
list.add("a");
list.add("a");
list.add("b");
list.add("b");
list.add("b");
list.add("c");
list.add("c");
list.add("c");
list.add("c");
System.out.println(list);
ArrayList newList = getSingle(list);//调用getSingle方法处理
System.out.println(newList);
}
public static ArrayList getSingle(ArrayList list) {
ArrayList newList = new ArrayList();
//创建一个新集合
Iterator it = list.iterator(); //获取迭代器
while(it.hasNext()) { //判断老集合中是否有元素
String temp = (String)it.next();
//将每一个元素临时记录住
if(!newList.contains(temp)) {
//如果新集合中不包含该元素
newList.add(temp); //将该元素添加到新集合中
}
}
return newList; //将新集合返回
}
2、集合-去除ArrayList中重复自定义对象元素
需要重写自定义对象的equals()方法
例如:
public static void main(String[] args) {
ArrayList list = new ArrayList();
//创建集合对象
list.add(new Person("张三", 23));
list.add(new Person("张三", 23));
list.add(new Person("李四", 24));
list.add(new Person("李四", 24));
list.add(new Person("李四", 24));
list.add(new Person("李四", 24));
//ArrayList newList = getSingle(list);
//调用方法去除重复
//System.out.println(newList);
list.remove(new Person("张三", 23));
System.out.println(list);
}
public static ArrayList getSingle(ArrayList list) {
ArrayList newList = new ArrayList<>();
//1,创建新集合
Iterator it = list.iterator(); //2,根据传入的集合(老集合)获取迭代器
while(it.hasNext()) { //3,遍历老集合
Object obj = it.next(); //记录住每一个元素
if(!newList.contains(obj)) {
//如果新集合中不包含老集合中的元素,会调用obj的equals方法去和newList的每个对象对比
newList.add(obj); //将该元素添加
}
}
return newList;
}
自定义类:需要重写equals方法,不然必然判断是不一样的
public class Person {
private String name;
private int age;
public Person() {
super();
}
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
@Override//重写equals方法
public boolean equals(Object obj) {
Person p = (Person)obj;
return this.name.equals(p.name) && this.age == p.age;
}
}
3、集合-LinkedList的特有功能:
获取或删除第一个 最后一个元素
public void addFirst(E e)及addLast(E e)
public E getFirst()及getLast()
public E removeFirst()及public E removeLast()
4、集合-泛型:
泛型的由来:通过Object转型问题引入
早期的Object类型可以接收任意的对象类型,但是在实际的使用中,会有类型转换的问题。也就存在这隐患,所以Java提供了泛型来解决这个安全问题。
a、泛型好处
提高安全性(将运行期的错误转换到编译期)
省去强转的麻烦
b、泛型基本使用
<>中放的必须是引用数据类型
c、泛型使用注意事项
前后的泛型必须一致,或者后面的泛型可以省略不写(1.7的新特性菱形泛型)
5、集合-泛型类:把泛型定义在类上
public class 类名<泛型类型1,…>
泛型类型必须是引用类型
public class Tool<Q> {
private Q q;
public Q getObj() {
return q;
}
public void setObj(Q q) {
this.q = q;
}
public<T> void show(T t) { //方法泛型最好与类的泛型一致
System.out.println(t); //如果不一致,需要在方法上声明该泛型
}
public static<W> void print(W w) { //静态方法必须声明自己的泛型
System.out.println(w);
}
}
Tool<Student> t = new Tool<Student>(); //创建工具类对象
泛型类中的Q在调用的时候就会被赋值,例如上面的例子就是将Student对象赋值给了Q
6、集合-泛型方法:把泛型定义在方法上
public <泛型类型> 返回类型 方法名(泛型类型 变量名)
有2种方式:
public class Tool<Q> {
private Q q;
public Q getObj() {
return q;
}
public void setObj(Q q) {
this.q = q;
}
//第一种,方法泛型和类的泛型一致
public<Q> void show1(Q q) { //方法泛型最好与类的泛型一致
System.out.println(q);
}
//第二种,方法泛型和类的泛型不一致
public<T> void show(T t) { //方法泛型最好与类的泛型一致
System.out.println(t); //如果不一致,需要在方法上声明该泛型
}
//静态方法的泛型,也可以写成和类的泛型一致,但是是不一样的,static
public static<W> void print(W w) { //静态方法必须声明自己的泛型,因为静态方法在导入包的时候就会分配内存,必须要赋值。
System.out.println(w); //<W>必须写在static的后面
}
}
7、集合-泛型接口:把泛型定义在接口上
public interface 接口名<泛型类型>
例如:
interface Inter<T> {
public void show(T t);
}
class Demo implements Inter<String> {
//推荐用这种
@Override
public void show(String t) {
System.out.println(t);
}
}
//不推荐
class Demo<T> implements Inter<T> {
//没有必要在实现接口的时候给自己类加泛型
@Override
public void show(T t) {
System.out.println(t);
}
}
8、集合-泛型:泛型高级之通配符
泛型通配符<?>
a、泛型通配符<?>
任意类型,如果没有明确,那么就是Object以及任意的Java类了
b、? extends E
向下限定,E及其子类
c、? super E
向上限定,E及其父类
9、集合-增强for循环
ArrayList<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
//增强for循环
for(String s : list) {
System.out.println(s);
}
10、集合-可变参数(就和Python中的 **args定义的参数是一样的)
定义方法的时候不知道该定义多少个参数
例如:
public static void print(int ... arr) {//可变参数其实是一个数组
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
//调用
print(11,22,33,44,55);
注意:如果一个方法有可变参数,并且有多个参数,那么,可变参数肯定是最后一个
11、Arrays工具类的asList()方法的使用
可以将数组转化为集合
例如:
Integer[] arr = {11,22,33,44,55}; //将数组转换成集合,数组必须是引用数据类型(Integer)
List<Integer> list = Arrays.asList(arr);
集合转数组使用 toArray 方法
public static void main(String[] args) {
ArrayList list = new ArrayList();
list.add("a");
list.add("a");
list.add("b");
list.add("b");
list.add("b");
list.add("c");
list.add("c");
list.add("c");
list.add("c");
System.out.println(list);
ArrayList newList = getSingle(list);//调用getSingle方法处理
System.out.println(newList);
}
public static ArrayList getSingle(ArrayList list) {
ArrayList newList = new ArrayList();
//创建一个新集合
Iterator it = list.iterator(); //获取迭代器
while(it.hasNext()) { //判断老集合中是否有元素
String temp = (String)it.next();
//将每一个元素临时记录住
if(!newList.contains(temp)) {
//如果新集合中不包含该元素
newList.add(temp); //将该元素添加到新集合中
}
}
return newList; //将新集合返回
}
2、集合-去除ArrayList中重复自定义对象元素
需要重写自定义对象的equals()方法
例如:
public static void main(String[] args) {
ArrayList list = new ArrayList();
//创建集合对象
list.add(new Person("张三", 23));
list.add(new Person("张三", 23));
list.add(new Person("李四", 24));
list.add(new Person("李四", 24));
list.add(new Person("李四", 24));
list.add(new Person("李四", 24));
//ArrayList newList = getSingle(list);
//调用方法去除重复
//System.out.println(newList);
list.remove(new Person("张三", 23));
System.out.println(list);
}
public static ArrayList getSingle(ArrayList list) {
ArrayList newList = new ArrayList<>();
//1,创建新集合
Iterator it = list.iterator(); //2,根据传入的集合(老集合)获取迭代器
while(it.hasNext()) { //3,遍历老集合
Object obj = it.next(); //记录住每一个元素
if(!newList.contains(obj)) {
//如果新集合中不包含老集合中的元素,会调用obj的equals方法去和newList的每个对象对比
newList.add(obj); //将该元素添加
}
}
return newList;
}
自定义类:需要重写equals方法,不然必然判断是不一样的
public class Person {
private String name;
private int age;
public Person() {
super();
}
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
@Override//重写equals方法
public boolean equals(Object obj) {
Person p = (Person)obj;
return this.name.equals(p.name) && this.age == p.age;
}
}
3、集合-LinkedList的特有功能:
获取或删除第一个 最后一个元素
public void addFirst(E e)及addLast(E e)
public E getFirst()及getLast()
public E removeFirst()及public E removeLast()
4、集合-泛型:
泛型的由来:通过Object转型问题引入
早期的Object类型可以接收任意的对象类型,但是在实际的使用中,会有类型转换的问题。也就存在这隐患,所以Java提供了泛型来解决这个安全问题。
a、泛型好处
提高安全性(将运行期的错误转换到编译期)
省去强转的麻烦
b、泛型基本使用
<>中放的必须是引用数据类型
c、泛型使用注意事项
前后的泛型必须一致,或者后面的泛型可以省略不写(1.7的新特性菱形泛型)
5、集合-泛型类:把泛型定义在类上
public class 类名<泛型类型1,…>
泛型类型必须是引用类型
public class Tool<Q> {
private Q q;
public Q getObj() {
return q;
}
public void setObj(Q q) {
this.q = q;
}
public<T> void show(T t) { //方法泛型最好与类的泛型一致
System.out.println(t); //如果不一致,需要在方法上声明该泛型
}
public static<W> void print(W w) { //静态方法必须声明自己的泛型
System.out.println(w);
}
}
Tool<Student> t = new Tool<Student>(); //创建工具类对象
泛型类中的Q在调用的时候就会被赋值,例如上面的例子就是将Student对象赋值给了Q
6、集合-泛型方法:把泛型定义在方法上
public <泛型类型> 返回类型 方法名(泛型类型 变量名)
有2种方式:
public class Tool<Q> {
private Q q;
public Q getObj() {
return q;
}
public void setObj(Q q) {
this.q = q;
}
//第一种,方法泛型和类的泛型一致
public<Q> void show1(Q q) { //方法泛型最好与类的泛型一致
System.out.println(q);
}
//第二种,方法泛型和类的泛型不一致
public<T> void show(T t) { //方法泛型最好与类的泛型一致
System.out.println(t); //如果不一致,需要在方法上声明该泛型
}
//静态方法的泛型,也可以写成和类的泛型一致,但是是不一样的,static
public static<W> void print(W w) { //静态方法必须声明自己的泛型,因为静态方法在导入包的时候就会分配内存,必须要赋值。
System.out.println(w); //<W>必须写在static的后面
}
}
7、集合-泛型接口:把泛型定义在接口上
public interface 接口名<泛型类型>
例如:
interface Inter<T> {
public void show(T t);
}
class Demo implements Inter<String> {
//推荐用这种
@Override
public void show(String t) {
System.out.println(t);
}
}
//不推荐
class Demo<T> implements Inter<T> {
//没有必要在实现接口的时候给自己类加泛型
@Override
public void show(T t) {
System.out.println(t);
}
}
8、集合-泛型:泛型高级之通配符
泛型通配符<?>
a、泛型通配符<?>
任意类型,如果没有明确,那么就是Object以及任意的Java类了
b、? extends E
向下限定,E及其子类
c、? super E
向上限定,E及其父类
9、集合-增强for循环
ArrayList<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
//增强for循环
for(String s : list) {
System.out.println(s);
}
10、集合-可变参数(就和Python中的 **args定义的参数是一样的)
定义方法的时候不知道该定义多少个参数
例如:
public static void print(int ... arr) {//可变参数其实是一个数组
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
//调用
print(11,22,33,44,55);
注意:如果一个方法有可变参数,并且有多个参数,那么,可变参数肯定是最后一个
11、Arrays工具类的asList()方法的使用
可以将数组转化为集合
例如:
Integer[] arr = {11,22,33,44,55}; //将数组转换成集合,数组必须是引用数据类型(Integer)
List<Integer> list = Arrays.asList(arr);
集合转数组使用 toArray 方法
相关文章推荐
- 16 API-集合(List的子类(ArrayList_Vector_LinkedList,集合嵌套遍历),JDK5新特性(泛型,增强for循环,静态导入,可变参数)
- Java基础-16总结List的子类,ArrayList,Vector,LinkedList,泛型,增强for循环,静态导入,可变参数
- Java学习日记(九)Collection、泛型、Map集合、Collections&Arrays、增强for语句、可变参数、静态导入
- (35)Java学习笔记——集合框架 / 增强for /静态导入 /可变参数
- Java集合源码学习笔记(五)ArrayList,LinkedList,Vector和Hashtable,HashMap的比较
- Java基础学习笔记16——(List的子类,泛型类,增强for循环,静态导入,可变参数)
- Java 集合深入学习--ArrayList,LinkedList和Vector
- JAVA基础学习之String、StringBuffer、StringBuilder、基本数据类型的使用、整形进制转换、集合Collection、Vector、ArrayList、LinkedList、HashSet、TreeSet等(3)
- 重踏学习Java路上_Day16(List的子类,泛型,增强for循环,静态导入,可变参数)
- 集合框架ArrayList、List、Vector+JAVA学习笔记-DAY15
- 黑马程序员_学习笔记:9) 集合框架1:Collection(List、Set)、Iterator、List(ArrayList、LinkedList、Vector)
- ArrayList /Vector/LinkedList用/迭代器遍历 /列表迭代器遍历 /使用size()和get()方法遍历/使用增强for遍历集合
- JAVA学习---集合系列---ArrayList、Vector和LinkedList等的差别
- 01-java基础加强,eclipse工具使用,快捷键,断点调试,单元测试,jdk5新特性,增强for循环,集合map,list,可变参数,枚举,反射,泛型
- JAVA学习第三十五课(常用对象API)—Vector、LinkedList、ArrayList集合演示
- JAVA基础复习十六-LinkedList、栈和队列数据类型、泛型、增强for循环、可变参数、Arrays工具类
- (9) java ---- 集合框架图 ArrayList,LinkedList,Vector各自的性能特点及区别
- Java - 基础增强 - 增强for - 可变参数 - 枚举 - 反射 - 内省 - 泛型
- java基础之集合List-ArrayList、LinkedList、Vector的区别
- 学习笔记_毕向东 Java_集合框架_LinkedList 2014.7.22