如果早起的那只鸟没有吃到虫子,那就会被别的鸟吃掉。
String类和Object类中equals的区别
String equals比较的是内容是否相同 “==”表示比较两个String对象的引用是否指向同一个对象 Stringz类重写了equals方法
String 举例:
https://blog.csdn.net/zhushuai1221/article/details/51417123?utm_source=blogkpcl13&utm_medium=distribute.pc_relevant.none-task-blog-title-9&spm=1001.2101.3001.4242
String str1=new String(“AAA”);
String str2=new String(“AAA”);
boolean reasult1=str1.equals(str2); true equals比较的是内容是否相同
boolean result2=(str1==str2); flase “==”表示比较两个String对象的引用是否指向同一个对象
Object类 “==”和equals用法相同 比较基本数据类型 两个值相同 结果为ture 比较两个对象引用 指向为内存中同一个对象结果为ture
Object举例:
https://www.cnblogs.com/csslog/p/11209602.html
通过重写equals方法 来判断对象的属性值来判断对象是否相等
public boolean equals(object obj){
return (this==obj);
}
String类中的equals方法是用来判断两个对象的内容是否相同,而Object 类中的equals方法是用来判断两个对象是否是同一个对象,所谓同一个对象指的是内存中的同一块存储空间。
String类和StringBuilder类的区别
String类不可变 StringBuilder字符串大小没有容量
一般情况下,速度从快到慢:StringBuilder>StringBuffer>String,这种比较是相对的,不是绝对的
(1).如果要操作少量的数据用 = String
(2).单线程操作字符串缓冲区 下操作大量数据 = StringBuilder
(3).多线程操作字符串缓冲区 下操作大量数据 = StringBuffer
https://www.jianshu.com/writer#/notebooks/45911160/notes/71432711
1. String 类
String的值是不可变的,这就导致每次对String的操作都会生成新的String对象,不仅效率低下,而且大量浪费有限的内存空间。
String a = "a"; //假设a指向地址0x0001
a = "b";//重新赋值后a指向地址0x0002,但0x0001地址中保存的"a"依旧存在,但已经不再是a所指向的,a 已经指向了其它地址。
因此String的操作都是改变赋值地址而不是改变值操作。
2. StringBuffer是可变类,和线程安全的字符串操作类,任何对它指向的字符串的操作都不会产生新的对象。 每个StringBuffer对象都有一定的缓冲区容量,当字符串大小没有超过容量时,不会分配新的容量,当字符串大小超过容量时,会自动增加容量。
StringBuffer buf=new StringBuffer(); //分配长16字节的字符缓冲区
StringBuffer buf=new StringBuffer(512); //分配长512字节的字符缓冲区
StringBuffer buf=new StringBuffer("this is a test")//在缓冲区中存放了字符串,并在后面预留了16字节的空缓冲区。
3.StringBuilder
StringBuffer和StringBuilder类功能基本相似,主要区别在于StringBuffer类的方法是多线程、安全的,而StringBuilder不是线程安全的,相比而言,StringBuilder类会略微快一点。对于经常要改变值的字符串应该使用StringBuffer和StringBuilder类。
4.线程安全
StringBuffer 线程安全
StringBuilder 线程不安全
String类的对象内容不可改变,所以每当进行字符串拼接时,总是会在内存中创建一个新的对象,所以经常改变内容的字符串最好不要用String,因为每次生成对象都会对系统性能产生影响。
StringBuilder又称为可变字符序列,是JDK5.0中新增加的一个类,它是一个类似于String的字符串缓冲区,通过某些方法调用可以改变该序列的长度和内容。即它是一个容器,容器中可以装很多字符串,并且能够对其中的字符串进行各种操作。它的内部拥有一个数组用来存放字符串内容,进行字符串拼接时,直接在数组中加入新内容,StringBuilder会自动维护数组的扩容
代码:
public class StringBuilder {
public static void main(String[] args) {
/**
* 分别使用String的 += 和StringBuilder的append方法对字符串做100000次拼接,
* 计算String拼接100000次花费时间与StringBuilder拼接100000次所花费时间并打印
*
* 结果证明 (单位毫秒)
* tring所花费多少时间108
* StringBUilder所花费多少时间2
*/
toString1();
StringBuilderTest();
}
public static void toString1(){
//系统时间
long l = System.currentTimeMillis();
//先定义一个字符串
StringStr="nihao";
//写一个循环 循环10000次
for (int i =0; i <10000 ; i++) {
Str+="world";
}
long l1 = System.currentTimeMillis();
System.out.println("String所花费多少时间"+(l1-l));
}
public static void StringBuilderTest(){
//系统时间
long l = System.currentTimeMillis();
//定义一个字符串
java.lang.StringBuilder nihao1 =new java.lang.StringBuilder("nihao");
for (int i =0; i <10000 ; i++) {
nihao1.append(i);
}
long l1 = System.currentTimeMillis();
System.out.println("StringBUilder所花费多少时间"+(l1-l));
}
}
StringBuilder 方法reverse(字符序列用其翻转形式取代) append toString
public class StringArray {
public static void main(String[] args) {
//定义字符串数组
String[] array={"010","3223","666","7890987","123123"};
//定义一个空的字符
java.lang.StringBuilder sb=null;
//统计数
int count=0;
//判断字符串数组中是否对称if
for (String s: array) {
sb=new java.lang.StringBuilder(s);
/**
* reverse 序列中包含任何替代对,则将它们视为单个字符进行反向操作
* toString 顺序中数据的字符串
*/
if (sb.reverse().toString().equals(s)){
count++;
}
}
//打印数组中字符串的个数
System.out.println("对称的个数是:"+count);
}
}
Date 练习
重点:new SimpleDateFormat("yyyy-MM-dd HH:mm:dd");
获取当前日期: Date date =new Date();
public class Datedemo {
public static void main(String[] args) {
//获取当前的日期
Date date =new Date();
//转换成是定格式的字符串
SimpleDateFormat simpleDateFormat =new SimpleDateFormat("yyyy-MM-dd HH:mm:dd");
System.out.println(simpleDateFormat.format(date));
//年月日
SimpleDateFormat simpleDateFormat1 =new SimpleDateFormat("yyyy年MM月dd HH:mm:dd");
System.out.println(simpleDateFormat1.format(date));
}
}
Calendar日历类(由于我的网络太差 图片不能放上去 只能放代码)
public class CalendarTest {
public static void main(String[] args) {
/**
* calender是被保护的对象 不能直接创建对象
* 所以需要getInstance()通过该方法生成Calender对象
* Calender日历类 年月日 时分秒日历之间的转换 提供了方法
*/
//创建calender对象
Calendar calender = Calendar.getInstance();
//将给定的日历字段访日Calender对象中
calender.set(Calendar.YEAR,2018);
calender.set(Calendar.MONTH,1);
calender.set(Calendar.DATE,14);
//设置年月日
int year = calender.get(Calendar.YEAR);
int month = calender.get(Calendar.MONTH)+1;
int date = calender.get(Calendar.DATE);
//设置星期
char week =getWeek(calender.get(Calendar.DAY_OF_WEEK));
System.out.println(year+"年"+month+"月"+date+"日"+"是星期"+week);
}
//定义方法 获取星期的汉字
public static char getWeek(int a){
char[] chars ={' ','日','一','二','三','四','五','六'};
return chars[a];
}
}
System类 System.arraycopy
public static void arraycopy(Object src,int srcPos,Object dest,int destPos,int length)
/**
* src:源数组;
* srcPos:源数组要复制的起始位置;
* dest:目的数组;
* destPos:目的数组放置的起始位置;
* length:复制的长度。
* 注意:src and dest都必须是同类型或者可以进行转换类型的数组.
*/
/**
* 现有一个字符数组{'i','t','c','a','s','a'},请使用System类中的arraycopy()方法在控制台输出“itcast”。
* (提示:将[1]号数 组元素复制到最后位置并覆盖原有元素。)
* i t c a s 0 1 2 3 4 src 0 4
* - - - - - - 0 1 2 3 4 5 src 1
* char[] chars = {'i', 't', 'c', 'a', 's', 'a'};
* //将chars中的第2 t个元素复制到目标数组最后一为数组上
* System.arraycopy(chars,1,chars,5,1);
* //遍历目标数组 在控制台输出字符串
* for (int i=0;i<=chars.length;i++){
* System.out.println("最终输出的结果"+chars[i]);
*/