一.数据结构:
  1.什么是数据结构:
    一种数据的存储方式
  2.常见的4+1种数据结构
    堆栈结构:
      它是只有一个开口的容器结构
      特点:
        先进后出(FILO)
      例子:弹夹,桶装可比克
    队列结构:
      它是两端都有开口的容器结构
      特点:
        先进先出(FIFO)
      例子:
        安检机
    数组结构:
      数组结构在内存中是一块连续的区域
      特点:
        对元素的查询非常快(原因:有下标)
        对元素的增加和删除非常慢
        过程:
          增加的过程:
            要添加数组的长度,创建新的数组
            进行复制 旧数组
            添加新元素
            再销毁旧数组(JVM里边有垃圾回收器)
          删除的过程:
            减少数组的长度,创建新的数组
            进行复制
            再销毁旧数组(JVM里边有垃圾回收器)
    链表结构:
      分开环链表,闭环链表
      单列表:指针域:数据域
      双列表:指针域:数据域:指针域
      链表结构中,每一个元素我们一般称为节点
      组成部分:
        数据域,指针域
      链表结构在内存是可以不连续的
      优点:
        可以提高内存的利用率
      特点:
        查询慢
        增删快
      哈希表结构:(数组结构和链表结构的组合)
        特点:
          查询快
          增删快
  红黑树结构:
    红黑树结构的查找效率非常快
二.List接口
  1.List接口的特点:
    a.有序:存储的顺序和取出的顺序是一致的(比如:保存时1 2 3 取出时1 2 3 )
    b.有索引:说明有下标(就是跟下标相关方法)
      增:add(元素),add(int index,元素)
      删:remove(元素),remove(int index);
      改:set(int index,新元素)
      查:get(int index);
    c.元素可重复:集合中可以保存两个相同的元素
  2.List接口中常用的方法以及常用子类
    增:add(元素),add(int index,元素)
    删:remove(元素),remove(int index);
    改:set(int index,新元素)
    查:get(int index);
    具体的常用实现类:
      ArrayList,LinkedList,Vector
  3.ArrayList的数据结构以及使用
    底层数据结构:数组结构(查询快,增删慢)
    特有方法:无
  4.LinkList的数据结构以及使用
    底层数据结构:链式结构(查询慢,增删快)
    特有方法:(大量和首位操作方法)
      -public void addFirst(E e):将指定元素插入此列表的开头
      -public void addLast(E e);将指定元素添加到此列表的结尾
      -public E getFirst();返回此列表的第一个元素
      -public E getLast();返回列表的最后一个元素
      -public E removeFirst();移除并返回此列表的第一个元素
      -public E removeLast();移除并返回列表的最后一个元素
      -public E pop();从此列表所表示的堆栈处弹出一个元素(弹出,删除元素)和removeFirst是一样的功能
      -public void push(E e);将元素推入此列表所表示的堆栈(推入,添加元素)和addFirst是一样的功能
三.Set接口
  1.Set接口的特点:
    a.无序:指的是元素存储顺序和取出顺序不一定一致(LinkedHashSet除外)
    b.索引:说明集合没有下标,只能通过迭代器(增强for循环)
    c.元素不可重复:集合中只能有一个相同的元素
  2.Set接口的常用方法以及常用子类
    特有方法:无
    常用实现类:
    HashSet,LinkedHashSet,TreeSet
  3.HashSet的数据结构以及使用
    底层数据结构:哈希表结构(查询快,增删快)
    如果哈希结构大的话:会加上红黑树结构
    所有的哈希表结构 都有一个特点:保证元素是唯一的。
  4.哈希表结构的介绍(扩展)
    只有底层是哈希表结构,就能保证元素的唯一的吧!!!
    对象的哈希码值(对象的“数字指纹”)-----每一个对象都有一个哈希值
    a.java中所有的对象都有哈希码值,怎么得到:
      调用 对象名.hashcode()方法即可得到
    下面给出几个常用的哈希码的算法。
      1:Object类的hashCode.返回对象的内存地址经过处理后的结构,由于每个对象的内存地址都不一样,所以哈希码也不一样。
      2:String类的hashCode.根据String类包含的字符串的内容,根据一种特殊算法返回哈希码,只要字符串所在的堆空间相同,返回的哈希码也相同。
      3:Integer类,返回的哈希码就是Integer对象里所包含的那个整数的数值,例如Integer i1=new Integer(100),i1.hashCode的值就是100 。由此可见,2个一样大小的Integer对象,返回的哈        希码也一样。
    b.我们平时说的地址值,其实是假的!!!
      获取到对象的哈希值,给你转成16进制,骗你说这是地址值
      注意:
        java中其实是有地址值的,在对象名中,只是java打印不出地址值。
       结论:哈希表结构如何保证元素的唯一性?
          过程:
            首先比较两个元素的哈希码值
            如果哈希码值相同,再调用equals方法查看是否为true
            只有哈希码值相同,并且equals方法也返回true,才判断这两个元素是重复的,不添加。
      思考问题:
        那么不同的对象,哈希值可能相同吗?
          如果对象没有重写hashCode,那么肯定是调用Object的hashCode
          而hashCode的返回值是int(42亿种),对象有无数个,所有哈希值是有可能相同(可能性低)
          如果对象重写了hashCode,那就要看如何重写了
  5.LinkedHashSet的数据结构以及使用
    底层数据结构:链表和哈希表(数组+链表+红黑树【当元素超过8个,那么这个链表结构就会变身成红黑树】)
    特点:有序,无索引,元素不可重复

    练习:使用哈希表结构,保存自定义对象
    如果要保证自定义对象的唯一性,必须重写对象hashCode和equals

  6.可变参数
    JDK1.5出现的新特性
      可变参数:可变参数指的是参数的个数可以随便写(而不是参数类型)
    格式:
      public 返回值类型 方法名(数据类型...变量名){

      }

     例子:

 public static void main(String[] args) {
//调用
System.out.println(getSum(10));
System.out.println(getSum(11, 51));
System.out.println(getSum(102, 12, 45));
System.out.println(getSum()); }
//可变参数指的是参数的个数
public static int getSum(int...nums){
int sum=0;
for (int num : nums) {
sum+=num;
}
return sum;
}

   结果:

10
23
39
0 Process finished with exit code 0

   本质:
      可变参数的底层就是数组,打印时,通过遍历来打印。
    注意事项:
      一个方法只能有一个可变参数
      一个方法中如果有可变参数和正常的参数,那么可变参数必须写到最后
四.Collections
  1.Collections的介绍
    Collections是集合工具类,专门方便我们操作集合
    Arrays是数组工具类,专门方便我们操作数组
  2.常用功能方法
    -public static <T> boolean addAll (Collection<T> c,T... elements);将所有指定元素添加到指定 collection 中。

    例子:

    public static void main(String[] args) {
//1.添加所有
ArrayList<String> names=new ArrayList<String>();
//添加
Collections.addAll(names,"小苗","java","强");
// for (String name : names) {
// System.out.println(name);
// }
System.out.println(names); }

    结果:

[小苗, java, 强]

Process finished with exit code 0

    -public static void shuffle(List<?> list);打乱顺序:打乱集合顺序(只有list才可以排)
    -public static<T> void sort(List<T> list);将集合中元素按照默认规则升序排序
  3.扩展1:Comparable<T>自然排序接口
    Collections的sort对集合进行排序时,必须满足集合的泛型需要实现一个接口Comparable
    实现Comparable接口,重写方法,比较方法
      this和传入的对象进行比较
      返回值正数:代表this大
      返回值负数:代表传入的对象大
      返回值为0:代表相同
    升序:
      this减去传入的数据

  4.扩展2:Comparator<T>比较器排序接口
    Collections的sort方法,除了接收集合之外,还可以接收一个比较器Comparator接口的实现类对象
    这时候自然排序接口就起不了作用。
    Comparator接口
    创建接口的实现类对象------用匿名内部类
      new Comparator
    升序就 是1的减去2 的
  总结:两种比较方式的优劣
    第二种比较器排序比较灵活
    因为第一种比较已经写死比较规则
    第二种比较 由于比较规则由程序员自己传递,所以可以随时变换比较规则

  例子:

public class Girl implements Comparable<Girl>{
int age;
String name;
public Girl(){
} public Girl(int age, String name) {
this.age = age;
this.name = name;
}
//重写方法比较方法
public int compareTo(Girl o) {
//this和o的比较
//记住:返回值正数 代表this大
// 返回值负数 代表o大
// 返回值0 代表相等
return this.age-o.age;
//升序就是 我 减它
} @Override
public String toString() {
return "Girl{" +
"age=" + age +
", name='" + name + '\'' +
'}';
}
}

  实现:

    public static void main(String[] args) {
//排序自定义类型
ArrayList<Girl> gg=new ArrayList<Girl>();
//保存自定义对象
gg.add(new Girl(12,"add"));
gg.add(new Girl(14,"frcdc"));
gg.add(new Girl(11,"eec"));
gg.add(new Girl(17,"ceex"));
//排序
// Collections.sort(gg);//按照Comparable接口自然排序
Collections.sort(gg, new Comparator<Girl>() {
public int compare(Girl o1, Girl o2) {
//升序就是1减2
return o1.name.length()-o2.name.length();
}
});//根据比较器进行排序
System.out.println(gg); }

  结果:

[Girl{age=12, name='add'}, Girl{age=11, name='eec'}, Girl{age=17, name='ceex'}, Girl{age=14, name='frcdc'}]

Process finished with exit code 0

5.排序练习(代码实现)
  创建一个学生类,存储到ArrayList集合中,
  要求按照学生的年龄升序排序,
  如果年龄相同那么按照名字的第一个字母升序排序

代码:

public class Student implements Comparable<Student>{
int age;
String name; public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public Student(int age, String name) {
this.age = age;
this.name = name;
} public Student() {
} @Override
public String toString() {
return "Student{" +
"age=" + age +
", name='" + name + '\'' +
'}';
} public int compareTo(Student o) {
return 0;
}
}

  代码:

 public static void main(String[] args) {
ArrayList<Student> list=new ArrayList<Student>();
list.add(new Student(44,"af"));
list.add(new Student(14,"fsf"));
list.add(new Student(15,"rv"));
list.add(new Student(16,"sef"));
list.add(new Student(16,"ugc"));
Collections.sort(list, new Comparator<Student>() {
public int compare(Student o1, Student o2) {
if(o1.age==o2.age ){
return o1.name.charAt(0)-o2.name.charAt(0);
} return o1.age-o2.age;
}
});
System.out.println(list); }

  结果:

[Student{age=14, name='fsf'}, Student{age=15, name='rv'}, Student{age=16, name='sef'}, Student{age=16, name='ugc'}, Student{age=44, name='af'}]

Process finished with exit code 0

面试题:
向哈希表结构的集合中,添加重复元素时,根本添加不进去,add方法的返回值是false

List、Set、数据结构、Collections的更多相关文章

  1. Python高级数据结构-Collections模块

    在Python数据类型方法精心整理,不必死记硬背,看看源码一切都有了之中,认识了python基本的数据类型和数据结构,现在认识一个高级的:Collections 这个模块对上面的数据结构做了封装,增加 ...

  2. linkin大话数据结构--Collections类

    操作集合的工具类:Collections Collections 是一个操作 Set.List 和 Map 等集合的工具类.Collections 中提供了大量方法对集合元素进行排序.查询和修改等操作 ...

  3. 作为比湖南还火的python网红,零基础要如何系统的开始学习呢?

    Python(发音:英[?pa?θ?n],美[?pa?θɑ:n]),是一种面向对象.直译式电脑编程语言,也是一种功能强大的通用型语言,已经具有近二十年的发展历史,成熟且稳定.它包含了一组完善而且容易理 ...

  4. 如何学Python

    如何学习Python? Python上手很容易, 基本有其他语言编程经验的人可以在1周内学会Python最基本的内容.它们包括:1.常用内置类型(int, float, bool, bytes, st ...

  5. Oracle学习笔记之五sp1,PL/SQL之BULK COLLECT

    Bulk Collect特性可以让我们在PL/SQL中能使用批查询,批查询在某些情况下能显著提高查询效率. BULK COLLECT 子句会批量检索结果,即一次性将结果集绑定到一个集合变量中,并从SQ ...

  6. Python常用数据结构之collections模块

    Python数据结构常用模块:collections.heapq.operator.itertools collections collections是日常工作中的重点.高频模块,常用类型由: 计数器 ...

  7. collections 数据结构模块namedtuple

    namedtuple类 导入模块 from collections import namedtuple 使用方法及说明 #pycharm 里按住 ctrl键点击 collections可查看源码 #c ...

  8. Python全栈开发之5、几种常见的排序算法以及collections模块提供的数据结构

    转载请注明出处http://www.cnblogs.com/Wxtrkbc/p/5492298.html 在面试中,经常会遇到一些考排序算法的题,在这里,我就简单了列举了几种最常见的排序算法供大家学习 ...

  9. 【Java】Java中的Collections类——Java中升级版的数据结构【转】

    一般来说课本上的数据结构包括数组.单链表.堆栈.树.图.我这里所指的数据结构,是一个怎么表示一个对象的问题,有时候,单单一个变量声明不堪大用,比如int,String,double甚至一维数组.二维数 ...

随机推荐

  1. Angularjs 动态创建属性

    循环输出 for (var i = 1; i < 7; i++) { var res='res'+i; $scope[res]=i; }

  2. 每月IT摘录201904

    技术 1.项目,相比数量,规模更重要. 毫无疑问,在实际工作中,积极参与实际工程项目是快速积累经验最好的办法. 相对于项目的数量,项目的规模更加重要.项目的规模是可以比较容易判断的.实际服务用户的数量 ...

  3. Polar Code(1)极化码SC译码迭代公式的理解

    采用对数似然比求解的迭代公式推导: 考虑 如上图,将L的部分看为一个整体,用 exp(a)和exp(b)代替,并对式子左右都取对数,则公式变为如下所示: 对数似然比 上述公式等效一下公式: 进一步可等 ...

  4. Hillstone设备管理-许可证安装

    1.CLI命令行安装 登录安全网关,运行命令exec license install +许可证,如下图: 系统会提示重启后生效,重启设备即可. 2.web界面安装许可证 1)登录安全网关设备,依次点击 ...

  5. 切面编程AOP之KingAOP

    1. 在Nuget上安装KingAOP 2. 创建一个新的类 public class Test : IDynamicMetaObjectProvider { public DynamicMetaOb ...

  6. 【CSS】面试知识整理

    手写clearfix .clearfix:after { content: ''; display: table; clear: both; } .clearfix { *zoom:; } flex布 ...

  7. 十一、eclipse如何创建一个maven工程project

    1. 2. 3. 4. 这是刚创建的工程,因为缺少WEB-INF/web.xml,所以项目会报错 5. 6. 再编写一个web.xml文件,项目就正常了,没有报错:后期需要自己添加对应的pom.xml ...

  8. scrapy 爬取智联招聘

    准备工作 1. scrapy startproject Jobs 2. cd Jobs 3. scrapy genspider ZhaopinSpider www.zhaopin.com 4. scr ...

  9. Firefox 调试 JavaScript 代码

    第一步  新建 html 或者 jsp 文件 文件内容 <!DOCTYPE html> <html> <head> <meta charset="u ...

  10. 分布式一致性的基石---Paxos算法(1)

    分布式一致性的基石---Paxos算法(1) Paxos算法是由微软的工程师Lamport提出,Lamport依靠Paxos算法获得图灵奖: Paxos算法旨在解决相互信任的分布式系统中,多个节点能快 ...