object类
1.Object类是所有类的的基类
2.常用方法
* ①.clone()方法:克隆对象
* ②.equals()方法:比较两个对象的地址是否相同
* ③.hashCode()方法:获取对象的哈希值
* hashCode的作用是获取哈希值,也称为散列码,实际返回的是一个int整数,这个hash值是确定该对象
* 在哈希表中的索引位置,所有的类都包含这个hashCode()方法
3.hashCode()和equals()方法区别和联系
* ①.equals()方法比较的内存地址
* ②.hashCode()方法返回对象的内存地址处理后结构(数值)
* ③.比较对象的时候,一般先使用hashCode()去做比对,如果hashCode()不一样,则表示两个对象肯定不相等。
* 如果hashCode()相同(因为hashCode相同的对象不一定是同一个对象),再去比较equals()
* 如果equals()也相同,表示两个对象相同
* ④.如果重写了equals()方法一般也需要重写hashCode(),
* 并且要保证equals()方法返回结果为true,hashCode()返回值也要相同,则代表两个对象相同
4.equals和==操作符区别
* ①.equals方法存储在Object类中,所有的类都可以重写,Object类中equals()方法底层依赖的是==操作符
* ②.Object类中equals()和==操作符 结果是一致的。 return(this == obj);
* ③.String类中重写了equals()方法,比较的是字符串内容,而不是比较地址值
StringBuffer和StringBuilder类
1.线程(Thread)
* 线程:是程序中一个单一的执行路径或者控制流程。
* 多线程:在单个程序中同时运行多个线程完成不同的工作,称为多线程。
* eg:当用户发起一个请求,服务器收到请求后处理所有的业务逻辑返回的结果就是一个线程。
* 当客户端多个请求同时请求服务器,这就是多线程(并发)
2.共享资源
* 允许被不同的线程访问的资源
* 共享资源时多线程允许被不止一个线程访问的类变量或者实例变量。
3.锁
* 当多个线程共同使用共享资源时,就会出现资源争抢的情况,锁就是解决这种冲突的机制。
4.线程安全
* 一个资源在可以被多个线程中对象访问的时候,不会出现任何冲突,这种情况就是线程安全。
* 造成线程不安全的因素:存在多个线程同时修改一个共享资源。
5.如何避免线程不安全
* ①.尽量使用局部变量
* ②.尽量不做修改共享资源的操作
* ③.对共享资源加锁
6. StringBuffer
* ①.支持可变长度
* ②.可以修改字符串
* ③.线程安全的
* ④.效率低
7.StringBuilder
* ①.线程不安全
* ②.效率高
回顾基本数据类型:int,short,boolean,dou ble,float,char
1.包装类:对基本数据类型做了封装,解决了基本数据类型的变量不能充当对象使用的问题。
2.拆箱和装箱(手动、自动)
* 装箱:基本数据类型--->对应包装类(int ---> Integer)
* 拆箱:包装类--->对应的基本数据类型(Integer ---> int)
3.拆箱和装箱总结
* ①.包装类本质是一个对象,装箱时先在堆中new一个对象,再将基本数据类型的值赋给该对象的value
* ②.一定不要使用 == 或者 != 在包装类型和基本数据类型之间进行比较,建议使用equals()
* ③.当进行数学运算时,遇到包装类型会进行自动拆箱,再对基本数据类型进行运算。
4.基本数据类型和String类型转化
* ①.基本数据类型 ---> String类型
* 1). +""
* 2). String.valueof(基本数据类型变量)
* ②.String类型 ---> 基本数据类型
* 包装类.parseXXX("字符串")
* eg:Integer.parseInt("字符串");
package com.hpe.example;
public class Demo7 {
public static void main(String[] args) {
int a = 30;
Integer i = new Integer(a);
System.out.println(i);
int x = i.intValue();
System.out.println(x);
Integer i1 = a;
System.out.println("自动装箱:"+ i1);
int x1 = i1;
System.out.println("自动拆箱:"+ x1);
String str = a + "";
String str1 = String.valueOf(a);
System.out.println(str1);
String age = "35";
int age1 = Integer.parseInt(age);
System.out.println(age1);
String str2 = "12.345";
double b = Double.parseDouble(str2);
System.out.println(b);
}
}
日期类
1.Data
* 规则:yyyy-MM--dd HH:mm:ss
* yyyy/MM/dd
* MM/dd
2.SimpleDateFormat
* 日期格式化,可以指定多种日期格式。
3.Calendar
package com.hpe.example;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
public class Demo8 {
public static void main(String[] args) {
Date date = new Date();
System.out.println(date);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String myDate = sdf.format(date);
System.out.println(myDate);
DateFormat d1 = DateFormat.getDateInstance();
String s1 = d1.format(date);
System.out.println(s1);
DateFormat d2 = DateFormat.getTimeInstance();
String s2 = d2.format(date);
System.out.println(s2);
Calendar calendar = Calendar.getInstance();
int year = calendar.get(calendar.YEAR);
int mouth = calendar.get(calendar.MONTH)+1;
System.out.println(year+"-"+mouth);
int day = calendar.get(calendar.DAY_OF_MONTH);
int hour = calendar.get(calendar.HOUR_OF_DAY);
int minute = calendar.get(calendar.MINUTE);
int second = calendar.get(calendar.SECOND);
System.out.println(year+"-"+mouth+"-"+day+" "+hour+"-"+minute+"-"+second);
}
}
生成随机数
1.Math类
* random():生成随机数 0.0-1.0之间(左闭右开)
2.Random类:
* nextInt():生成随机数
package com.hpe.example;
import java.util.Arrays;
import java.util.Random;
public class Demo9 {
public static void main(String[] args) {
double d= Math.random();
System.out.println(d);
int a = (int)(Math.random()*36)+1;
System.out.println(a);
Random random = new Random();
int num = random.nextInt(5);
System.out.println(num);
int[] arr = new int[7];
int count = 0;
int temp = 0;
while (count < arr.length) {
temp = (int)(Math.random()*36)+1;
int bj = 0;
for (int i = 0; i < count; i++) {
if (temp == arr[i]) {
bj = 1;
break;
}
}
if(bj == 0) {
arr[count] = temp;
count++;
}
}
System.out.println(Arrays.toString(arr));
}
}