1.String
1.1String 的特点
string:字符串,使用一对引号("")引起来表示
-
String声明为final类,不可被继承
-
String实现了Serializable接口:表示字符串支持序列化,实现Comparable接口,表示String可以比较大小
-
String内部定义了final char[] value用于存储字符串数据
-
String代表不可变字符串序列 简称:不可变
体现:
- 当对字符串重新赋值时,需要重写指定区域赋值,不能使用原有的value
- 对现有的字符串进行连接操作时,需要重写指定区域赋值,不能使用原有的value
- 当调用String的replace()方法修改指定字符或字符串时,也需要重新指定内存区域赋值
-
通过字面量的方式(区别于new)给一个字符串赋值,此时的字符串声明在字符串常量池中
-
字符串常量池中不会存储相同内容的字符串
1.2String对象的创建
//方式一:通过字面量的方式创建
String str = "hello";
//方式二:通过new+构造器的方式创建
//本质上this.value = new char[0];
String s1 = new String();
//this.value = original.value;
String s2 = new String(String original);
//this.value = Arrays.copyOf(value, value.length);
String s3 = new String(char[] a);
String s4 = new String(char[] a,int startIndex,int count);
举例
public static void main(String[] args) {
//通过字面量的方式创建字符串 声明在方法区中字符串的常量池中
String s1="a";
String s2="a";
//通过new——+构造器的方式创建 ,保存的是在堆空间中开辟空间以后对应的地址值
String s3 = new String("a");
String s4 = new String("a");
System.out.println(s1==s2);//true
System.out.println(s1==s3);//false
System.out.println(s1==s4);//false
System.out.println(s2==s3);//false
System.out.println(s3==s4);//false
}
面试题 String s=new String(“abc”)方式创建对象,在内存中创建了几个对象
两个:一个是堆空间中的new结构,另一个是char[]对应的常量池中的数据:“abc”
1.3 字符串的特性举例
public static void main(String[] args) {
String s1="hello";
String s2="word";
String s3="hello"+"word";
String s4="hello"+s2;
String s5=s1+"word";
String s6=s1+s2;
System.out.println(s3==s4);//false
System.out.println(s3==s5);//false
System.out.println(s3==s6);//false
System.out.println(s4==s5);//false
System.out.println(s4==s6);//false
System.out.println(s5==s6);//false
}
结论
- 常量与常量拼接结果在常量池中,且常量池中不会存在内容相同的常量
- 只要其中有一个是变量,结果就在堆中
- 如果拼接的结果调用intern()方法,返回值就是常量池中
public static void main(String[] args) {
String s1="hello";
String s2="word";
String s3="hello"+"word";
String s4="hello"+s2;
String s5=s1+"word";
String s6=s1+s2;
System.out.println(s3==s4);//false
System.out.println(s3==s5);//false
System.out.println(s3==s6);//false
System.out.println(s4==s5);//false
System.out.println(s4==s6);//false
System.out.println(s5==s6);//false
System.out.println(s3==s6.intern());//true
}
易错点
public class Demo3 {
String str = new String("good");
char[] ch = { 't', 'e', 's', 't' };
public void change(String str, char ch[]) {
str = "test ok";
ch[0] = 'b'; }
public static void main(String[] args) {
Demo3 ex = new Demo3();
ex.change(ex.str, ex.ch);
System.out.print(ex.str + " and ");//
System.out.println(ex.ch);
}
}
注意点:引用数据类型传递的是地址值,String是final类型不可变,所有最终结果为good and best
1.4String常用方法
方法名 | 用途 |
---|---|
int length() | 返回字符串的长度: return value.length |
char charAt(int index) | 返回某索引处的字符return value[index] |
boolean isEmpty() | 判断是否是空字符串:return value.length == 0 |
String toLowerCase() | 使用默认语言环境,将 String 中的所有字符转换为小写 |
String toUpperCase() | 使用默认语言环境,将 String 中的所有字符转换为大写 |
String trim() | 返回字符串的副本,忽略前导空白和尾部空白 |
boolean equals(Object obj) | 比较字符串的内容是否相同 |
boolean equalsIgnoreCase(String anotherString) | 与equals方法类似,忽略大小写 |
String concat(String str) | 将指定字符串连接到此字符串的结尾。 等价于用“+” |
int compareTo(String anotherString) | 比较两个字符串的大小 |
String substring(int beginIndex) | 返回一个新的字符串,它是此字符串的从beginIndex开始截取到最后的一个子字符串。 |
String substring(int beginIndex, int endIndex) | 返回一个新字符串,它是此字符串从beginIndex开始截取到endIndex(不包含)的一个子字符串。 |
boolean endsWith(String suffix) | 测试此字符串是否以指定的后缀结束 |
boolean startsWith(String prefix) | 测试此字符串是否以指定的前缀开始 |
boolean startsWith(String prefix, int toffset) | 测试此字符串从指定索引开始的子字符串是否以指定前缀开始 |
boolean contains(CharSequence s) | 当且仅当此字符串包含指定的 char 值序列时,返回 true |
int indexOf(String str) | 返回指定子字符串在此字符串中第一次出现处的索引 |
int indexOf(String str, int fromIndex) | 返回指定子字符串在此字符串中第一次出现处的索引,从指定的索引开始 |
int lastIndexOf(String str) | 返回指定子字符串在此字符串中最右边出现处的索引 |
int lastIndexOf(String str, int fromIndex) | 返回指定子字符串在此字符串中最后一次出现处的索引,从指定的索引开始反向搜索 |
String replace(char oldChar, char newChar) | 返回一个新的字符串,它是通过用 newChar 替换此字符串中出现的所有 oldChar 得到的。 |
String replace(CharSequence target, CharSequence replacement) | 使用指定的字面值替换序列替换此字符串所有匹配字面值目标序列的子字符串。 |
String replaceFirst(String regex, String replacement) | 使 用 给 定 的replacement 替换此字符串匹配给定的正则表达式的第一个子字符串。 |
package com.blb.com.string;
import java.util.Locale;
public class Demo1 {
public static void main(String[] args) {
String s="abcdefg";
System.out.println(s.length());//长度
System.out.println(s.charAt(2));//某处的字符
String s1 = s.toLowerCase();//小写
System.out.println(s1);
String s2 = s1.toUpperCase();//大小
System.out.println(s2);
String a=" hello word ";
System.out.println(a);
System.out.println(a.trim());//去首位空格
String concat = a.concat(s);//连接
System.out.println(concat);
String s4="abcd";
String s5="abeg";
System.out.println(s4.compareTo(s5));//比较大小 排序可以用
String substring = s.substring(1);
System.out.println(substring);//子串
String substring1 = s.substring(1, 5);
System.out.println(substring1);//子串
System.out.println("======================================");
System.out.println(s.startsWith("a"));//字符串s是否以字符串a开始
System.out.println(s.endsWith("g"));//字符串s以字符串g结尾
System.out.println(s.concat("abc"));//字符串s是否包含abc
String t="aaaaaaaaaaaa";
System.out.println(t.indexOf("a"));//字符串t中a出现的索引
System.out.println(t.indexOf("b"));
System.out.println(t.lastIndexOf("a"));//字符串t中a最后一次出现的索引
System.out.println("==========================");
String str="abcabc";
String replace = str.replace('a', 'X');
System.out.println(replace);
String replace1 = str.replace("ab", "X");
System.out.println(replace1);
String s3 = str.replaceFirst("ab", "X");
System.out.println(s3);
String[] as = str.split("a");//str字符串中用字符串a进行分隔
System.out.println(as.length);
for(String ass:as)
{
System.out.println(ass);
}
}
}
1.5String与基本数据类型的转换
string–>基本数据类型、包装类 使用静态方法:parseXXX(str)
基本数据类型、包装类–>string:调用String的重载valueof方法
public class Demo2 {
public static void main(String[] args) {
String s="111";
int i = Integer.parseInt(s);
System.out.println(i);
String s1 = String.valueOf(i);
System.out.println(s1);
}
}
1.6String与char[]之间的转换
- 字符数组 --> 字符串
String 类的构造器:String(char[]) 和 String(char[],int offset,int length) 分别用字符数组中的全部字符和部分字符创建字符串对象。 - 字符串 --> 字符数组
public char[] toCharArray():将字符串中的全部字符存放在一个字符数组中的方法。
public void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin):提供了将指定索引范围内的字符串存放到数组中的方法。
public class Demo3 {
public static void main(String[] args) {
String s="12345";
char[] chars = s.toCharArray();
for(char c:chars)
{
System.out.println(c);
}
String s1 = new String(chars);
System.out.println(s1);
}
}
1.7String与字节数组之间的转换
- 字节数组 -->字符串
String(byte[]):通过使用平台的默认字符集解码指定的 byte 数组,构造一个新的 String。
String(byte[],int offset,int length) :用指定的字节数组的一部分,即从数组起始位置offset开始取length个字节构造一个字符串对象。 - 字符串 --> 字节数组
public byte[] getBytes() :使用平台的默认字符集将此 String 编码为byte 序列,并将结果存储到一个新的 byte 数组中。
public byte[] getBytes(String charsetName) :使用指定的字符集将 此 String 编码到 byte 序列,并将结果存储到新的 byte 数组。
说明:解码时的字符集应与编码时的字符集一直
2.关于StringBuffer和StringBuild的使用
2.1String、StringBuffer、StringBuilder的区别
- String:不可变的字符序列:底层使用char[]存储
- StringBuffer:可变的字符序列:线程安全效率低,底层使用char[]存储
- StringBuilder:可变的字符序列:线程不安全效率高,底层使用char[]存储
StringBuffer和StringBuilder默认底层字符数组的长度为16,如果添加的数据底层数组盛不下,那就需要扩容底层数组,默认情况下,默认情况下扩容到原来容量的一倍,同时将原有数组的元素赋值到新的数组中
建议在开发中使用StringBuffer(int capacity)或StringBuilder(int capacity)
2.2常用方法
方法 | 使用说明 |
---|---|
StringBuffer append(xxx) | 提供了很多的append()方法,用于进行字符串拼接 |
StringBuffer delete(int start,int end) | 删除指定位置的内容 |
StringBuffer replace(int start, int end, String str) | 把[start,end)位置替换为str |
StringBuffer insert(int offset, xxx) | 在指定位置插入xxx |
StringBuffer reverse() | 把当前字符序列逆转 |
indexOf(String str) | 第一次出现的位置 |
substring(int start,int end) | 字串 |
length() | 长度 |
charAt(int n ) | 得到某处的字符串 |
setCharAt(int n ,char ch) | 设置某处的字符串 |
public static void main(String[] args) {
StringBuffer stringBuffer=new StringBuffer("abcd");
stringBuffer.append("12");
System.out.println(stringBuffer);
stringBuffer.delete(1,2);
System.out.println(stringBuffer);
stringBuffer.replace(0,1,"III");
System.out.println(stringBuffer);
stringBuffer.reverse();
System.out.println(stringBuffer);
System.out.println(stringBuffer.substring(3));
System.out.println(stringBuffer.length());
System.out.println(stringBuffer.substring(2));
}
三种执行效率由高到低:StringBuilder,StringBuffer,String
练习题
package com.atguigu.java;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.junit.Test;
/*
* 1.模拟一个trim方法,去除字符串两端的空格。
*
* 2.将一个字符串进行反转。将字符串中指定部分进行反转。比如将“abcdefg”反转为”abfedcg”
*
* 3.获取一个字符串在另一个字符串中出现的次数。
比如:获取“ab”在 “cdabkkcadkabkebfkabkskab”
中出现的次数
4.获取两个字符串中最大相同子串。比如:
str1 = "abcwerthelloyuiodef“;str2 = "cvhellobnm"//10
提示:将短的那个串进行长度依次递减的子串与较长
的串比较。
5.对字符串中字符进行自然顺序排序。"abcwerthelloyuiodef"
提示:
1)字符串变成字符数组。
2)对数组排序,选择,冒泡,Arrays.sort(str.toCharArray());
3)将排序后的数组变成字符串。
*/
public class StringExer {
// 第1题
public String myTrim(String str) {
if (str != null) {
int start = 0;// 用于记录从前往后首次索引位置不是空格的位置的索引
int end = str.length() - 1;// 用于记录从后往前首次索引位置不是空格的位置的索引
while (start < end && str.charAt(start) == ' ') {
start++;
}
while (start < end && str.charAt(end) == ' ') {
end--;
}
if (str.charAt(start) == ' ') {
return "";
}
return str.substring(start, end + 1);
}
return null;
}
// 第2题
// 方式一:
public String reverse1(String str, int start, int end) {// start:2,end:5
if (str != null) {
// 1.
char[] charArray = str.toCharArray();
// 2.
for (int i = start, j = end; i < j; i++, j--) {
char temp = charArray[i];
charArray[i] = charArray[j];
charArray[j] = temp;
}
// 3.
return new String(charArray);
}
return null;
}
// 方式二:
public String reverse2(String str, int start, int end) {
// 1.
String newStr = str.substring(0, start);// ab
// 2.
for (int i = end; i >= start; i--) {
newStr += str.charAt(i);
} // abfedc
// 3.
newStr += str.substring(end + 1);
return newStr;
}
// 方式三:推荐 (相较于方式二做的改进)
public String reverse3(String str, int start, int end) {// ArrayList list = new ArrayList(80);
// 1.
StringBuffer s = new StringBuffer(str.length());
// 2.
s.append(str.substring(0, start));// ab
// 3.
for (int i = end; i >= start; i--) {
s.append(str.charAt(i));
}
// 4.
s.append(str.substring(end + 1));
// 5.
return s.toString();
}
@Test
public void testReverse() {
String str = "abcdefg";
String str1 = reverse3(str, 2, 5);
System.out.println(str1);// abfedcg
}
// 第3题
// 判断str2在str1中出现的次数
public int getCount(String mainStr, String subStr) {
if (mainStr.length() >= subStr.length()) {
int count = 0;
int index = 0;
// while((index = mainStr.indexOf(subStr)) != -1){
// count++;
// mainStr = mainStr.substring(index + subStr.length());
// }
// 改进:
while ((index = mainStr.indexOf(subStr, index)) != -1) {
index += subStr.length();
count++;
}
return count;
} else {
return 0;
}
}
@Test
public void testGetCount() {
String str1 = "cdabkkcadkabkebfkabkskab";
String str2 = "ab";
int count = getCount(str1, str2);
System.out.println(count);
}
@Test
public void testMyTrim() {
String str = " a ";
// str = " ";
String newStr = myTrim(str);
System.out.println("---" + newStr + "---");
}
// 第4题
// 如果只存在一个最大长度的相同子串
public String getMaxSameSubString(String str1, String str2) {
if (str1 != null && str2 != null) {
String maxStr = (str1.length() > str2.length()) ? str1 : str2;
String minStr = (str1.length() > str2.length()) ? str2 : str1;
int len = minStr.length();
for (int i = 0; i < len; i++) {// 0 1 2 3 4 此层循环决定要去几个字符
for (int x = 0, y = len - i; y <= len; x++, y++) {
if (maxStr.contains(minStr.substring(x, y))) {
return minStr.substring(x, y);
}
}
}
}
return null;
}
// 如果存在多个长度相同的最大相同子串
// 此时先返回String[],后面可以用集合中的ArrayList替换,较方便
public String[] getMaxSameSubString1(String str1, String str2) {
if (str1 != null && str2 != null) {
StringBuffer sBuffer = new StringBuffer();
String maxString = (str1.length() > str2.length()) ? str1 : str2;
String minString = (str1.length() > str2.length()) ? str2 : str1;
int len = minString.length();
for (int i = 0; i < len; i++) {
for (int x = 0, y = len - i; y <= len; x++, y++) {
String subString = minString.substring(x, y);
if (maxString.contains(subString)) {
sBuffer.append(subString + ",");
}
}
System.out.println(sBuffer);
if (sBuffer.length() != 0) {
break;
}
}
String[] split = sBuffer.toString().replaceAll(",$", "").split("\\,");
return split;
}
return null;
}
// 如果存在多个长度相同的最大相同子串:使用ArrayList
// public List<String> getMaxSameSubString1(String str1, String str2) {
// if (str1 != null && str2 != null) {
// List<String> list = new ArrayList<String>();
// String maxString = (str1.length() > str2.length()) ? str1 : str2;
// String minString = (str1.length() > str2.length()) ? str2 : str1;
//
// int len = minString.length();
// for (int i = 0; i < len; i++) {
// for (int x = 0, y = len - i; y <= len; x++, y++) {
// String subString = minString.substring(x, y);
// if (maxString.contains(subString)) {
// list.add(subString);
// }
// }
// if (list.size() != 0) {
// break;
// }
// }
// return list;
// }
//
// return null;
// }
@Test
public void testGetMaxSameSubString() {
String str1 = "abcwerthelloyuiodef";
String str2 = "cvhellobnmiodef";
String[] strs = getMaxSameSubString1(str1, str2);
System.out.println(Arrays.toString(strs));
}
// 第5题
@Test
public void testSort() {
String str = "abcwerthelloyuiodef";
char[] arr = str.toCharArray();
Arrays.sort(arr);
String newStr = new String(arr);
System.out.println(newStr);
}
}
3.日期时间API
3.1. java.lang.System类
System类提供的public static long currentTimeMillis()用来返回当前时间与1970年1月1日0时0分0秒之间以毫秒为单位的时间差。
此方法适于计算时间差。
3.2. java.util.Date类
表示特定的瞬间,精确到毫秒
1.构造器:
- Date():使用无参构造器创建的对象可以获取本地当前时间。
- Date(long date):创建指定毫秒数的date对象
- 常用方法
- getTime():返回自 1970 年 1 月 1 日 00:00:00 GMT 以来此 Date 对象表示的毫秒数。
- toString():把此 Date 对象转换为以下形式的 String: dow mon dd hh:mm:ss zzz yyyy 其中: dow 是一周中的某一天 (Sun, Mon, Tue, Wed, Thu, Fri, Sat),zzz是时间标准。
public static void main(String[] args) {
Date date = new Date();
System.out.println(date.toString());
long time = date.getTime();//时间撮
System.out.println(time);
Date date1 = new Date(time);
System.out.println(date1);
}
3.3. java.text.SimpleDateFormat类
- Date类的API不易于国际化,大部分被废弃了,java.text.SimpleDateFormat类是一个不与语言环境有关的方式来格式化和解析日期的具体类。
- 它允许进行格式化:日期->文本、解析:文本->日期
- 格式化:
- SimpleDateFormat() :默认的模式和语言环境创建对象
- public SimpleDateFormat(String pattern):该构造方法可以用参数pattern指定的格式创建一个对象,该对象调用:public String format(Date date):方法格式化时间对象date
- 解析:
- public Date parse(String source):从给定字符串的开始解析文本,以生成一个日期。
3.4. java.util.Calendar(日历)类
- Calendar是一个抽象基类,主用用于完成日期字段之间相互操作的功能。
- 获取Calendar实例的方法
- 使用Calendar.getInstance()方法
- 调用它的子类GregorianCalendar的构造器。
- 一个Calendar的实例是系统时间的抽象表示,通过get(int field)方法来取得想要的时间信息。比如YEAR、MONTH、DAY_OF_WEEK、HOUR_OF_DAY 、MINUTE、SECOND
- public void set(int field,int value)
- public void add(int field,int amount)
- public final Date getTime()
- public final void setTime(Date date)
- 注意: 获取月份时:一月是0,二月是1,以此类推,12月是11 获取星期时:周日是1,周二是2 ,周六是7
public static void main(String[] args) {
Calendar instance = Calendar.getInstance();
instance.setTime(new Date());
int year = instance.get(Calendar.YEAR);
System.out.println(year);
int month = instance.get(Calendar.MONTH);
System.out.println(month);
int day = instance.get(Calendar.DAY_OF_MONTH);
System.out.println(day);
instance.set(Calendar.DAY_OF_WEEK,1);
int day1 = instance.get(Calendar.DAY_OF_WEEK);
System.out.println(day1);
Date time = instance.getTime();
System.out.println(time);
}
2.5 LocalDate、LocalTime、LocalDateTime
LocalDate、LocalTime、LocalDateTime 类是其中较重要的几个类,它们的实例是不可变的对象,分别表示使用 ISO-8601日历系统的日期、时间、日期和时间。它们提供了简单的本地日期或时间,并不包含当前的时间信息,也不包含与时区相关的信息。
- LocalDate代表IOS格式(yyyy-MM-dd)的日期,可以存储 生日、纪念日等日期。
- LocalTime表示一个时间,而不是日期。
- LocalDateTime是用来表示日期和时间的,这是一个最常用的类之一。
2.6瞬时:Instant
- Instant:时间线上的一个瞬时点。 这可能被用来记录应用程序中的事件时间戳。
- 在处理时间和日期的时候,我们通常会想到年,月,日,时,分,秒。然而,这只是时间的一个模型,是面向人类的。第二种通用模型是面向机器的,或者说是连续的。在此模型中,时间线中的一个点表示为一个很大的数,这有利于计算机处理。在UNIX中,这个数从1970年开始,以秒为的单位;同样的,在Java中,也是从1970年开始,但以毫秒为单位。
- java.time包通过值类型Instant提供机器视图,不提供处理人类意义上的时间单位。Instant表示时间线上的一点,而不需要任何上下文信息,例如,时区。概念上讲,它只是简单的表示自1970年1月1日0时0分0秒(UTC)开始的秒数。因为java.time包是基于纳秒计算的,所以Instant的精度可以达到纳秒级。
- (1 ns = 10-9 s) 1秒 = 1000毫秒 =106微秒=109纳秒
3.java比较器
在Java中经常会涉及到对象数组的排序问题,那么就涉及到对象之间的比较问题。
Java实现对象排序的方式有两种:
- 自然排序:java.lang.Comparable
- 定制排序:java.util.Comparator
3.1自然排序Comparable
3.1.1Comparable
- 像String、包装类等实现了Comparable接口,重写了compareTo()方法,给出了比较两个对象大小的方法
- 重写compareTo()的规则: 如果当前对象this大 于形参对象obj,则返回正整数,如果当前对象this小于形参对象obj,则返回负整数,如果当前对象this等于形参对象obj,则返回零(默认从小到大排序)
- 对于自定义类来说,如果需要排序,文明可以让自定义类实现Comparable接口,重写compareTo()方法进行确定排序规则
举例
实体类good.java
package com.blb.com.compare;
public class Good implements Comparable{
private String name;
private double piece;
public Good() {
}
public Good(String name, double piece) {
this.name = name;
this.piece = piece;
}
@Override
public String toString() {
return "Good{" +
"name='" + name + '\'' +
", piece=" + piece +
'}';
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getPiece() {
return piece;
}
public void setPiece(double piece) {
this.piece = piece;
}
@Override
public int compareTo(Object o)
{
if(o instanceof Good)
{
Good good=(Good)o;
if(this.piece>good.piece)
{
return 1;
}
else if(this.piece<good.piece)
{
return -1;
}
return 0;
}
return 0;
}
}
测试类
public class Text {
public static void main(String[] args) {
Good[] goods = new Good[4];
goods[0]=new Good("a",23.6);
goods[1]=new Good("b",53.6);
goods[2]=new Good("c",37.7);
goods[3]=new Good("d",3.4);
Arrays.sort(goods);
System.out.println(Arrays.toString(goods));
}
}
public class Text {
public static void main(String[] args) {
Good[] goods = new Good[4];
goods[0]=new Good("a",23.6);
goods[1]=new Good("b",53.6);
goods[2]=new Good("c",37.7);
goods[3]=new Good("d",3.4);
Arrays.sort(goods);
System.out.println(Arrays.toString(goods));
}
}
3.2定制排序
3.2.1背景
当元素的类型没有实现java.lang.Comparable接口而又不方便修改代码,或者实现了java.lang.Comparable接口的排序规则不适合当前的操作,那么可以考虑使用 Comparator 的对象来排序,强行对多个对象进行整体排序的比较。
3.2.2如何使用
重写compare(Object o1,Object o2)方法,比较o1和o2的大小:如果方法返回正整数,则表示o1大于o2;如果返回0,表示相等;返回负整数,表示o1小于o2。
实体类
Good1.java
public class Good1 {
private String name;
private double piece;
public Good1() {
}
public Good1(String name, double piece) {
this.name = name;
this.piece = piece;
}
@Override
public String toString() {
return "Good{" +
"name='" + name + '\'' +
", piece=" + piece +
'}';
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getPiece() {
return piece;
}
public void setPiece(double piece) {
this.piece = piece;
}
}
测试
public class Text2 {
public static void main(String[] args) {
Good1[] goods = new Good1[4];
goods[0]=new Good1("a",23.6);
goods[1]=new Good1("b",53.6);
goods[2]=new Good1("c",37.7);
goods[3]=new Good1("d",37.7);
Arrays.sort(goods, new Comparator<Good1>() {
@Override
public int compare(Good1 o1, Good1 o2) {
if(o1 instanceof Good1 && o2 instanceof Good1 )
{
if(o1.getPiece()!=o2.getPiece())
{
return (int) (o1.getPiece()-o2.getPiece());
}
else return o1.getName().compareTo(o2.getName());
}
return 0;
}
});
for(Good1 good1:goods)
{
System.out.println(good1);
}
}
}