集合的特点:元素类型可以不同、集合长度可变、空间不固定
集合长度:.size() 获取size属性的长度
数组长度:.length()
格式:
ArrayList list = new ArrayList();
System.out.println(list .size());
list.get(i) :下标 通过集合下标获取集合中每个值
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
一、ArrayList 添加,可以添加重复的数据
增 删 改 查
1、增
① list.add( ); 括号里面可添加任意类型,包含null(可重复数据)
②list.add( index,element );
index:下标位置从0--listsize(); 挤掉 原来的数(往后)
2、删除
list.remove( );
集合的删除 括号里面为int类型 如果删除传入int类型 会默认为集合的下标
注意: 代码编译不会报错,运行时会报错
例: list.remove("111");
System.out.println("=============================="+list.size());
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
可使用:如果一定要删除int类型的值,那么必须使用封装类
例: list.remove(new Integer(111));
System.out.println("=============================="+list.size());
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
3、修改: list.set(下标 ,新的值 ) ;
注意:下标是否越界
例:list.set(0, 222);
System.out.println("=============================="+list.size());
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
集合指定位置:不能跳着加,添加不能超出原来集合的最大长度
例: list.add(5,222);
list.add(6,333);
list.add(7,444);
System.out.println("=============================="+list.size());
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
4、查:list.indexOf();
查找集合中的某个值:list.indexOf() / list.lastIndexOf() 返回指定数据第一次被查找到在集合中的下标
如果没有找到返回-1
System.out.println(list.indexOf("aaa"));
System.out.println(list.lastIndexOf("aaa"));
System.out.println(list.contains("aaa"));
① 手动添加一个null,找到返回为true,没找到返回为false
System.out.println(list.contains(null));
②判断集合是否为空: list.isEmpty() list.size()
list.isEmpty(); // false 不为空
list.size(); // !=0 不为空 System.out.println( list.isEmpty());
System.out.println( list.size());
清空集合中的所有元素:list.clear()
System.out.println(list.size());
集合关键字的区别
1、 ArrayList、Vector和Stack有什么区别?
1、ArrayList的方法和实现基本上和Vector一样,底层都是数组的实现(简:API基本一样) 2、Stack继承了Vector,两者的方法都是线程安全,ArrayList没有考虑线程的问题 3、vector速度慢,ArrayList做了优化,效率更高
2、 ArrayList 和 LinkedList 的区别?
1、 ArrayList底层是数组的实现,linkedList底层是连接的实现(简:数据结构不同)
1.1在java中链表就是自己实现一个类,在类中记录了前一个和后一个的地址,每次查找都需要找到前一个或后一个才能往前或者往后找
2、ArrayList查找速度快,删除和插入速度慢 (常用)
3、LinkedList查找速度慢,删除和插入速度快
4、LinkedList有自己独有的方法:addFirst() addLast() removeLast() removeFirst()。(首尾重要)
3、set和List的区别?
① set接口下的集合特点:
1、没有下标 2、无序的 3、不能重复(前面的被后面的覆盖)
② List接口下的集合特点:
1、有下标 2、有序的(按照添加的顺序获取) 3、可以重复
set转list:
List< 类名 > list = new ArrayList< >( set类 );
4、collections 和collection的区别?
collections是java.util下的工具类,其下有 set 及 list;
collection是java.util下的接口;
5、HashSet 和TreeSet的区别?
HashSet不可以排序
TreeSet可以排序(但是他是用自己的一种方排序规则排序),实现自定义类的排序时必须实现Compare接口的compareTo方法
1、HashSet(hashset比较是否相等,根据两个对象的哈希值)
1、HashSet不可以排序
1)、add()--- 添加元素,会先判断是否为同一对象。出于业务上的考虑我们需要重写HasgCoda方法和equals方法,来判断两个对象是业务上的相等。
2)、remove(Object o)--- 将元素从集合中移除
3)、size()---查看集合长度
HashSet特点:
1)、遍历时没有顺序,
2)、允许包含null
3)、类中不允许出现重复元素。
4)、不能有for循环遍历能用foreach或while循环遍历
2、TreeSet
1、TreeSet可以排序(但是他是用自己的一种方排序规则排序),实现自定义类的排序时必须实现Compare接口的compareTo方法
1)、first()----返回第一个元素
2)、last()----返回最后一个元素
3)、pollLast()---删除最后一个元素
4)、pollFirst()---删除第一个元素
1、使用外部比较器对TreeSet中的元素进行排序,外部比较器作为TreeSet的构造方法参数传递过去。
2、使用外部比较器,我们自定义的类可以不用实现CompareTo
3、Hash的优缺点:
优点:删,增、查很快,提高存储率
缺点:无序,不可重复
6、Comparable和Comparator的区别?
Comparable在java.long包;
Comparator在java.util包;
7、集合和数组的区别?
①、数组创建长度固定,集合长度会随集合元素的添加自动扩展。
②、集合中只能存放对象的引用,而数组可以有基本类型,也可以有引用类型。
③、集合中的算法更加丰富,使用集合操作数据会比数组简洁。
集合的遍历
1、for循环遍历(只能遍历数组为底层的集合)
for (int i = 0; i <List.size(); i++) {
System.out.println(List.get(i));
}
2、增强for循环(foreach循环)
for(Object obj : set) {
System.out.println(obj);
}
3、 迭代器 Iterator
Iterator it = set.iterator();
while (it.hasNext()) {
Object object = it.next();
System.out.println(object);
}
注意:
1、ArrayList 用for循环效率最高;
2、LinkedLis用Iterator和for循环效率高;
3、set用增强foreach循环和Itertor效率高
4、hashset不能用for循环;
集合的工具类
Comparable和Comparator
Comparator:
1、Comparator在java.util包;
2、Comparator必须实现方法 compare(User o1 , User o2) ;
Comparable:
1、 Comparable必须实现方法compareTo(User o ) ;
2、 Comparable在java.long包;
collections.sort();方法使用的两种方式:
1、compareable 在 java.lang包下 实体类必须实现compareable
必须实现 在对象的实体类中compare to方法
2、comparator在java.util下 新建类必须实现comparator
必须实现compare方法
需要新建类或内部类来实现
import java.util.Comparator;
public class StudentCompare implements Comparator<Student>{
@Override(重写)
public int compare(Student o1, Student o2) {
if(o1 == null || o2 == null) {
return 0;
}
return o1.getId() - o2.getId();
}
}
范型 < E > 父类指向子类
尖括号里写:是什么类型的,第二个尖括号可写可不写
List< > list = new ArrayList< >( );
Map (键值对)
格式:
Map< , > map = new HashMap< , >( );
map.put( 键 , 键值 )
System.out.println( map.put( 键 ));
注意:①如果键值一样,只会打印最后出现的那一个,前面的内容会被最后一个覆盖;
② 键不可以重复,键值可以重复;
获取HashMap所有键:
set< 键的类型 > keys = map.keyset( );
获取HashMap中所有的值:
collection< 值的类型 > stu = map.values( );
for( String key : keys ){
System.out.println( key );
}
获取map的entryset: map.entryset( );
set<map.Entry< String(键类型) , student(值类型) > > entrys = map.entryset( );
内部类
内部类:在当前类的内部新建一个类,只在当前类的内部使用
Boy是Person的内部类
Person.Boy boy = new Person( ).new Boy( );
注意Boy类的修饰符
class文件 Person$Boy.class (内部类也会生成class文件)