集合的特点: 元素类型可以不同, 集合长度可变, 空间不固定
集合长度:.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, 增
1 list.add( ); 括号里面可添加任意类型, 包含 null(可重复数据)
2list.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"));
1 手动添加一个 null, 找到返回为 true, 没找到返回为 false
System.out.println(list.contains(null));
2判断集合是否为空: 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 的区别?
1 set 接口下的集合特点:
1, 没有下标? 2, 无序的? 3, 不能重复 (前面的被后面的覆盖)
2 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, 数组创建长度固定, 集合长度会随集合元素的添加自动扩展.
2, 集合中只能存放对象的引用, 而数组可以有基本类型, 也可以有引用类型.
3, 集合中的算法更加丰富, 使用集合操作数据会比数组简洁.
集合的遍历
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( 键 ));
注意:1如果键值一样, 只会打印最后出现的那一个, 前面的内容会被最后一个覆盖;
2 键不可以重复, 键值可以重复;
获取 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 文件)
来源: http://www.bubuko.com/infodetail-3321314.html