项目

内容

这个作业属于哪个课程

https://www.cnblogs.com/nwnu-daizh/

这个作业的要求在哪里

https://www.cnblogs.com/nwnu-daizh/p/11435127.html

作业学习目标

  1. 掌握接口定义方法;
  2. 掌握实现接口类的定义要求;
  3. 掌握实现了接口类的使用要求;
  4. 理解程序回调设计模式;
  5. 掌握Comparator接口用法;
  6. 掌握对象浅层拷贝与深层拷贝方法;
  7. 掌握Lambda表达式语法;
  8. 了解内部类的用途及语法要求。

第一部分:总结第六章理论知识

一、接口

1.1、接口概念

  1. 接口(英文:Interface),在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明。一个类通过继承接口的方式,从而来继承接口的抽象方法。
  2. 接口并不是类,编写接口的方式和类很相似,但是它们属于不同的概念。类描述对象的属性和方法。接口则包含类要实现的方法。
  3. 除非实现接口的类是抽象类,否则该类要定义接口中的所有方法。
  4. 接口无法被实例化,但是可以被实现。一个实现接口的类,必须实现接口内所描述的所有方法,否则就必须声明为抽象类。另外,在 Java 中,接口类型可用来声明一个变量,他们可以成为一个空指针,或是被绑定在一个以此接口实现的对象。

1.2、接口与类相似点

  1. 一个接口可以有多个方法。
  2. 接口文件保存在 .java 结尾的文件中,文件名使用接口名。
  3. 接口的字节码文件保存在 .class 结尾的文件中。
  4. 接口相应的字节码文件必须在与包名称相匹配的目录结构中。

1.3、接口与类的区别

  1. 接口不能用于实例化对象。
  2. 接口没有构造方法。
  3. 接口中所有的方法必须是抽象方法。
  4. 接口不能包含成员变量,除了 static final 变量。
  5. 接口不是被类继承了,而是要被类实现。
  6. 接口支持多继承。

1.4、接口特性

  1. 接口中每一个方法也是隐式抽象的,接口中的方法会被隐式的指定为 public abstract(只能是 public abstract,其他修饰符都会报错)。
  2. 接口中可以含有常量,但是接口中的变量会被隐式的指定为 public static final 变量(并且只能是 public,用 private 修饰会报编译错误)。
  3. 接口中的方法是不能在接口中实现的,只能由实现接口的类来实现接口中的方法。

1.5、抽象类和接口的区别

  1. 抽象类中的方法可以有方法体,就是能实现方法的具体功能,但是接口中的方法不行。
  2. 抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是 public static final 类型的常量。
  3. 一个类只能继承一个抽象类,而一个类却可以实现多个接口。

1.6、接口和抽象类的语法区别:

  1. 1)接口不能有构造方法,抽象类可以有。
  2. 2)接口不能有方法体,抽象类可以有。
  3. 3)接口不能有静态方法,抽象类可以有。
  4. 4)在接口中凡是变量必须是public static final,而在抽象类中没有要求。

1.7、静态方法与默认方法

  1. 1、静态方法
  2. Java SE 8中,允许在接口中增加静态方法。理论上讲 没有任何理由认为这是不合法的。只是这有违于将接口作为抽象规范的初衷
  1. public interface A {
  2. static String aa(){
  3. return "my is A aa";
  4. }
  5. }
  6. A.aa();//my is A aa
  1. 2、默认方法
  2. Java 8 允许给接口添加一个非抽象的方法实现,只需要使用 default 关键字即可,这个特征又叫做扩展方法(也称为默认方法或虚拟扩展方法或防护方法)。在实现该接口时,该默认扩展方法在子类上可以直接使用,它的使用方式类似于抽象类中非抽象成员方法。
  3. 默认方法允许我们在接口里添加新的方法,而不会破坏实现这个接口的已有类的兼容性,也就是说不会强迫实现接口的类实现默认方法。
  4. 默认方法和抽象方法的区别是抽象方法必须要被实现,默认方法不是。作为替代方式,接口可以提供一个默认的方法实现,所有这个接口的实现类都会通过继承得到这个方法(如果有需要也可以重写这个方法)
  1. public interface A {
  2. static String aa(){
  3. return "my is A aa";
  4. }
  5. String bb();
  6. default String cc(){
  7. return "my is A cc";
  8. };
  9. default String dd(){
  10. return "my is A dd";
  11. };
  12. }
  13. public class B implements A{
  14. @Override
  15. public String bb() {
  16. return "my is B bb";
  17. }
  18. @Override
  19. public String cc(){
  20. return "my is B cc";
  21. }
  22. }
  1. 3、默认方法冲突
  2. 如果先在一个接口中将一个方法定义为默认方法,然后又在超类或另一个接口中定义了同样的方法,就会产生一个二义性错误.对于解决这个问题,java提供了相对简单的规则.
  3. 1)、超类优先.如果超类提供了一个具体方法,同名并且有相同参数的默认方法会被忽略
  4. 2)、接口冲突.如果一个接口提供了一个默认方法,另一个接口提供了一个同名而且参数类型相同的方法,必须覆盖这个方法来解决冲突

第二部分:实验部分

1、实验目的与要求

(1) 掌握接口定义方法;

(2) 掌握实现接口类的定义要求;

(3) 掌握实现了接口类的使用要求;

(4) 掌握程序回调设计模式;

(5) 掌握Comparator接口用法;

(6) 掌握对象浅层拷贝与深层拷贝方法;

(7) 掌握Lambda表达式语法;

(8) 了解内部类的用途及语法要求。

2、实验内容和步骤

实验1: 导入第6章示例程序,测试程序并进行代码注释。

测试程序1:

l  编辑、编译、调试运行阅读教材214页-215页程序6-1、6-2,理解程序并分析程序运行结果;

l  在程序中相关代码处添加新知识的注释。

l  掌握接口的实现用法;

  1. package interfaces;
  2.  
  3. import java.util.*;
  4.  
  5. /**
  6. * This program demonstrates the use of the Comparable interface.
  7. * @version 1.30 2004-02-27
  8. * @author Cay Horstmann
  9. */
  10. public class EmployeeSortTest
  11. {
  12. public static void main(String[] args)
  13. {
  14. Employee[] staff = new Employee[3];//创建一个数组对象,大小为三
  15.  
  16. staff[0] = new Employee("Harry Hacker", 35000);
  17. staff[1] = new Employee("Carl Cracker", 75000);
  18. staff[2] = new Employee("Tony Tester", 38000);
  19.  
  20. Arrays.sort(staff);
  21.  
  22. // 打印所有员工对象的信息
  23. for (Employee e : staff)
  24. System.out.println("name=" + e.getName() + ",salary=" + e.getSalary());
  25. }
  26. }
  1. package interfaces;
  2.  
  3. public class Employee implements Comparable<Employee>
  4. {
  5. private String name;
  6. private double salary;
  7.  
  8. public Employee(String name, double salary)
  9. {
  10. this.name = name;
  11. this.salary = salary;
  12. }
  13.  
  14. public String getName()
  15. {
  16. return name;//name访问器
  17. }
  18.  
  19. public double getSalary()
  20. {
  21. return salary; //salary访问器
  22. }
  23.  
  24. public void raiseSalary(double byPercent)
  25. {
  26. double raise = salary * byPercent / 100;
  27. salary += raise;
  28. }
  29.  
  30. /**
  31. * Compares employees by salary
  32. * @param other another Employee object
  33. * @return a negative value if this employee has a lower salary than
  34. * otherObject, 0 if the salaries are the same, a positive value otherwise
  35. */
  36. public int compareTo(Employee other)
  37. {
  38. return Double.compare(salary, other.salary);
  39. }
  40. }

运行结果:

测试示例程序:

  1. interface A
  2. {
  3. double g=9.8;
  4. void show( );
  5. }
  6. class C implements A
  7. {
  8. public void show( )
  9. {System.out.println("g="+g);}
  10. }
  11.  
  12. class InterfaceTest
  13. {
  14. public static void main(String[ ] args)
  15. {
  16. A a=new C( );
  17. a.show( );
  18. System.out.println("g="+C.g);
  19. }
  20. }

运行结果:

测试程序3:

l  在elipse IDE中调试运行教材223页6-3,结合程序运行结果理解程序;

l  26行、36行代码参阅224页,详细内容涉及教材12章。

l  在程序中相关代码处添加新知识的注释。

l  掌握回调程序设计模式;

  1. package week8;
  2.  
  3. /**
  4. @version 1.02 2017-12-14
  5. @author Cay Horstmann
  6. */
  7.  
  8. import java.awt.*;
  9. import java.awt.event.*;
  10. import java.time.*;
  11. import javax.swing.*;
  12.  
  13. public class TimerTest
  14. {
  15. public static void main(String[] args)
  16. {
  17. var listener = new TimePrinter();//定义一个Timeprinter
  18.  
  19. // construct a timer that calls the listener
  20. // once every second
  21. var timer = new Timer(1000, listener);
  22. timer.start();
  23.  
  24. // keep program running until the user selects "OK"
  25. JOptionPane.showMessageDialog(null, "Quit program?");
  26. System.exit(0);
  27. }
  28. }
  29.  
  30. class TimePrinter implements ActionListener //ActionListener是TimePrinter的接口
  31. {
  32. public void actionPerformed(ActionEvent event)
  33. {
  34. System.out.println("At the tone, the time is "
  35. + Instant.ofEpochMilli(event.getWhen()));
  36. Toolkit.getDefaultToolkit().beep();
  37. }
  38. }

6-3

测试程序4:

l  调试运行教材229页-231页程序6-4、6-5,结合程序运行结果理解程序;

l  在程序中相关代码处添加新知识的注释。

l  掌握对象克隆实现技术;

l  掌握浅拷贝和深拷贝的差别。

  1. package clone;
  2.  
  3. /**
  4. * This program demonstrates cloning.
  5. * @version 1.10 2002-07-01
  6. * @author Cay Horstmann
  7. */
  8. public class CloneTest
  9. {
  10. public static void main(String[] args)
  11. {
  12. try
  13. {
  14.  
  15. Employee original = new Employee("John Q. Public", 50000);
  16. //Employee是一个自定义类
  17. original.setHireDay(2000, 1, 1);
  18. Employee copy = original.clone();
  19. copy.raiseSalary(10);//原有对象不会发生变化
  20. copy.setHireDay(2002, 12, 31);//更改器
  21. System.out.println("original=" + original);//字符串连接
  22. System.out.println("copy=" + copy);
  23. }
  24. catch (CloneNotSupportedException e)
  25. {
  26. e.printStackTrace();
  27. }
  28. }
  29. }
  1. package clone;
  2.  
  3. import java.util.Date;
  4. import java.util.GregorianCalendar;
  5.  
  6. public class Employee implements Cloneable
  7. {
  8. private String name;
  9. private double salary;
  10. private Date hireDay;
  11.  
  12. public Employee(String name, double salary)
  13. {
  14. this.name = name;
  15. this.salary = salary;
  16. hireDay = new Date();
  17. }
  18.  
  19. public Employee clone() throws CloneNotSupportedException
  20. {
  21. // 调用object.clone()
  22. Employee cloned = (Employee) super.clone();
  23.  
  24. // 克隆可变的字段
  25. cloned.hireDay = (Date) hireDay.clone();
  26.  
  27. return cloned;
  28. }
  29.  
  30. /**
  31. * Set the hire day to a given date.
  32. * @param year the year of the hire day
  33. * @param month the month of the hire day
  34. * @param day the day of the hire day
  35. */
  36. public void setHireDay(int year, int month, int day)
  37. {
  38. Date newHireDay = new GregorianCalendar(year, month - 1, day).getTime();
  39.  
  40. // 实力字段突变的例子
  41. hireDay.setTime(newHireDay.getTime());
  42. }
  43.  
  44. public void raiseSalary(double byPercent)
  45. {
  46. double raise = salary * byPercent / 100;
  47. salary += raise;
  48. }
  49.  
  50. public String toString()
  51. {
  52. return "Employee[name=" + name + ",salary=" + salary + ",hireDay=" + hireDay + "]";
  53. }

运行结果:

实验2: 导入第6章示例程序6-6,学习Lambda表达式用法。

l  调试运行教材233页-234页程序6-6,结合程序运行结果理解程序;

l  在程序中相关代码处添加新知识的注释。

l  将27-29行代码与教材223页程序对比,将27-29行代码与此程序对比,体会Lambda表达式的优点。

  1. import java.util.*;
  2.  
  3. import javax.swing.*;
  4. import javax.swing.Timer;
  5.  
  6. /**
  7. * This program demonstrates the use of lambda expressions.
  8. * @version 1.0 2015-05-12
  9. * @author Cay Horstmann
  10. */
  11. public class LambdaTest
  12. {
  13. public static void main(String[] args)
  14. {
  15. String[] planets = new String[] { "Mercury", "Venus", "Earth", "Mars",
  16. "Jupiter", "Saturn", "Uranus", "Neptune" };
  17. System.out.println(Arrays.toString(planets));
  18. System.out.println("Sorted in dictionary order:");
  19. Arrays.sort(planets);
  20. System.out.println(Arrays.toString(planets));
  21. System.out.println("Sorted by length:");
  22. Arrays.sort(planets, (first, second) -> first.length() - second.length());
  23. System.out.println(Arrays.toString(planets));
  24.  
  25. Timer t = new Timer(1000, event ->
  26. System.out.println("The time is " + new Date()));
  27. t.start();
  28.  
  29. // 持续运行程序直到按下ok键
  30. JOptionPane.showMessageDialog(null, "Quit program?");
  31. System.exit(0);
  32. }
  33. }

运行结果:

注:以下实验课后完成

实验3: 编程练习

l  编制一个程序,将身份证号.txt 中的信息读入到内存中;

l  按姓名字典序输出人员信息;

l  查询最大年龄的人员信息;

l  查询最小年龄人员信息;

  1. package week8;
  2. import java.io.BufferedReader;
  3. import java.io.File;
  4. import java.io.FileInputStream;
  5. import java.io.FileNotFoundException;
  6. import java.io.IOException;
  7. import java.io.InputStreamReader;
  8. import java.util.ArrayList;
  9. import java.util.Arrays;
  10. import java.util.Collections;
  11. import java.util.Scanner;
  12.  
  13. public class Main{
  14. private static ArrayList<Person> Personlist;
  15. public static void main(String[] args) {
  16. Personlist = new ArrayList<>();
  17. Scanner scanner = new Scanner(System.in);
  18. File file = new File("D:\\java\\身份证号.txt");
  19. try {
  20. FileInputStream fis = new FileInputStream(file);
  21. BufferedReader in = new BufferedReader(new InputStreamReader(fis));
  22. String temp = null;
  23. while ((temp = in.readLine()) != null) {
  24.  
  25. Scanner linescanner = new Scanner(temp);
  26.  
  27. linescanner.useDelimiter(" ");
  28. String name = linescanner.next();
  29. String ID = linescanner.next();
  30. String sex = linescanner.next();
  31. String age = linescanner.next();
  32. String place =linescanner.nextLine();
  33. Person people = new Person();
  34. people.setname(name);
  35. people.setID(ID);
  36. people.setsex(sex);
  37. int a = Integer.parseInt(age);
  38. people.setage(a);
  39. people.setbirthplace(place);
  40. Personlist.add(people);
  41.  
  42. }
  43. } catch (FileNotFoundException e) {
  44. System.out.println("查找不到信息");
  45. e.printStackTrace();
  46. } catch (IOException e) {
  47. System.out.println("信息读取有误");
  48. e.printStackTrace();
  49. }
  50. boolean isTrue = true;
  51. while (isTrue) {
  52. System.out.println("————————————————————————————————————————");
  53. System.out.println("1:按姓名字典序输出人员信息");
  54. System.out.println("2:查询最大年龄人员信息和最小年龄人员信息");
  55. System.out.println("3:查询人员中是否有你的老乡");
  56. System.out.println("4:输入你的年龄,查询年龄与你最近人的所有信息");
  57. System.out.println("5:退出程序");
  58.  
  59. int nextInt = scanner.nextInt();
  60. switch (nextInt) {
  61. case 1:
  62. Collections.sort( Personlist);
  63. System.out.println( Personlist.toString());
  64. break;
  65. case 2:
  66.  
  67. int max=0,min=100;int j,k1 = 0,k2=0;
  68. for(int i=1;i< Personlist.size();i++)
  69. {
  70. j= Personlist.get(i).getage();
  71. if(j>max)
  72. {
  73. max=j;
  74. k1=i;
  75. }
  76. if(j<min)
  77. {
  78. min=j;
  79. k2=i;
  80. }
  81.  
  82. }
  83. System.out.println("年龄最大:"+ Personlist.get(k1));
  84. System.out.println("年龄最小:"+ Personlist.get(k2));
  85. break;
  86. case 3:
  87. System.out.println("place?");
  88. String find = scanner.next();
  89. String place=find.substring(0,3);
  90. String place2=find.substring(0,3);
  91. for (int i = 0; i < Personlist.size(); i++)
  92. {
  93. if( Personlist.get(i).getbirthplace().substring(1,4).equals(place))
  94. System.out.println(Personlist.get(i));
  95.  
  96. }
  97.  
  98. break;
  99. case 4:
  100. System.out.println("年龄:");
  101. int yourage = scanner.nextInt();
  102. int near=agenear(yourage);
  103. int d_value=yourage-Personlist.get(near).getage();
  104. System.out.println(""+Personlist.get(near));
  105. /* for (int i = 0; i < Peoplelist.size(); i++)
  106. {
  107. int p=Personlist.get(i).getage()-yourage;
  108. if(p<0) p=-p;
  109. if(p==d_value) System.out.println(Peoplelist.get(i));
  110. } */
  111. break;
  112. case 5:
  113. isTrue = false;
  114. System.out.println("退出程序!");
  115. break;
  116. default:
  117. System.out.println("输入有误");
  118. }
  119. }
  120. }
  121. public static int agenear(int age) {
  122.  
  123. int min=25,d_value=0,k=0;
  124. for (int i = 0; i < Personlist.size(); i++)
  125. {
  126. d_value= Personlist.get(i).getage()-age;
  127. if(d_value<0) d_value=-d_value;
  128. if (d_value<min)
  129. {
  130. min=d_value;
  131. k=i;
  132. }
  133.  
  134. } return k;
  135.  
  136. }
  137.  
  138. }
  1. package week8;
  2.  
  3. public class Person implements Comparable<Person > {
  4. private String name;
  5. private String ID;
  6. private int age;
  7. private String sex;
  8. private String birthplace;
  9.  
  10. public String getname() {
  11. return name;
  12. }
  13. public void setname(String name) {
  14. this.name = name;
  15. }
  16. public String getID() {
  17. return ID;
  18. }
  19. public void setID(String ID) {
  20. this.ID= ID;
  21. }
  22. public int getage() {
  23.  
  24. return age;
  25. }
  26. public void setage(int age) {
  27. // int a = Integer.parseInt(age);
  28. this.age= age;
  29. }
  30. public String getsex() {
  31. return sex;
  32. }
  33. public void setsex(String sex) {
  34. this.sex= sex;
  35. }
  36. public String getbirthplace() {
  37. return birthplace;
  38. }
  39. public void setbirthplace(String birthplace) {
  40. this.birthplace= birthplace;
  41. }
  42.  
  43. public int compareTo(Person o) {
  44. return this.name.compareTo(o.getname());
  45.  
  46. }
  47.  
  48. public String toString() {
  49. return name+"\t"+sex+"\t"+age+"\t"+ID+"\t"+birthplace+"\n";
  50. }

运行结果:

实验4:内部类语法验证实验

实验程序1:

l  编辑、调试运行教材246页-247页程序6-7,结合程序运行结果理解程序;

l  了解内部类的基本用法。

实验程序2:

l  编辑、调试运行教材254页程序6-8,结合程序运行结果理解程序;

l  掌握匿名内部类的用法。

实验程序3:

l  在elipse IDE中调试运行教材257页-258页程序6-9,结合程序运行结果理解程序;

l  了解静态内部类的用法。

实验总结

本章主要学习了掌握接口定义方法;实现接口类的定义要求;实现了接口类的使用要求;程序回调设计模式;Comparator接口用法;对象浅层拷贝与深层拷贝方法;Lambda表达式语法;内部类的用途及语法要求。通过对新知识的代码注解,理解起来更加清楚。但是我感觉程序设计回调模式我还不能完全理解,后面我会查阅资料,进行更进一步的学习。

201871010114-李岩松《面向对象程序设计(java)》第八周学习总结的更多相关文章

  1. 201771010134杨其菊《面向对象程序设计java》第九周学习总结

                                                                      第九周学习总结 第一部分:理论知识 异常.断言和调试.日志 1.捕获 ...

  2. 扎西平措 201571030332《面向对象程序设计 Java 》第一周学习总结

    <面向对象程序设计(java)>第一周学习总结 正文开头: 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 ...

  3. 201871010132-张潇潇《面向对象程序设计(java)》第一周学习总结

    面向对象程序设计(Java) 博文正文开头 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cn ...

  4. 杨其菊201771010134《面向对象程序设计Java》第二周学习总结

    第三章 Java基本程序设计结构 第一部分:(理论知识部分) 本章主要学习:基本内容:数据类型:变量:运算符:类型转换,字符串,输入输出,控制流程,大数值以及数组. 1.基本概念: 1)标识符:由字母 ...

  5. 201871010124 王生涛《面向对象程序设计JAVA》第一周学习总结

    项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://edu.cnblogs.com/campus/xbsf/ ...

  6. 201871010115——马北《面向对象程序设计JAVA》第二周学习总结

    项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/nwnu-daizh/p ...

  7. 201777010217-金云馨《面向对象程序设计(Java)》第二周学习总结

    项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/nwnu-daizh/p ...

  8. 201871010132——张潇潇《面向对象程序设计JAVA》第二周学习总结

    项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/nwnu-daizh/p ...

  9. 201771010123汪慧和《面向对象程序设计Java》第二周学习总结

    一.理论知识部分 1.标识符由字母.下划线.美元符号和数字组成, 且第一个符号不能为数字.标识符可用作: 类名.变量名.方法名.数组名.文件名等.第二部分:理论知识学习部分 2.关键字就是Java语言 ...

  10. 20155321 2016-2017-2 《Java程序设计》第八周学习总结

    20155321 2016-2017-2 <Java程序设计>第八周学习总结 教材学习内容总结 创建Logger对象 static Logger getLogger(String name ...

随机推荐

  1. MySQL 5.7安装(多实例)最佳实践

    MySQL 5.7安装(多实例)最佳实践,接上一篇<MySQL 5.7安装最佳实践>在已有的实例上面新增一个实例,主要是为了资源合理利用:下面是具体的步骤: 1.新实例目录规划,my.cn ...

  2. javascript 对象和字符串互转

    Object  =>  String : console.log(JSON.stringify(e)); String => Object : JSON.parse(str)

  3. django1-环境搭建

    我的环境:win10 + pycharm2019.1.3 + python3.6.5 + Django2.1.10 安装django cmd下执行:pip install django==2.1.10 ...

  4. 后缀数组(SA)

    学习了LRJ神犇的代码.orz. 首先真心建议了解下基数排序!!且要有一定的c++程序经验,否则程序很难看懂. 然后对着下面的程序调试(假装你已经会了算法思想) 弄个一个礼拜一下午就能学会了. 该算法 ...

  5. win7重装系统经验总结报告(2013年6月29日凌晨1:45)

    win7重装系统经验总结报告(2013年6月29日凌晨1:45) 步骤: 1.考虑被重做的电脑是否有重要文件在C盘.有则转移到D盘等非系统盘. 2.看该电脑是2GB内存还是4GB以上内存. 3.准备好 ...

  6. 主流 CSS 布局(水平居中、垂直居中、居中 )

    什么是布局 html 页面的整体结构或骨架 布局不是某个技术内容 而是一种设计思想 [ 布局方式 ] 水平居中布局 垂直居中布局 居中布局( 水平 + 垂直 ) 什么是水平居中布局 水平居中布局 元素 ...

  7. Java基础(二十八)Java IO(5)RandomAccessFile类与过滤器流(Filter Stream)

    一.RandomAccessFile类 使用RandomAccessFile类可以读取任意位置数据的文件. 1.构造方法 RandomAccessFile(String name, String mo ...

  8. Java网络编程(二)IP、URL和HTTP

    一.IP InetAddress类有一些静态工厂方法,可以连接到DNS服务器来解析主机名. 示例1:InetAddress address = InetAddress.getByName(" ...

  9. LeetCode刷题总结-数组篇(上)

    数组是算法中最常用的一种数据结构,也是面试中最常考的考点.在LeetCode题库中,标记为数组类型的习题到目前为止,已累计到了202题.然而,这202道习题并不是每道题只标记为数组一个考点,大部分习题 ...

  10. 在k8s上安装Jenkins及常见问题

    持续集成和部署是DevOps的重要组成部分,Jenkins是一款非常流行的持续集成和部署工具,最近试验了一下Jenkins,发现它是我一段时间以来用过的工具中最复杂的.一个可能的原因是它需要与各种其它 ...