1、get/set方法
见名知义,get获取、set设置,get/set方法在java中就是取值赋值的含义,
如上,我们在People类中获取了name与age的get/set方法,在main中首先我们实例化一个叫做文豪的对象,才能对此进行赋值与取值。
2、构造器(构造方法)
首先构造方法的作用是对类进行初始化,然后就是相当于set的作用为对象赋值,
我们在创建类时系统会为我们默认的创建一个无参的构造方法,当我们实例化时就是调用这个无参的构造方法,
People wh=new People()
这就是无参构造方法的实例化
public People(String name,int age){//含有参数构造方法
super( );
this.name=name;
this.age=age;
}
如果我们在类中定义了一个含参构造方法
在实例化时要加上参数
People xx=new People("文豪",20);//含参构造方法赋值
如果没有加参数将会报错,因为我们在类中添加含参构造方法时系统为我们默认添加的无参构造方法就不会被加上,这时我们需要手动添加上。
所以说当我们new一个对象时,会自动调用构造方法进行初始化,这也就是为什么当我们没有添加构造方法时系统会默认为我们添加一个无参的构造方法。
java 优化双重for循环
java for循环 优化
首先我们要有两个对象分别是 学生信息 和 学生住宿信息
class Student {
//学生id
private Integer studentUserId;
//学生名称
private String name;
}
class studentRooms {
//学生id
private Integer studentUserId;
//学生名称
private String roomInfo;
}
将对象填充参数
//学生信息
List<Student> students = new ArrayList<>();
students.add(Student.builder().studentUserId(111).name("张三").build());
students.add(Student.builder().studentUserId(222).name("李四").build());
//学生住宿信息
List<StudentRoom> studentRooms = new ArrayList<>();
studentRooms.add(StudentRoom.builder().studentUserId(222).roomInfo("住宿").build());
studentRooms.add(StudentRoom.builder().studentUserId(111).roomInfo("走读").build());
这时我们的需求是, 将两边集合数据中, 相同studentUserId 数据拼接到一起返回给前端 如:
{
"studentUserId":111,
"name":"张三",
"roomInfo":"走读"
这时候我们常规的写法就是 遍历两个集合 判断studentUserId 如果相同则拼装数据
for (Student student : students) {
for (StudentRoom studentRoom : studentRooms) {
//判断学生id是否相同
if (student.getStudentUserId().equals(studentRoom.getStudentUserId())) {
System.out.println("拼装数据返回给前端");
}
}
}
上述这种写法面临最大的问题就是时间复杂度为O(n^2)对 n 个数进行排序,需要扫描 n X n 次
对于上述代码也就是 2 x 2 = 4次
那么如何优化这种情况呢? 这里我们可以采用JDK1.8新特性的 stream流做处理代码如下
//根据学生Id转成Map
Map<Integer, StudentRoom> studentRoomByUserId = studentRooms.stream().collect(Collectors.toMap(StudentRoom::getStudentUserId, Function.identity()));
for (Student student : students) {
//根据外层遍历的学信息id get学生住宿信息Map中的Key
StudentRoom studentRoom = studentRoomByUserId.get(student.getStudentUserId());
//如果能get到数据!=null 说明id一样
if (studentRoom != null) {
System.out.println("拼装数据返回给前端");
}
}
按照上述这种操作方法会大大减少时间复杂度为O(n), 而循环的次数也变为了2次
完整代码
public class Test{
@Data
@Builder
class Student {
//学生id
private Integer studentUserId;
//学生名称
private String name;
}
@Data
@Builder
class StudentRoom {
//学生id
private Integer studentUserId;
//学生住宿信息
private String roomInfo;
}
public void test() {
//学生信息
List<Student> students = new ArrayList<>();
students.add(Student.builder().studentUserId(111).name("张三").build());
students.add(Student.builder().studentUserId(222).name("李四").build());
//学生住宿信息
List<StudentRoom> studentRooms = new ArrayList<>();
studentRooms.add(StudentRoom.builder().studentUserId(222).roomInfo("住宿").build());
studentRooms.add(StudentRoom.builder().studentUserId(111).roomInfo("走读").build());
//根据学生Id转成Map
Map<Integer, StudentRoom> studentRoomByUserId = studentRooms.stream().collect(Collectors.toMap(StudentRoom::getStudentUserId, Function.identity()));
for (Student student : students) {
//根据外层遍历的学信息id get学生住宿信息Map中的Key
StudentRoom studentRoom = studentRoomByUserId.get(student.getStudentUserId());
//如果能get到数据说明id一样
if (studentRoom != null) {
System.out.println("拼装数据返回给前端");
}
}
}
//学生信息List
}
for(:)遍历数组的一种方式
1.对于for(类型名 类型 : 需要遍历的数组),这时候就是先创建了对象或者变量,然后遍历数组,一个一个赋值给类型
类型:可以是变量,对象
类型名:比如String,int,自己建的User对象
代码1:
package enums;
public class ce {
public static void main(String[] args) {
String[] ni=new String[]{"国家","nih"};
for (String i : ni) {
System.out.println(i);
}
}
}
代码2:
package enums;
public class ce {
public static void main(String[] args) {
int[] array=new int[]{8,2,1,0,3};
int[] index=new int[]{2,0,3,2,4,0,1,3,2,3,3};
String tel="";
for (int i : index) {
tel+=array[i];
System.out.println("index数组内的值:"+i);
}
System.out.println(tel);
}
}
for循环遍历index数组,然后每一次的值赋值给i,就是i=index[]当前遍历数组的值,
然后这个程序内:tel+=array[i]; 将index[]代表的值,依次当成array[]数组的下标变量,然后依次拼接赋值给tel
实现一个数组内的数值控制,另外一个数组下标,接着将不同的值拼接输出