java基础部分

第一章 创建对象

1.1 java包管理器

导入包的语句:import 包名+类名
例如:在计算机磁盘内的路径java/time/LocalDate.java

import java.time.LocalDate;

我们来看一下 LocalDate这个日期类:
日期时间和字符串的转化:

import java.time.LocalDate;                    //日期类
import java.time.format.DateTimeFormatter;    //日期格式化类

public class DateTest5 {

  public static void main(String[] args) {

    LocalDate time = LocalDate.now();
    // 打印默认的时间数据
    System.out.println(time.toString());

    // 创建一个格式化方式
    DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy年MM月dd"); 
// DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy/MM/dd");  也可以转化为这种格式
    // 执行时间的格式化处理,得到期望格式的时间字符串
    String timeStr = df.format(time);
    // 打印时间
    System.out.println(timeStr);

  }
}

获取日期时间具体的值:

import java.time.LocalDate;

public class DateTest7 {

  public static void main(String[] args) {

    LocalDate time = LocalDate.now();

    // 得到当前时间所在年
    int year = time.getYear();
    System.out.println("当前年份 " + year);

    // 得到当前时间所在月
    int month = time.getMonth().getValue();
    System.out.println("当前月份 " + month);

    // 得到当前时间在这个月中的天数
    int day = time.getDayOfMonth();
    System.out.println("当前日 " + day);

    // 得到当前时间所在星期数
    int dayOfWeek = time.getDayOfWeek().getValue();
    System.out.println("当前星期 " + dayOfWeek);

  }
}

1.2 日期时间类的运用

字符串转化为日期时间

import java.time.LocalDate;

public class DateTest8 {

  public static void main(String[] args) {
    // 定义一个时间字符串,日期是2019年1月1日
    String date = "2019-01-01";

    // 把字符串转化位 LocalDate 对象,并得到字符串匹配的日期
    LocalDate date2 = LocalDate.parse(date);   //字符串转换为LocalDate对象    2019-01-01
    // 打印出日期
    System.out.println(date2.toString());
  }
}

如果日期字符串的格式不是yyyy-MM-dd,那么就要借助 DateTimeFormatter

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;

public class DateTest81 {

  public static void main(String[] args) {
    // 定义一个时间字符串,日期是2019年1月1日
    String date = "2019/01/01";

    DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy/MM/dd");

    // 把字符串转化位 LocalDate 对象,并得到字符串匹配的日期
    LocalDate date2 = LocalDate.parse(date,df);
    // 打印出日期
    System.out.println(date2.toString());
  }
}

日期时间的计算

import java.time.LocalDate;
public class DateTest10 {
  public static void main(String[] args) {
    LocalDate now = LocalDate.now();
    System.out.println("当前:" + now.toString());
    System.out.println("加法运算");
    System.out.println("加1天:" + now.plusDays(1));
    System.out.println("加1周:" + now.plusWeeks(1));
    System.out.println("加1月:" + now.plusMonths(1));
    System.out.println("加1年:" + now.plusYears(1));
    System.out.println("减法运算");
    System.out.println("减1天:" + now.minusDays(1));
    System.out.println("减1周:" + now.minusWeeks(1));
    System.out.println("减1月:" + now.minusMonths(1));
    System.out.println("减1年:" + now.minusYears(1));
  }
}

两个日期时间先后的判断

import java.time.LocalDate;
public class DateTest11 {
  public static void main(String[] args) {
    LocalDate now = LocalDate.now();
    // 可以对两个 LocalDate 进行比较,
    // 可以判断一个日期是否在另一个日期之前或之后,
    // 或者判断两个日期是否是同年同月同日。
    boolean isBefore = now.minusDays(1).isBefore(LocalDate.now());
    System.out.println("是否在当天之前:" + isBefore);
    boolean isAfter = now.plusDays(1).isAfter(LocalDate.now());
    System.out.println("是否在当天之后:" + isAfter);
    // 判断是否是当天
    boolean sameDate = now.isEqual(LocalDate.now());
    System.out.println("是否在当天:" + sameDate);
  }

}

1.3 面向对象–抽象

在java中一切皆对象,任何事物都可以抽象为一个java对象,就像我们把房子抽象为户型图一样
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-L8BiUQak-1604220250740)(https://style.youkeda.com/img/ham/course/j1/j1-8/hourse-design.svg)]
创建java文件的四个规范: 1 文件名 由类名+.java组成
2 类名遵循大驼峰的命名方式
3 内容遵守固定格式
4 默认情况下 文件存放在src/main/java目录中

public class 类名称 {}  //内容格式

1.4 面向对象–属性和方法

完整的抽象过程包括抽象对象名称,对象属性,对象方法。

public void turnLightsOn(){} //打开灯的方法  没有static关键字是对象方法,如果有static关键字是静态方法

实例化对象
对象的属性和方法必须要先实例化之后才能使用,实例化的方法很简单,我们以house为例子

//我的房子
House myHouse = new House();
//你的房子        
House youHouse = new House();     //youHouse.turnLightsOn(); 实例化后调用方法
//她的房子
House herHouse = new House();    // herHouse.color = "red"; 实例化后调用属性

构造函数:是一个比较特别的对象方法 无参构造函数实例化时无参,有参实例化时要带有参数。

new 构造函数();//实例化的细节
 public class House{                    //这就是默认的构造函数
     public House(){
     }
 }

它的名称和类名一模一样
构造函数没有返回值
构造函数一般配合实例化对象一起使用,可以把构造函数当初类对象的初始化方法。

带参数构造函数

public class House {
    // 房子的颜色是绿色
    public String color = "green";

    // 自定义一个带 color 参数的构造函数
    public House(String color){
      this.color = color;                    //注意这个this 代表的是实例化后的对象
    }
}

显示指定默认构造函数,如果java中定义了新的构造函数,那么默认的无参构造函数就会失效。

1.5 ArrayList

ArrayList语法:是一个动态数组对象,可以方便的存储集合对象(一般存放同类型的数据),使用前需要实例化。

// 这里的 Java 对象类型可以是任意的对象类型
// 比如 String、Integer、House 等
// 这里的 <> 是 Java 泛型的规范,记住这个语法就行了
ArrayList<Java 对象类型> list = new ArrayList<>();

使用add方法进行数据的添加

import java.util.ArrayList;
public class ArrayListTest1{
  public static void main(String[] args){
    // 创建一个 ArrayList 存储字符串集合
    ArrayList<String> strs = new ArrayList<>();
    // 添加数据到 ArrayList 实例里
    strs.add("张三");
    strs.add("李四");
  }
}

get/set方法
ArrayList是动态数组,遵循动态数组的特点:
1 可以获取长度.size()
2 可以根据索引获得具体的值

import java.util.ArrayList;
public class ArrayListTest1{
  public static void main(String[] args){
    // 创建一个 ArrayList 存储字符串集合
    ArrayList<String> strs = new ArrayList<>();
    // 添加数据到 ArrayList 实例里
    strs.add("张三");
    strs.add("李四");
    // 获取集合的长度
    int size = strs.size();
    // 使用 for 循环迭代每一条记录
    for(int i=0;i<size;i++){
       // 根据索引获取值,值的类型是 String
       String str = strs.get(i);
       System.out.println(str);
    }
  }
}

for语句:

for(String str : strs){        //for( 集合变量的类型 变量名称 : 集合变量 )       变量名称可以是任意字符串
       System.out.println(str);
    }

第二章 java面向对象

2.1 类的关联关系 封装 和常量

抽象是编程思维里面最核心的一点,它就是把事物变成变成编程语言的过程。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JpLpLL3u-1604220250743)(https://style.youkeda.com/img/ham/course/j2/chouxiang1.svg)]
ID主键用于表示全局唯一的纪录。
对象的特性:
1所有事物都可以抽象为对象
2 对象是唯一的
3 对象具备属性和方法

类之间的关系:关联 依赖 聚集 泛化 实现

封装 :把类的属性隐藏起来,只能通过公开的方法来得到或者设置属性值,现在业内是get set规范。

变量作用域:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rgEQJFFM-1604220250745)(https://style.youkeda.com/img/ham/course/j2/setter2.svg)]
注意 这里的this就是实例化后的对象,通过this我们可以调用实例内的方法和属性。
方法内的变量是不允许使用修饰符,变量名也不可以重复

public void say(String name){
  // 这个 private 是错误的
  private String msg = "hello";
  // 这个 name 变量名是错误的,因为重复了
  String name = "a";
  int age = 18;
  // 这个字符串 age 变量名是错误的,因为重复了
  String age = "18岁";
}

常量:静态变量
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8v7RemW9-1604220250748)(https://style.youkeda.com/img/ham/course/j2/static1.svg)]
常量可以直接获取或者操作变量而不需要实例化:因为java为它创建了一个全局唯一的内存空间。
常量的变量名一般全部大写来和变量区分,常量一般用在:
1 常用的字符串

/*** 用户Session key*/
public static final String USER_KEY = "m_key";      //final final 代表着这个变量不可以被再次修改用来保证代码安全。
/** * 手机验证码 key*/
public static final String SMS_KEY = "m_sms_key";

2 需要在内存中做缓存值:缓存一些数据到内存中提高计算机的性能

package com.youkeda.service;
import com.youkeda.model.School;
/**
 * 学校服务
 */ 
public class SchoolService{
  // 学校数据的常量
  public static ArrayList<School> SCHOOLS = new ArrayList<>();  
  // 声明一个静态代码块,用于初始化学校数据
  static{
    School school = new School();
    school.setId("1");
    school.setName("北京大学");
    SCHOOLS.add(school);
    school = new School();
    school.setId("2");
    school.setName("清华大学");
    SCHOOLS.add(school);
  }
  public static void main(String[] args){
    // 测试打印一下内存的数据
    for(int i=0;i<SCHOOLS.size();i++){
      School school = SCHOOLS.get(i);
      System.out.println(school.getName());
    }
  }
}

2.2 继承和修饰符

继承:当我们遇到具备相同属性,从属某一类别,领域的对象时,就可以使用继承。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JNPrSjtW-1604220250750)(https://style.youkeda.com/img/ham/course/j2/extends.svg)]
语法:在创建类的时候,使用extends关键字即可 上图表示dog继承animal dog是animal的子类,animal称为父类。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pRkVcgyO-1604220250751)(https://style.youkeda.com/img/ham/course/j2/dog2.svg)]
public protected修饰的父类子类可以获取父类的变量和方法,private的则不可以。

修饰符:
公开级别:用 public 修饰,对外公开
受保护级别:用 protected 修饰,向子类及同一个包中的类公开
默认级别:没有访问修饰符,向同一个包中的类公开
私有级别:用 private 修饰,只有类本身可以访问,不对外公开

方法覆盖:子类重写父类定义的方法 当调用父类方法的时候,可以直接执行子类的方法

package com.youkeda.model;
public class Dog extends Animal{
    public void eat(){
        System.out.println("狗狗喜欢吃肉骨头");
    }
}
Animal d = new Dog();              //子类的对象可以转化为父类的对象
Dog dog = new Animal()             //这个用法是错误的

super关键字:super只发生在子类中,调用父类的方法。

public class Dog extends Animal{
    public void eat(){
        // 调用父类的方法
        super.eat();                   //父类有一些通用的逻辑时
        System.out.println("狗狗喜欢吃肉骨头");
    }
}

子类的构造函数:当父类只有一个有参数的构造函数时,子类也必须要具备这个有参构造函数,或者使用super方法,构造新的构造函数。

public class JavaFile extends CustomFile{        //具备和父类相同的构造函数
  // 声明一个构造函数
 public JavaFile(String filePath){
    super(filePath);
  }
}
public class JavaFile extends CustomFile{                    //声明一个新的构造函数
  private String packageName;
  // 声明一个构造函数
  public JavaFile(String filePath,String packageName){
    super(filePath);                                         //super关键字放在第一行
    this.packageName = packageName;
  }
  public String getPackageName(){
      return this.packageName;
  }
}

2.3 接口

接口(interface):接口是一个类,也包括方法,它可以支持多个实现类。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qMaUbFJk-1604220250752)(https://style.youkeda.com/img/ham/course/j2/LoginService.svg)]
在uml中,接口的图标是 它的类以service结尾。

接口实现类:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-A7reldrl-1604220250754)(https://style.youkeda.com/img/ham/course/j2/implements.svg)]
接口中的方法实现类中必须要有,且修饰符都是public
实现类可以实现多个接口:

package com.youkeda.service.impl;
import com.youkeda.service.RoleService;     
import com.youkeda.service.EchoService;
public class RoleServiceImpl 
             implements RoleService,EchoService{            //实现两个接口,用逗号隔开
    public void addRole(Role role){
    }
    public ArrayList<Role> getRoles(){
        return null;
    }
    public void echo(){
    }
}

接口的实例化:结合实现类的实例化

RoleService roleService = new RoleServiceImpl();     //实例化接口

// 类型转化:把 roleService 实例转化为 EchoService 接口类型     
 EchoService echoService = (EchoService)roleService;

java常用接口:Map和List 这两个都是具体的数据结构
java开发中的核心之一:用接口来定义对象的属性和方法
Map:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uegJ3Xor-1604220250755)(https://style.youkeda.com/img/ham/course/j2/java-map1.png)]
Map是key:value这样形式的集合,它的实现类之一是HashMap

import java.util.Map;
import java.util.HashMap;
// key value 得是 Java 类型
Map<key,value> map = new HashMap<>();       //得到Map的实例

可以使用map.put()存入数据,然后用map.get()取出数据

// 实例化Map对象
Map<Integer,String> map = new HashMap<>();    //key的类型是Integer,value的类型是String

map.put(1,"Monday");                         //存入数据
map.put(2,"Tuesday");
map.put(3,"Wednesday");
map.put(4,"Thursday");
map.put(5,"Friday");
map.put(6,"Saturday");
map.put(7,"Sunday");

String weekText = map.get(3);                //取出数据
System.out.println(weekText); 

int size = map.size();                       //集合大小
System.out.println(size);

for (Map.Entry<Integer,String> entry : map.entrySet()){    //map的遍历
   System.out.println("Key = " + entry.getKey() + 
                  ", Value = " + entry.getValue());
 }

List:它是ArrayList的接口,用法和ArrayList相似。
储存字符串集合

List<String> strings = new ArrayList<>();

for(String str : strings){                      //List的遍历
    System.out.println(str);
}

2.4 java的异常机制

bug:程序错误
一般错误分为:编译错误 语法错误,新手较常见
运行错误(异常) 运行时出现的错误,异常是可以被捕获和处理的。
异常机制:通过异常机制,我们即使部分出问题,也不会影响其他部分的运行。java把异常定义为类,不同的异常可以用不同的方式处理。
异常流程和正常流程是分离的,一旦某段程序抛出了异常,这段代码如果有能力处理,就捕获它,否则只需抛出异常由调用者来处理。
捕获异常:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QWh3Qb2B-1604220250757)(https://style.youkeda.com/img/ham/course/j2/ExceptionTest2.svg)]

java的异常类:

从上图我们可以看出异常Exception和错误error都是继承于throwable,异常类一般都以Exception结尾。
常见的异常类:

IOException:操作输入流和输出流时可能出现的异常

ArithmeticException: 数学异常。如果把整数除以0,就会出现这种异常
                      int a=12/0; // 抛出ArithmeticException

NullPointerException:空指针异常。当引用变量为null时,试图访问对象的属性或方法,就会出现这种异常,例如:
                     String d = null;
                     System.out.println(d.length()); // 抛出NullPointerException

ArrayIndexOutOfBoundsException2:下标越界异常,一般出现在数组中,比如
                       int[] array = new int[4];
                       array[0]=1;
                       array[7]=1;// 抛出 ArrayIndexOutOfBoundsException

ClassCastException1  当类型转化失败的时候就会出现该异常

IllegalArgumentException2非常参数异常,可以用来检查方法的参数是否合法

多个异常的捕获:可以单独根据异常类来捕获,也可以用Exception捕获(建议直接用Exception)

public class ExceptionTest4 {
    public static void main(String[] args) {
        int num = 0;
        try {
          num = getInt("小王");
        } catch (Exception e) {             //用Exception捕获异常
        }
        System.out.println(num);
    }
    // 字符串转换为数字
    public static int getInt(String str) {
        return Integer.parseInt(str);
    }

}

抛出异常:多数异常是系统抛出的,我们自己也可以手动抛出异常。
手动抛出 :在需要抛出的地方使用throw关键字

public static int getInt(String str){
    if(str == null){
        throw new IllegalArgumentException("姓名不能为空");  //使用throw关键字
    }
    return Integer.parseInt(str);
}

异常的显示叫做异常堆栈,仔细阅读可以发现许多有用信息

Caused by: java.lang.IllegalArgumentException: 姓名不能为空
    at ExceptionTest5.getInt(ExceptionTest5.java:11)
    at ExceptionTest5.main(ExceptionTest5.java:5)
    ... 76 more

我们经常使用如下方式抛出异常: 一 先捕获异常
二 声明异常

public class ExceptionTest8 {

    public static void main(String[] args) {
        int num = 0;
        try {
            num = getInt(null);
        } catch (Exception e) {                                //捕获异常
            System.out.println(e.getMessage());
        }
        System.out.println(num);
    }
    public static int getInt(String str) throws Exception {    //声明异常
        if (str == null) {
            throw new Exception("姓名不能为空");                  //抛出异常
        }
        return Integer.parseInt(str);
    }
}

我们来看一个uml图表示的异常
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BhPfR3g7-1604220250758)(https://style.youkeda.com/img/ham/course/j2/UserServiceException.svg)]

package com.youkeda.service;
public interface UserService {
  User login(String userName,String password) throws NullPointerException;
}

自定义异常:有时候java系统定义的异常不能满足我们的业务需求,需要我们自己定义异常的类型。

public class ParamNullException extends Exception {           //只需要继承于Exception 即可
}

此异常的实现类

public User login(String userName, 
                  String password) throws ParamNullException {
  if (userName == null || password == null) {
    throw new ParamNullException();
  }
  for (User user : USERS) {
    if (user.getUserName().equals(userName) && user.getPassword().equals(password)) {
        return user;
    }
  }
  return null;
}

自定义异常的构造函数:

public class ParamNullException extends Exception {
  public ParamNullException() {                  //空的构造函数,必须要创建
  }
  public ParamNullException(String msg) {
    super(msg);
  }
}

finally:它一般和try一起使用,使得系统更加安全
示例:使发生异常的时候关门

public void work() throws LeaveEarlyException {
    try {
      开门
      工作 8个小时 // 可能会抛出异常 DiseaseException
      关门
    } catch (DiseaseException e){
      throw new LeaveEarlyException();
    } finally{
      关门
    }
}

第三章 内部类 java对象和集合

3.1 内部类

面向对象的核心思想之一就是封装,我们在对变量属性的封装之外,还可以在某一个类中定义一个属于它的内部类来封装一些服务。

内部类的语法和实例化(使用前必须先实例化,且内部类不能有静态变量):

package com.youkeda.util;

public class OuterUtil {                                        // 外部类
    public class InnerTool {                                   // 内部类
        public int add(int a,int b){
            return a+b;
        }
    }
    private InnerTool tool = new InnerTool();                  //内部类的实例化
}

uml[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JRfHwmj1-1604220250759)(https://style.youkeda.com/img/ham/course/j2/InnerTool.svg)]
在使用时,我们只实例化外部类,然后调用方法,并不会感知到内部类的存在。
由于访问其他内的内部类比较麻烦(需要先实例化外部类如下图),所以我们并不建议直接访问内部类

OuterUtil.InnerTool tool = new OuterUtil().new InnerTool();

静态内部类:添加static关键字 静态内部类可以直接被调用而不需要实例化外部类。

package com.youkeda.util;
public class OuterUtil {
    public static class InnerTool {             // 静态内部类
        public int add(int a,int b){
            return a+b;
        }
    }
}


package com.youkeda.test;
import com.youkeda.util.OuterUtil;
// 静态内部类是需要单独 importimport com.youkeda.util.OuterUtil.InnerTool;
public class OuterUtilTest {
   public static void main(String[] args){
       InnerTool tool = new InnerTool();          //可以直接实例化调用
       int sum = tool.add(1,2);
       System.out.println(sum);
   }

}

局部内部类:在方法中定义一个类,用的比较少,多见于框架中。

匿名类:本质上是一个局部内部类,但是只用于类的实例化,而不是声明。

public class ATest {
  public static void main(String[] args){
    A a = new A(){                      //用于类的实例化 
       public void method(){
         System.out.println("执行内部类");
       }
    };
    a.method();
  }
}

上面等同于
public class AImpl implements A{
  public void method(){
    System.out.println("执行类");
  }
}

匿名类除了实现接口之外,还可以继承父类

public class Sub {
  public void print(){
  }
}

public class SubTest {
  public static void main(String[] args){
    Sub sub = new Sub(){
       public void print(){
         System.out.println("执行内部类");
       }
    };
    sub.print();
  }
}

上面的效果等同于
public class SubNode extends Sub {
  public void print(){
    System.out.println("执行");
  }
}

接口中的默认方法:
抽象类是一个父类,它的实例化须要有子类参与,当然也可以通过匿名类实例化。
示例:

// 定义一个武器的抽象类
public abstract class Weapon{         //abstract关键字需要在类上声明
  // 抽象方法:攻击
  public abstract void attack();     //abstract关键字需要在方法上声明
} 

它的子类
public class GoldenBar extends Weapon {
  public void attack(){
    System.out.println("使用金箍棒进行劈一棍"); //必须要有父类的方法
  }
}

uml图[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TI7TQpp7-1604220250761)(https://style.youkeda.com/img/ham/course/j2/weapon.svg)]

在接口中某个方法上使用defalut关键字,可以使实现类中不一定要覆盖该方法。

public interface Vehicle {
   default void print(){                   //接口方法上的default关键字
      System.out.println("我是一辆车!");         
   }
}

覆盖接口上的默认方法
public class Car implements Vehicle {
   public void print(){
      System.out.println("我是一辆汽车!");
   }
}

不覆盖接口的默认方法
public class Car implements Vehicle {
}

###3.2 对象的关系
聚合关系(Aggregation):聚合是一种特殊的关联(Association)形式,表示两个对象之间的所属(has-a)关系。所有者对象称为聚合对象,它的类称为聚合类;
从属对象称为被聚合对象,它的类称为被聚合类
uml[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8xBaAUUx-1604220250762)(https://style.youkeda.com/img/ham/course/j2/aggregation.svg)]

示例:公司类和员工类
public class Company {
    private List<Employee> employees;
}

public class Employee {
    private String name;
}

组合关系(Composition):聚合是一种较弱形式的对象包含(一个对象包含另一个对象)关系,较强形式是组合(Composition)。在组合关系中包含对象负责被包
含对象的创建以及生命周期,即当包含对象被销毁时被包含对象也会不复存在
uml[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-drjTMmk6-1604220250763)(https://style.youkeda.com/img/ham/course/j2/composition.svg)]

依赖关系(Dependency):依赖(Dependency)描述的是一个类的引用用作另一个类的方法的参数
uml[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FP6VimoP-1604220250764)(https://style.youkeda.com/img/ham/course/j2/dependency.svg)]

继承(Inheritance)/实现(Realization)关系:继承和实现的 UML 图是一样的表达了子类继承父类,实现类实现接口的关系.
uml[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zIaXRywA-1604220250765)(https://style.youkeda.com/img/ham/course/j2/bar.svg)]

3.3 java集合

List和数组的互换:

数组转化为List
Arrays 是一个工具类,所以它的方法都是静态方法,我们先了解最常用的转化方法。
static List asList(T… a)示例

import java.util.Arrays;
import java.util.List;

public class ArraysMain {
 public static void main(String[] args) {
   // 转化数组为 list
   List<String> lists = Arrays.asList("小王","小明");   //参数为对象数组,不为基本数组
   System.out.println("集合的长度是: " + lists.size());

   // 转化数组为 list2
   List<String> lists2 = Arrays.asList("小王","小明","小李"); //参数为对象数组,不为基本数组
   System.out.println("集合2的长度是: " + lists2.size());
 }
}

List转化为数组:使用toArray方法即可

import java.util.List;
import java.util.ArrayList;

public class List2ArrayTest {
    public static void main(String[] args)
    {
        List<Integer> al = new ArrayList<Integer>();
        al.add(10);
        al.add(20);
        al.add(30);
        al.add(40);

        // 转化为数组
       Integer[] arr = al.toArray(new Integer[]{});  //使用toArray方法即可
        for (Integer x : arr) {
          System.out.println(x + " ");
        }
    }
}

List集合转化为字符串:使用String.join(“split”,list)方法。

  String string = String.join(",", list);  //转化为字符串并用逗号分割

排序
Arrays.sort():java.util.Arrays 这个工具类非常强大,它的 sort 方法就可以实现数字的排序,默认它的排序是从小到大的顺序排序

Arrays.toString 的方法签名如下:任何数组数字都可以转化为字符串

public static String toString(boolean[] arr)
public static String toString(byte[] arr)
public static String toString(char[] arr)
public static String toString(double[] arr)
public static String toString(float[] arr)
public static String toString(int[] arr)
public static String toString(long[] arr)
public static String toString(Object[] arr)
public static String toString(short[] arr)

import java.util.*;

public class Arrays2String {
   public static void main(String[] args) {
        boolean[] boolArr = new boolean[] { true, true, false, true };
        byte[] byteArr = new byte[] { 10, 20, 30 };
        char[] charArr = new char[] { 'g', 'e', 'e', 'k', 's' };
        double[] dblArr = new double[] { 1, 2, 3, 4 };
        float[] floatArr = new float[] { 1, 2, 3, 4 };
        int[] intArr = new int[] { 1, 2, 3, 4 };
        long[] lomgArr = new long[] { 1, 2, 3, 4 };
        Object[] objArr = new Object[] { 1, 2, 3, 4 };
        short[] shortArr = new short[] { 1, 2, 3, 4 };

        System.out.println(Arrays.toString(boolArr));
        System.out.println(Arrays.toString(byteArr));
        System.out.println(Arrays.toString(charArr));
        System.out.println(Arrays.toString(dblArr));
        System.out.println(Arrays.toString(floatArr));
        System.out.println(Arrays.toString(intArr));
        System.out.println(Arrays.toString(lomgArr));
        System.out.println(Arrays.toString(objArr));
        System.out.println(Arrays.toString(shortArr));
    }
}

自定义排序:static void sort(T[] a, Comparator< super T> c):

我们可以在第二个参数里传递自定义比较类来确定排序,java.util.Comparator是一个接口,用于声明比较规则一般配合排序一起使用,
我们看一下这个接口的方法
public interface Comparator {
//返回值是 int,我们根据返回值 >0、=0、<0 进行重新排序
int compare(T o1, T o2);
}
示例:

import java.util.*;
public class ArraysSortTest2 {
    public static void main(String[] args) {
        Integer[] intArr = { 10, 20, 15, 22, 35 };
        // 自定义排序
        Arrays.sort(intArr, new Comparator<Integer>(){
            public int compare(Integer o1, Integer o2){
                
                return o2-o1;  //根据返回值的正负来进行排序 正升序 负倒序
            }
        });
        System.out.println("Integer Array: "
                           + Arrays.toString(intArr));
    }
}


输出结果
Integer Array: [35, 22, 20, 15, 10]

数组可以排序,集合也可以排序:可以通过工具类java.util.Collections中的sort方法进行排序

static <T> void sort(List<T> list, Comparator<? super T> c)

完整示例:

import java.util.*;

public class ListSortTest {
  public static void main (String[] args) {
    List<Student> ar = new ArrayList<Student>();
    ar.add(new Student(111, "bbbb", "london"));
    ar.add(new Student(131, "aaaa", "nyc"));
    ar.add(new Student(121, "cccc", "jaipur"));

    System.out.println("原始集合");
    for (int i=0; i<ar.size(); i++) {
      System.out.println(ar.get(i));
    }

    // 实现升序排序
    Collections.sort(ar, new Comparator<Student>(){
      public int compare(Student a, Student b) {
        // 第一个参数的学号 > 第二个参数的学号
        return a.getRollNo() - b.getRollNo();
      }
    });

    System.out.println("\n排序后的集合");
    for (int i=0; i<ar.size(); i++) {
      System.out.println(ar.get(i));
    }

  }
}

删除remove:移除集合中的某个元素

List.remove(int index)

合并 addAll:将两个集合合并为一个集合

list1.addAll(list2);              //将集合2合并到集合1中

截取 subList:截取集合中的某一段内容

 List<String> arrlist2 = list.subList(2, 4);  截取索引2到4的内容
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值