set集合可以用来去重,并且set集合的add方法返回的是boolean值,可以用来做是否有重复元素的逻辑判断

 

 

public static void main(String[] args) {
        ListNode node5 = new ListNode(1, null);
        ListNode node4 = new ListNode(1, node5);
        ListNode node3 = new ListNode(1, node4);
        ListNode node2 = new ListNode(1, node3);
        ListNode node1 = new ListNode(1, node2);
        node5.next=node2;
        System.out.println(hasCycle(node1));

    }
    public static boolean hasCycle(ListNode head){
       Set<ListNode> set = new HashSet<>();
       while (head!=null){
           if (!set.add(head)){
               return true;
           }
           head=head.next;
       }
       return false;
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. Java工具概述 很多人初学程序时,总是在想,那么多的算法该怎么写呀?那么多的数据结构都不熟悉,该怎么实现呀?总是担心英语不好程序学不精通,数学不好写程序无法达到巅峰。学的程序越多,不懂的知识越多。 这种想法很正常,毕竟传统的计算机教育都是从原理开始的,科学原理一般理解起来还能够接受,但是实现起来都很难。计算机发展到了今天,能成为原理的基本已经有人实现了,今天我们学习任何知识都是站在巨人的肩膀上,只要理解程序运行原理,算法的功能即可。底层的各种算法,各种数据结构已经被“巨人们”实现了,一般都放在程序开发类库中,程序员开发过程中直接调用即可。 比如现在木工家具,已经不存在自己砍树、加工木板、一点一点的雕刻了,如果需要木板,直接到市场上购买,需要各种图案,直接到市场购买,木工的工作就是把这些木板修理一下组装成一套家具即可。“工欲善其事,必先利其器”,在Java程序开发过程中,很多算法(比如:MD5加密算法)、很多数据结构(比如链表LinkedList)已经实现并且大多放在类库的java.util包中,程序员只需要了解各种工具的功能就可以直接调用。比如对一个数组进行排序,程序员可以写如下排序算法: 代码演示:数组排序 public static void sort(int[] arrs) { boolean isSwap = false; for (int i = 0; i < arrs.length - 1; i++) { isSwap = false; for (int j = arrs.length - 1; j > i; j--) { if (arrs[j - 1] > arrs[j]) { isSwap = true; int tmp = arrs[j - 1]; arrs[j - 1] = arrs[j]; arrs[j] = tmp; } } } } 该排序算法中只能对整数数组排序,还有其他数据类型呢?就需要重载很多方法进行排序操作。而在Java类库中有一个Arrays类的sort方法已经实现各种数据类型的排序算法。程序员只需要调用该类的方法即可。 代码演示:Arrays实现排序 public static void main(String[] args) { int[] ages={23, 45,12,76,34,56,24}; Arrays.sort(ages); for (int i = 0; i < ages.length; i++) { System.out.println(ages[i]); } } 在Java开发类库中,提供了很多工具类,我们即将学习最常见的工具类,比如对日期的操作,对集合的操作等。具体更多的工具类,请参考JavaDoc文档。 2. java.util.Date类 Date类包装了毫秒,毫秒表示自1970年1月1日00:00:00 GMT开始到现在经过的毫秒数。该类的大部分构造器和方法都已经过时,但是该类使用非常方便,因此目前使用还很普遍,该类的另一个主要功能是,在数据库操作中,它允许将毫秒表示为SQL DATE,是数据库操作中java.sql.Date的父类。关于数据库操作,将在第八章开始讲解。 该类目前推荐使用的构造方法有两个: 构造方法 说明 Date() 按照当前系统时间构造一个Date对象。 Date(long date) 按照给定的时间毫秒构造一个 Date 对象。 表1 java.util.Date类的构造方法 主要的方法有: 返回 异常 说明 boolean after(Date when) 测试当前对象表示的时间是否在指定时间之后。 boolean before(Date when) 测试当前对象表示的时间是否在指定时间之前。 long getTime() 返回当前对象对应的时间毫秒 void setTime(long time) 设置时间 表2 java.util.Date类的主要方法 代码演示:时间设置 public class Demo2 { public static void main(String[] args) { Date date=new Date(); ① date.setTime((10L*365+2)*24*60*60*1000); ② System.out.println(date); ③ } } 代码解析: ① 构造当前系统时间。 ② 设置时间为1970年后10年的时间的毫秒,10年间有2个闰年,10年的天数是:10*365+2,10L表示当前是long类型。 ③ 调用Date的toString方法输出结果。 代码输出结果: Tue Jan 01 08:00:00 CST 1980 Q 老师,时间毫秒从1970年1月1日0:00.000开始计算,上面示例中10年后应该是1980年1月1日0:00.000,为什么输出结果是:1980年1月1日 8:00呢? A java.util.Date类型表示的是GMT时间,本身输出是国际化输出,由于中国处于东八区时间,因此输出结果是早上8点。而Date的其他构造方法和普通方法的API都不容易实现国际化,因此目前Date类的大多数方法都被标识为过时,表示更灵活的时间类请参考java.util.Calendar。 Date的输出结果是按照国际通用格式输出的,而中国更习惯于“年-月-日”的形式输出,这种特殊格式的输出需要用到Java格式化工具。 3. 格式化工具 格式化的目的是把一个对象以不同的格式表示,以满足不同环境对格式的要求,比如:前面学习的Date对象实质是一个以毫秒表示的时间,但是在不同的国家和地区表示方式不一样。那么就需要对Date进行格式化处理。接下来主要学习Java对日期时间的格式化和对数字的格式化处理。  日期时间格式化 Date类中包含了日期和时间,在Java编程中,日期通常指年、月、日,时间则指时、分、秒、毫秒。Java对Date进行格式化使用java.text.DateFormat类。在格式表示中,经常采用4种格式,这四种格式被定义为DateFormat类的常量。下表所示: 格式 说明 SHORT 以最短的格式表示,比如:09-8-20 MEDIUM 比short完整表示方式,比如:2009-8-20 LONG 比medium更完整的表示方式,比如:2009年8月20日 FULL 综合的表示方式,比如:2009年8月20日 星期四 表3 DateFormat的四种表示格式 因为不同国家地区需要格式化的结果不同,Locale类的对象表示了不同的区域,Locale定义目前全世界几乎所有地区的对象表示,比如: 格式 说明 Locale.CHINA 中国地区 Locale.US 美国地区 Locale.FRANCE 法国地区 Locale.CANADA 加拿大地区 表4 Locale对部分地区的表示 DateFormat是一个抽象类,不能直接实例化,可以使用下表中的静态方法得到DateFormat的对象。 方法 说明 getDateInstance() 返回默认地区,默认格式的关于日期的DateFormat对象。 getDateInstance(int) 返回指定格式下,默认地区的关于日期的DateFormat对象。 getDateInstance(int, Locale) 返回指定格式,指定地区的关于日期的DateFormat对象。 getTimeInstance() 返回默认地区,默认格式的关于时间的DateFormat对象。 getTimeInstance (int) 返回默认地区,指定格式的关于时间的DateFormat对象。 getTimeInstance (int, Locale) 返回指定地区,指定格式的关于时间的DateFormat对象。 getDateTimeInstance() 返回默认地区、默认日期格式、默认时间格式的关于日期和时间的DateFormat对象。 getDateTimeInstance (int,int) 返回默认地区、指定日期格式、指定时间格式的关于日期和时间的DateFormat对象。 getDateTimeInstance (int,int, Locale) 返回指定地区、指定日期格式、指定时间格式的关于日期和时间的DateFormat对象。 表5 获取DateFormat对象的静态方法 调用DateFormat对象的format方法可以把Date对象转换成为指定格式的String类型数据。比如: Date today=new Date(); DateFormat df=DateFormat.getDateInstance(DateFormat.FULL,Locale.CHINA); String result=df.format(today); 代码演示:日期的不同格式 import java.text.DateFormat; import java.util.Date; import java.util.Locale; public class Demo3 { public static void main(String[] args) { Date today = new Date(); Locale[] locals = new Locale[] { Locale.CHINA, Locale.US, Locale.UK }; for (int i = 0; i < locals.length; i++) { DateFormat df1 = DateFormat.getDateInstance(DateFormat.SHORT, locals[i]); DateFormat df2 = DateFormat.getDateInstance(DateFormat.MEDIUM, locals[i]); DateFormat df3 = DateFormat.getDateInstance(DateFormat.LONG, locals[i]); DateFormat df4 = DateFormat.getDateInstance(DateFormat.FULL, locals[i]); System.out.println(locals[i].getDisplayCountry() + "的日期形式:"); System.out.println("\tShort格式:" + df1.format(today)); System.out.println("\tMedium格式:" + df2.format(today)); System.out.println("\tLong格式:" + df3.format(today)); System.out.println("\tFull格式:" + df4.format(today)); } } } 代码输出结果: 中国的日期形式: Short格式:09-8-20 Medium格式:2009-8-20 Long格式:2009年8月20日 Full格式:2009年8月20日 星期四 美国的日期形式: Short格式:8/20/09 Medium格式:Aug 20, 2009 Long格式:August 20, 2009 Full格式:Thursday, August 20, 2009 英国的日期形式: Short格式:20/08/09 Medium格式:20-Aug-2009 Long格式:20 August 2009 Full格式:20 August 2009 在Java程序设计过程中,对应日期和时间的格式化,还有一个简单的格式化方式,就是java.text.SimpleDateFormat,该类中用字符串指定日期和时间的格式,字符串中的字符称为模式字符,模式字符区分大小写。常见的模式字符定义如下: 字母 日期或时间元素 y 年 M 年中的月份 w 年中的周数 W 月份中的周数 D 年中的天数 d 月份中的天数 F 月份中的星期 E 星期中的天数 a Am/pm 标记 H 一天中的小时数(0-23) k 一天中的小时数(1-24) K am/pm 中的小时数(0-11) h am/pm 中的小时数(1-12) m 小时中的分钟数 s 分钟中的秒数 S 毫秒数 表6 模式字符串 例如: 日期和时间模式 结果 "EEE, MMM d, ''yy" Wed, Jul 4, '01 "h:mm a" 12:08 PM "yyyy-MM-dd HH:mm:ss" 2009-8-20 14:22 "yyyy年MM月dd HH:mm:ss" 2009年8月20 14:22:23 表7 模式字符串示例 SimpleDateFormat是DateFormat的子类,用法和DateFormat类基本一致,主要使用format()方法。 代码演示:SimpleDateFormat进行日期转换 import java.text.SimpleDateFormat; import java.util.Date; public class Demo4 { public static void main(String[] args) { Date today = new Date(); SimpleDateFormat format1 = new SimpleDateFormat("yyyy-MM-dd"); SimpleDateFormat format2 = new SimpleDateFormat("yyyy年MM月dd HH:mm:ss"); SimpleDateFormat format3 = new SimpleDateFormat("HH:mm:ss"); SimpleDateFormat format4 = new SimpleDateFormat("yyyy"); System.out.println(format1.format(today)); System.out.println(format2.format(today)); System.out.println(format3.format(today)); System.out.println(format4.format(today)); } } 代码输出结果: 2009-08-20 2009年08月20 14:25:58 14:25:58 2009 在程序设计时,界面上用户输入的基本上都是字符串,如果字符串输入一个出生年月,如何把该字符串转换成Date类型呢?可以使用SimpleDateFormat的parse()方法。 代码演示:SimpleDateFormat解析日期 import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; public class Demo5 { public static void main(String[] args) { String birthday="1980-04-16"; SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd"); try { Date bir=format.parse(birthday); System.out.println(bir); } catch (ParseException e) { ① // TODO Auto-generated catch block e.printStackTrace(); } } } 代码解析: ① 用SimpleDateFormat解析日期的时候需要处理其中的ParseException异常。  数字格式化 对数字的格式化,在程序处理中也是非常常用的,数字格式化主要对小数点位数,表示的形式(比如:百分数表示)等格式处理。 NumberFormat 是所有数格式的抽象基类。此类提供格式化和解析数的接口。若要格式化当前Locale的数,可使用其中一个方法: myString = NumberFormat.getInstance().format(myNumber); 若要格式化不同 Locale 的日期,可在调用getInstance方法时指定它。 NumberFormat nf = NumberFormat.getInstance(Locale.FRENCH); 方法 说明 getInstance() 获取常规数格式。可以指定Local参数。 getNumberInstance() 获取常规数格式。可以指定Local参数。 getIntegerInstance() 获取整数数格式。可以指定Local参数。 getCurrencyInstance () 获取货币数格式。可以指定Local参数。格式化后的数据前面会有一个货币符号,比如:“¥” getPercentInstance() 获取显示百分比的格式。可以指定Local参数。比如:小数 0.53 将显示为 53%。 表8 获取NumberFormat对象 代码演示:NumberFormat进行数字格式化 import java.text.DecimalFormat; import java.text.NumberFormat; import java.util.Locale; public class Demo6 { public static void main(String[] args) { double mynum1 = 230456789; double mynum2 = 0.23; NumberFormat nf1 = NumberFormat.getInstance(Locale.CHINA); NumberFormat nf2 = NumberFormat.getCurrencyInstance(Locale.CHINA); NumberFormat nf3 = NumberFormat.getCurrencyInstance(Locale.US); NumberFormat nf4 = NumberFormat.getPercentInstance(); System.out.println(nf1.format(mynum1)); System.out.println(nf2.format(mynum1)); System.out.println(nf3.format(mynum1)); System.out.println(nf4.format(mynum2)); } } 代码输出结果: 230,456,789 ¥230,456,789.00 $230,456,789.00 23% 关于更复杂的数字格式化,可以使用java.text.DecimalFormat进行处理,该类通过模式字符串对数字格式化。 代码演示:DecimalFormat进行数字格式化 import java.text.DecimalFormat; public class Demo7 { public static void main(String[] args) { int num1=1234567; double num2=0.126543; DecimalFormat df1=new DecimalFormat("#,###"); ① DecimalFormat df2=new DecimalFormat("#.00"); ② DecimalFormat df3=new DecimalFormat("00.#"); ③ DecimalFormat df4=new DecimalFormat("0.##E0"); ④ DecimalFormat df5=new DecimalFormat("0.##%"); ⑤ System.out.println(df1.format(num1)); System.out.println(df2.format(num2)); System.out.println(df3.format(num2)); System.out.println(df4.format(num1)); System.out.println(df5.format(num2)); } } 代码解析: ① #:代表一个位置数字,如果该位置数字不存在,则省略不显示。 ,:代表数字中的分隔符,此示例用三位分隔一次。 ② 0:代表一个数字位置,如果该位置不存在,则用0来补充。小数中多余部分四舍五入。 .:表示小数点。 #:当前位置是0,则省略不显示。 ③ #:小数部分只显示1位小数,并且进行四舍五入。 ④ E:科学计数法。 ⑤ %:用百分数表示数字。 代码输出结果: 1,234,567 .13 00.1 1.23E6 12.65% 4. java.util.Calendar Calendar类是一个抽象类,它为特定的诸如YEAR、MONTH、DAY_OF_MONTH、HOUR等日历字段之间的转换和操作日历字段(例如获得下星期的日期)提供了丰富的方法。并且可以非常方便的与Date类型进行相互转换。 使用静态方法getInstance()和getInstance(Locale locale)获取Calendar对象。Calendar定义了很多表示日期时间中各个部分的常量字段。 返回 字段 说明 static int AM 指示从午夜到中午之前这段时间的 AM_PM 字段。 static int DATE get 和 set 的字段,指示一个月中的某天。 static int DAY_OF_MONTH get 和 set 的字段,指示一个月中的某天。 static int DAY_OF_WEEK get 和 set 的字段,指示一个星期中的某天。 static int DAY_OF_YEAR get 和 set 的字段,指示当前年中的天数。 static int HOUR get 和 set 的字段,指示上午或下午的小时。 static int HOUR_OF_DAY get 和 set 的字段,指示一天中的小时。 static int MINUTE get 和 set 的字段,指示一小时中的分钟。 static int MONTH 指示月份的 get 和 set 的字段。 static int PM 指示从中午到午夜之前这段时间的 AM_PM 字段。 static int SECOND get 和 set 的字段,指示一分钟中的秒。 static int WEEK_OF_MONTH get 和 set 的字段,指示当前月中的星期数。 static int WEEK_OF_YEAR get 和 set 的字段,指示当前年中的星期数。 static int YEAR 表示年的 get 和 set 的字段。 表9 Calendar类中的日期字段 Calendar类提供了丰富的操作方法,可以单独对年、月、日、时、分、秒等字段单独读取,也可以对星期设置,常用方法如下: 返回 方法 说明 void add(int field, int amount) 根据日历的规则,为给定的日历字段添加或减去指定的时间量。 boolean after(Object when) 判断此 Calendar 表示的时间是否在指定 Object 表示的时间之后,返回判断结果。 boolean before(Object when) 判断此 Calendar 表示的时间是否在指定 Object 表示的时间之前,返回判断结果。 int get(int field) 返回给定日历字段的。 int getActualMaximum(int field) 给定此 Calendar 的时间返回指定日历字段可能拥有的最大。 int getActualMinimum(int field) 给定此 Calendar 的时间返回指定日历字段可能拥有的最小。 Date getTime() 返回一个表示此 Calendar 时间(从历元至现在的毫秒偏移量)的 Date 对象。 long getTimeInMillis() 返回此 Calendar 的时间,以毫秒为单位。 void set(int field, int value) 将给定的日历字段设置为给定。 void set(int year, int month, int date) 设置日历字段 YEAR、MONTH 和 DAY_OF_MONTH 的。 void set(int year, int month, int date, int hourOfDay, int minute) 设置日历字段 YEAR、MONTH、DAY_OF_MONTH、HOUR_OF_DAY 和 MINUTE 的。 void set(int year, int month, int date, int hourOfDay, int minute, int second) 设置字段 YEAR、MONTH、DAY_OF_MONTH、HOUR、MINUTE 和 SECOND 的。 void setTime(Date date) 使用给定的 Date 设置此 Calendar 的时间。 void setTimeInMillis(long millis) 用给定的 long 设置此 Calendar 的当前时间。 表10 Calendar类常用方法 代码演示:Calendar的使用 import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.Locale; public class Demo8 { public static void main(String[] args) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Calendar cale = Calendar.getInstance(); cale.set(2009, 8, 20);// 年月日同时设置 ① cale.set(Calendar.DAY_OF_WEEK, 2); ② Date date1 = cale.getTime(); ③ System.out.println(sdf.format(date1)); cale.set(Calendar.MONTH, 3); ④ cale.set(Calendar.DAY_OF_MONTH, 28); ⑤ cale.set(Calendar.YEAR, 1978); ⑥ Date date2 = cale.getTime(); System.out.println(sdf.format(date2)); } } 代码解析: ① 可以使用set方法对年月日时分秒同时设置。 ② 把天定位到星期一,Calendar中认为第一天是星期天,设置2就是星期一。 ③ Calendar类型转换为日期时间等价的Date类型。 ④ 单独设置月。 ⑤ 单独设置日。 ⑥ 单独设置年。 代码输出结果: 2009-09-21 17:21:37 1978-04-28 17:21:37 Q 老师,为什么通过Calendar设置月与输出差1个月? A 不是差一个月,而是在Calendar中对月份的计算是从0开始的,因此设置月份11其实就是中国的十二月。 5. Java对集合的操作 Java中学习了集合的操作,比如:排序、搜索等,Java中用java.util.Arrays对数组操作,使用java.util.Collections对集合框架中List操作。他们都是工具类,类中的方法全部都是静态方法。  Arrays中的方法 1. void Arrays.sort(T[]) 对数组中的元素按照升序进行排序。T代表某一数据类型。 代码演示:binarySearch使用 public static void main(String[] args) { int[] arrs=new int[]{12,54,12,8765,123,34,54,23,67}; Arrays.sort(arrs); for (int i : arrs) { System.out.print(i+" "); } } 代码输出结果: 12 12 23 34 54 54 67 123 8765 在sort方法中,遇到对象数组的排序时,要给对象提供排序的依据,实现Comparator接口,可以在接口的compare方法中指定排序规则,实现Comparator接口的对象称为比较器。 有一个Student类的数组,现在按照年龄进行升序排序,那么Comparator接口compare方法实现如下: 代码演示:compare重新按年龄实现 class Student { String name; int age; public Student(String name, int age) { super(); this.name = name; this.age = age; } public String toString() { return name + "," + age; } } class StuCom implements Comparator<Student> { ① public int compare(Student stu1, Student stu2) { ② if (stu1.age > stu2.age) { return 1; } else if (stu1.age == stu2.age) { return 0; } else { return -1; } } } public static void main(String[] args) { Student[] stus = new Student[] { new Student("小美", 21), new Student("阿聪", 22), new Student("武大郎", 28), new Student("阮小七", 26), new Student("晁盖", 30), new Student("鲁智深", 29), new Student("孙二娘", 26), new Student("扈三娘", 23), new Student("武松", 24) }; Arrays.sort(stus, new StuCom()); for (Student student : stus) { System.out.println(student); } } 代码解析: ① 定义一个比较器,必须实现Comparator接口,否则系统无法对一个对象数组进行搜索规则。 ② 实现Comparator接口的compare方法,对该方法中的两个参数进行比较,就是制定了比较的规则。 代码输出结果: 小美,21 阿聪,22 扈三娘,23 武松,24 阮小七,26 孙二娘,26 武大郎,28 鲁智深,29 晁盖,30 2. List Arrays.asList(Object[] objs) 把指定的数组转换为List的对象。 代码演示:asList使用 import java.util.Arrays; import java.util.List; public class Demo9 { public static void main(String[] args) { String[] strs={"aaa","bbb","ccc","ddd","eee","fff","ggg","hhh","iii","jjj"}; List list=Arrays.asList(strs); for (int i = 0; i < list.size(); i++) { System.out.println(list.get(i)); } } } 3. int Arrays.binarySearch(T[] objs, key) 在数组objs中查找key的位置,返回key的下标,如果查找不到key,则返回。 int Arrays.binarySearch(T[] objs,int fromIndex,int toIndex , key) 在数组objs中从fromIndex到toIndex位置上查找key,返回key的下标,如果查找不到,返回一个负。 在binarySearch方法调用之前一定要保证数组已经是排序的,如果没有排序,可以使用Arrays.sort(T[]) 进行排序,然后再进行查找。 代码演示:binarySearch使用 public static void main(String[] args) { String[] strs={"aaa","bbb","ccc","ddd","eee","fff","ggg","hhh","iii","jjj"}; Arrays.sort(strs); System.out.println(Arrays.binarySearch(strs, "ccc")); System.out.println(Arrays.binarySearch(strs, 4,8,"ggg")); System.out.println(Arrays.binarySearch(strs, 4,8,"aaa")); } 如果数组是一个自定义的对象数组,那么搜索之前要先指定比较器。 代码演示:binarySearch搜索对象使用 class StuCom implements Comparator<Student> { ① public int compare(Student stu1, Student stu2) { if (stu1.age > stu2.age) { return 1; } else if (stu1.age == stu2.age && stu1.name.equals(stu2.name)) { return 0; } else { return -1; } } } public static void main(String[] args) { Student[] stus = new Student[] { new Student("小美", 21), new Student("阿聪", 22), new Student("武大郎", 28), new Student("阮小七", 26), new Student("晁盖", 30), new Student("鲁智深", 29), new Student("孙二娘", 26), new Student("扈三娘", 23), new Student("武松", 24) }; Student s = new Student("晁盖", 30); System.out.println(Arrays.binarySearch(stus, s, new StuCom())); ② } 代码解析: ① 该比较器规定了要比较的类型就是Student类型,因此这里使用泛型。 ② 指定了对象数组,对象和比较器的方法进行搜索。结果返回搜索到的对象在数组中的下标。 除了上面介绍Arrays的方法外,还有一些其它的方法方法 说明 T[] copyOf(T[] t,int length) 把一个数组赋到长度是length的新数组中。T表示数据类型。 fill(T[] t,N newValue) 用一个固定填充数组中所有元素。 表11 Arrays其他常用方法。  Collections类 Collections类与Arrays类一样都提供了一系列的静态方法,只是Arrays主要操作数组,而Collections主要操作List集合,同时还有对Set的相关操作。 代码演示:Collections操作 import java.util.ArrayList; import java.util.Collections; import java.util.List; public class Demo10 { static class Student implements Comparable { ① String name; int age; public Student(String name, int age) { super(); this.name = name; this.age = age; } public String toString() { return name + "," + age; } public int compareTo(Object o) { ② Student stu = (Student) o; if (this.age > stu.age) { return 1; } else if (this.age == stu.age && this.name.equals(stu.name)) { return 0; } else { return -1; } } } public static void main(String[] args) { List<Student> list = new ArrayList<Student>(); Student[] stus = new Student[] { new Student("小美", 21), new Student("阿聪", 22), new Student("武大郎", 28), new Student("阮小七", 26), new Student("晁盖", 30), new Student("鲁智深", 29), new Student("孙二娘", 26), new Student("扈三娘", 23), new Student("武松", 24) }; Collections.addAll(list, stus); ③ Collections.sort(list); ④ for (Student student : stus) { System.out.println(student); } Student stu = new Student("鲁智深", 29); int pos = Collections.binarySearch(list, stu); ⑤ System.out.println(pos); } } 代码解析: ① 在List中查找一个对象时,该对象必须实现Comparable接口。 ② compareTo方法中使用当前对象与参数对象进行比较。 ③ 把一个数组对象复制到List对象中用方法Collections.addAll(……)方法 ④ 对List集合中的元素按照自然顺序排序。 ⑤ 二分法查找,在List集合中查找Student对象,要求Student对象必须实现Comparable接口。 Collections的主要操作有: 1. int binarySearch(List<? extends Comparable<? super T>> list, T key) 该方法是寻找T对象在List中匹配元素的位置。要求List集合中必须全部都是T对象,T对象必须实现Comparable接口,如果查找成功返回对象在List中的位置,否则返回负数。该方法执行前首先要对List对象中的元素排序,该方法还有一个重载方法是: int binarySearch(List<? extends T> list, T key, Comparator<? super T> c) 该方法也是查找T对象在List中的位置,List集合中必须全部是T元素,但是不要去T必须实现Comparable接口,而是要求传入一个比较器。 2. sort(List<T> list) 对List中的元素按照自然排序。要按照用户自定义方式进行排序,必须实现Comparator接口。 sort (List<T> list, Comparator<? super T> c) 根据指定比较器产生的顺序对指定列表进行排序。 3. swap(List<?> list, int i, int j) 在指定列表的指定位置处交换元素。 4. reverse(List<?> list) 反转指定列表中元素的顺序。 在Collections中还有其他一些方法,可以参考JavaDoc文档。 6. java.lang.Math类 在java.lang.Math类中,包含用于执行基本数学运算的方法,如指数、对数、平方根和三角函数等。Math类中定义的所有方法和常量全部都是静态的,使用非常方便。定义的常量主要有两个:Math.E和Math.PI分别表示自然对数的底数和圆周率。 Math类中主要的方法有: 返回 方法 说明 static T abs(T a) 返回 long 的绝对。 static double acos(double a) 返回一个的反余弦;返回的角度范围在 0.0 到 pi 之间。 static double atan(double a) 返回一个的反正切;返回的角度范围在 -pi/2 到 pi/2 之间。 static double ceil(double a) 返回最小的(最接近负无穷大)double ,该大于等于参数,并等于某个整数。 static double cos(double a) 返回角的三角余弦。 static double floor(double a) 返回最大的(最接近正无穷大)double ,该小于等于参数,并等于某个整数。 static double log(double a) 返回 double 的自然对数(底数是 e)。 static double log10(double a) 返回 double 的底数为 10 的对数。 static T max(T a, T b) 返回两个 double 中较大的一个。 static T min(T a, T b) 返回两个 long 中较小的一个。 static T pow(T a, T b) 返回第一个参数的第二个参数次幂的。 static double random() 返回带正号的 double ,该大于等于 0.0 且小于 1.0。 static int round(float a) 返回最接近参数的 int。 static double sin(double a) 返回角的三角正弦。 static double sqrt(double a) 返回正确舍入的 double 的正平方根。 static double tan(double a) 返回角的三角正切。 表12 Math类中的常见静态方法
java面试试题 全面 准确 带答案 coreJava部分 8 1、面向对象的特征有哪些方面? 8 2、作用域public,private,protected,以及不写时的区别? 8 3、String 是最基本的数据类型吗? 8 4、float 型float f=3.4是否正确? 8 5、语句float f=1.3;编译能否通过? 8 6、short s1 = 1; s1 = s1 + 1;有什么错? 8 7、Java 有没有goto? 8 8、int 和Integer 有什么区别? 9 9、&和&&的区别? 9 10、简述逻辑操作(&,|,^)与条件操作(&&,||)的区别? 9 11、heap 和stack 有什么区别? 9 12、Math.round(11.5) 等于多少? Math.round(-11.5)等于多少? 9 13、swtich 是否能作用在byte 上,是否能作用在long 上,是否能作用在String上? 9 14、编程题: 用最有效率的方法算出2 乘以8 等於几? 9 15、有没有length()这个方法? String 有没有length()这个方法? 9 16、在JAVA 中,如何跳出当前的多重嵌套循环? 9 17、构造器Constructor 是否可被override? 9 18、两个对象相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对? 9 19、是否可以继承String 类? 9 20、以下二条语句返回为true 的有: 10 21、当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是传递还是引用传递? 10 22、我们在web 应用开发过程中经常遇到输出某种编码的字符,如iso8859-1等,如何输出一个某种编码的字符串? 10 23、String 和StringBuffer 的区别? 10 24、String, StringBuffer StringBuilder 的区别。 10 25、Overload 和Override 的区别。Overloaded 的方法是否可以改变返回的类型? 10 27、描述一下JVM 加载class 文件的原理机制? 10 28、char 型变量中能不能存贮一个中文汉字?为什么? 10 29、abstract class 和interface 有什么区别? 10 30、Static Nested Class 和Inner Class 的不同? 11 31、java 中会存在内存泄漏吗,请简单描述。 11 32、abstract 的method 是否可同时是static,是否可同时是native,是否可同时是synchronized? 11 33、静态变量和实例变量的区别? 11 34、是否可以从一个static 方法内部发出对非static 方法的调用? 11 35、写clone()方法时,通常都有一行代码,是什么? 11 36、GC 是什么? 为什么要有GC? 11 37、垃圾回收的优点和原理。并考虑2 种回收机制。 11 38、垃圾回收器的基本原理是什么?垃圾回收器可以马上回收内存吗?有什么办法主动通知虚拟机进行垃圾回收? 12 39、String s=new String(“xyz”);创建了几个String Object? 12 40、接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承实体类(concrete class)? 12 41、Java 的接口和C++的虚类的相同和不同处。 12 42、一个“.java”源文件中是否可以包含多个类(不是内部类)?有什么限制? 12 43、说出一些常用的类,包,接口,请各举5 个。 12 44、Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类?是否可以implements(实现)interface(接口)? 12 45、内部类可以引用他包含类的成员吗?有没有什么限制? 12 46、java 中实现多态的机制是什么? 12 47、在java 中一个类被声明为final 类型,表示了什么意思? 12 48、下面哪些类可以被继承? 12 49、指出下面程序的运行结果: 【基础】 13 52、关于内部类: 13 53、数据类型之间的转换: 14 54、字符串操作:如何实现字符串的反转及替换? 14 55、编码转换:怎样将GB2312 编码的字符串转换为ISO-8859-1 编码的字符串? 14 56、写一个函数,要求输入一个字符串和一个字符长度,对该字符串进行分隔。 14 59、Java 编程,打印昨天的当前时刻。 15 60、java 和javasciprt 的区别。 15 61、什么时候用assert? 16 62、error和exception有什么区别 16 63、ArrayList和Vector的区别 16 64、Collection 和 Collections的区别 17 65、Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别 17 66、HashMap和Hashtable的区别 17 67、说出ArrayList,Vector, LinkedList的存储性能和特性 17 68、java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类? 17 69、文件读写的基本类 17 70、多线程有几种实现方法,都是什么?同步有几种实现方法,都是什么? 17 71、启动一个线程是用run()还是start()? 17 72、当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法? 18 73、线程的基本概念、线程的基本状态以及状态之间的关系 18 74、sleep() 和 wait() 有什么区别? 18 75、socket通信(tcp/udp区别及JAVA的实现方式) 18 76、什么是java序列化,如何实现java序列化? 18 77、简述synchronized和java.util.concurrent.locks.Lock的异同 ? 18 78、abstract class Name { private String name; public abstract boolean isStupidName(String name) {}}这有何错误? 18 79、public class Something { void doSomething () { private String s = ""; int l = s.length(); } }有错吗? 18 80、abstract class Something { private abstract String doSomething ();}这好像没什么错吧? 18 81、public class Something { public int addOne(final int x) { return ++x; }}这个比较明显。 19 83、class Something { int i; public void doSomething() { System.out.println("i = " + i); }} 有什么错呢? 19 Hibernate部分 19 92、一般情况下,关系数据模型与对象模型之间有哪些匹配关系(A,B,C) 21 93、以下关于SessionFactory的说法哪些正确?(B,C) 21 94、元素有一个cascade属性,如果希望Hibernate级联保存集合中的对象,casecade属性应该取什么?(单选)(D) 22 95、以下哪些属于Session的方法?(A,B,C,D,F) 22 96、Hibernate工作原理及为什么要用? 22 97、Hibernate是如何延迟加载? 22 98、Hibernate中怎样实现类之间的关系?(如:一对多、多对多的关系) 22 99、说下Hibernate的缓存机制 22 100、Hibernate的查询方式 23 101、如何优化Hibernate? 23 102、Struts工作机制?为什么要使用Struts? 23 103、Struts的validate框架是如何验证的? 24 104、说下Struts的设计模式 24 105、spring工作机制及为什么要用? 24 106、HttpSession session = request.getSession() 24 107、getParameter与 getAttribute的区别? 24 108、以下哪一个不是赋符号? 25 109、以下哪个不是Collection的子接口? 25 110、.BufferedReader的父类是以下哪个? 25 112、div与span区别? 25 113、html的框架是什么? 25 114、alert怎样换行? 25 115、什么情况用HTML控件,什么情况用WEB控件,并比较两者差别 25 javaScript部分 25 116、JavaScript中的对象. 25 117、function的用法 26 118、对象的继承 27 119、this的用法 29 120、Array in JavaScript 29 121、jsp有哪些内置对象?作用分别是什么? 31 122、jsp有哪些动作?作用分别是什么? 31 123、JSP中动态INCLUDE与静态INCLUDE的区别? 31 124、两种跳转方式分别是什么?有什么区别? 31 125、如何执行一个线程安全的JSP? 31 126、JSP如何处理HTML FORM中的数据? 31 127、在JSP如何包含一个静态文件? 32 128、在JSP中如何使用注释? 32 129、在JSP中如何执行浏览重定向? 32 130、如何防止在JSP或SERVLET中的输出不被BROWSER保存在CACHE中? 32 131、在JSP中如何设置COOKIE? 32 132、在JSP中如何删除一个COOKIE? 32 133、在一个JSP的请求处理中如何停止JSP的执行 33 134、在JSP中如何定义方法 33 135、在JSP中能发送EMAIL吗 34 136、在SERVLET中我能调用一个JSP错误页吗 34 137、APPLET和JSP如何通讯 35 138、JSP如何与EJB SessionBean通讯 35 139、当我使用一个结果集时,如何防止字段为"null"的字域显示在我的HTML输入文本域中? 35 140、如何中SERVLET或JSP下载一个文件(如:binary,text,executable)? 36 141、使用useBean标志初始化BEAN时如何接受初始化参数 36 142、使用JSP如何获得客户浏览器的信息? 36 143、能象调用子程序一样调用JSP吗? 36 144、当我重编译我的JSP使用的一个类后,为什么JVM继续使用我的老CLASS? 36 145、<%@include file="abc.jsp"%>与<jsp:include page="abc.jsp"/>之间的差别? 36 146、JSP的缺点? 36 148、如何实现JSP的国际化? 36 150、如何在JSP中包括绝对路径文件? 使用URLConnection即可。 37 151、在servlets和JSP之间能共享session对象吗? 37 152、如何设置cookie在某一时间后过期? 37 153、如何获得当前的sessions数? 37 154、能设置一些代码在我所有的JSP文件之上运行?如果可以,能共享吗? 37 155、对一个JSP页,如果多个客户端同时请求它,同步可能吗? 37 156、在jsp:useBean语法中使用beanName有何好处? 37 157、当我使用<jsp:forward>时,在浏览器的地址栏没有改变? 37 158、如何转换JSP 0.9版本的文件到JSP1.1? 37 160、JSP和Servlet有哪些相同点和不同点,他们之间的联系是什么? 38 161、AJAX的全称是什么? 介绍一下AJAX 38 162、Ajax主要包含了哪些技术? 38 163、主要的Ajax框架都有什么? 38 164、介绍一下XMLHttpRequest对象 38 165、AJAX应用和传统Web应用有什么不同? 38 166、如何用JQuery进行表单验证? 39 167、Prototype如何实现页面局部定时刷新? 40 168、Prototype如何为一个Ajax添加一个参数? 40 169、Ajax请求总共有多少种Callback? 41 170、Javascript如何发送一个Ajax请求? 41 171、AJAX都有哪些有点和缺点? 41 172、Ajax和javascript的区别? 41 Servlet部分 42 174、JAVA SERVLET API中forward() 与redirect()的区别? 42 178、如何现实servlet的单线程模式 42 179、页面间对象传递的方法 42 180、JSP和Servlet有哪些相同点和不同点,他们之间的联系是什么? 42 181、四种会话跟踪技术 42 182、Request对象的主要方法 43 183、我们在web应用开发过程中经常遇到输出某种编码的字符,如iso8859-1等,如何输出一个某种编码的字符串? 43 184、Servlet执行时一般实现哪几个方法? 44 185、getServletContext()和getServletConfig()的意思 44 186、Hashtable和HashMap 44 187、JAVA SERVLET API中forward() 与redirect()的区别? 44 189、Can a Java Thread be started from Servlet class, and what will be the implications? 45 190、What is HTTP Session tracking and why is it important? 45 191、What is session management, and how is it different from session tracking? 45 192、Can I use Hidden form field to track session? 45 194、In a architecture pattern like MVC, it is mandatory that Servlet should be the controller, why not JSP? 46 195、Why JSP is used as View part of MVC ? 46 196、Can a database connection pool be instantiated in init method of servlet instead of server connection pool? What will be the problem? 46 综合部分 46 197、Class.forName的作用?为什么要用? 47 198、Jdo是什么? 47 199、在ORACLE大数据量下的分页解决方法。一般用截取ID方法,还有是三层嵌套方法。 47 200、xml有哪些解析技术?区别是什么? 48 201、你在项目中用到了xml技术的哪些方面?如何实现的? 48 202、用jdom解析xml文件时如何解决中文问题?如何解析? 48 203、编程用JAVA解析XML的方式. 49 204、EJB2.0有哪些内容?分别用在什么场合? EJB2.0和EJB1.1的区别? 51 205、EJB与JAVA BEAN的区别? 51 206、EJB的基本架构 51 207、MVC的各个部分都有那些技术来实现?如何实现? 52 208、J2EE是什么? 52 209、WEB SERVICE名词解释。JSWDL开发包的介绍。JAXP、JAXM的解释。SOAP、UDDI,WSDL解释。 52 210、STRUTS的应用(如STRUTS架构) 52 211、开发中都用到了那些设计模式?用在什么场合? 52 212、UML方面 52 213、如何校验数字型? 53 214、CORBA是什么?用途是什么? 53 215、写一个方法,实现字符串的反转,如:输入abc,输出cba 53 216、数据类型之间的转换 53 217、如何取得年月日,小时分秒 53 218、如何取得从1970年到现在的毫秒数 53 219、如何格式化日期 53 220、文件和目录(I/O)操作 54 230、J2EE的优越性 54 231、Java语言的11个关键特性. 54 232、说出Servlet的生命周期,并说出Servlet和CGI的区别。 55 233、说出在JSP页面里是怎么分页的? 55 234、存储过程和函数的区别 55 235、事务是什么? 55 236、游标的作用?如何知道游标已经到了最后? 55 237、触发器分为事前触发和事后触发,这两种触发有和区别。语句级触发和行级触发有何区别。 56 238、EJB容器提供的服务 56 239、EJB的角色和三个对象 56 240、EJB的几种类型 56 241、bean 实例的生命周期 56 242、激活机制 56 243、remote接口和home接口主要作用 56 244、客服端调用EJB对象的几个基本步骤 56 245、 如何给weblogic指定大小的内存? 56 246、如何设定的weblogic的热启动模式(开发模式)与产品发布模式? 57 247、如何启动时不需输入用户名与密码? 57 248、在weblogic管理制台中对一个应用域(或者说是一个网站,Domain)进行jms及ejb或连接池等相关信息进行配置后,实际保存在什么文件中? 57 250、如何查看在weblogic中已经发布的EJB? 57 251、如何在weblogic中进行ssl配置与客户端的认证配置或说说j2ee(标准)进行ssl的配置 57 252、在weblogic中发布ejb需涉及到哪些配置文件 57 253、EJB需直接实现它的业务接口或Home接口吗,请简述理由. 57 254、说说在weblogic中开发消息Bean时的persistent与non-persisten的差别 57 255、说说你所熟悉或听说过的j2ee中的几种常用模式?及对设计模式的一些看法 57 256、现在输入n个数字,以逗号,分开; 58 257、金额转换,阿拉伯数字的金额转换成中国传统的形式如:(¥1011)->(一千零一拾一元整)输出。 58 259、Spring和Struts的区别? 58 260、如何用Struts实现国际化? 58 261、如何实现struts的validator框架? 59 262、如何在struts中配置数据源在,什么文件?用什么标签?如何取出DataSource? 60 263、Struts框架如何取得消息资源文件中的信息? 60 264、Struts中如何基于validation.xml来启用客户端验证? 60 266、请你谈谈SSH整合 60 267、ActionForm bean的作用 61 268、Spring如何创建一个数据连接池 61 269、Spring如何配置一个bean来从JNDI得到DataSource 61 270、Bean的销毁 61 271、Spring如何获取Bean 61 272、Spring和Struts的区别? 62 273、什么是aop,aop的作用是什么? 62 275、依赖注入的方式有几种,各是什么? 62 276、spring中的核心类有那些,各有什么作用? 62 277、ApplicationContext的作用 63 278、如何实现资源管理 63 279、如何实现加入web框架中 63 280、如何实现事件处理 63 281、spring的ioc及di代表什么意思? 63 283、spring的配置的主要标签是什么?有什么作用? 64 284、spring与ejb2.0的事务管理比较的优缺点? 64 286、在spring中有几种事务管理,分别是什么? 64 287、在spring中如何配代码的事务管理? 65 288、在spring中如何配容器的事务管理,相关的类有那些? 65 289、如果spring与hibernate结合在一起可以不需要hibernate.cfg.xml文件是否正确? 65 290、spring+hibernate的配置文件中的主要类有那些?如何配置? 65 291、spring+hibernate的代码实现中,对于实现类一定继承于一个类是那一个,它有什么作用 66 292、如何配置spring+struts? 66 293、如何在web环境中配置applicationContext.xml文件? 66 294、BS与CS的联系与区别 66 295、Servlet的生命周期 68 296、如何现实Servlet的单线程模式 68 297、Servlet执行时一般实现哪几个方法? 68 298、j2ee常用的设计模式?说明工厂模式。 68 299、应用服务器与WEB SERVER的区别? 68 300、应用服务器有那些? 68 301、说出数据连接池的工作机制是什么? 68 302、页面间对象传递的方法 69 303、四种会话跟踪技术 69 304、J2EE 是技术还是平台还是框架? 69 305、同步和异步有何异同,在什么情况下分别使用他们?举例说明。 69 306、启动一个线程是用run()还是start()? 69 307、线程的基本概念、线程的基本状态以及状态之间的关系 69 308、java 中有几种方法可以实现一个线程?用什么关键字修饰同步方法? stop()和suspend()方法为何不推荐使用? 70 309、JSP中动态INCLUDE与静态INCLUDE的区别? 70 310、JSP的常用指令 70 311、什么情况下调用doGet()和doPost()? 70 312、JSP和Servlet 有哪些相同点和不同点,他们之间的联系是什么? 70 313、Request对象的主要方法: 70 314、JSP有哪些动作?作用分别是什么? 71 315、JSP的两种跳转方式分别是什么?有什么区别? 71 316、EJB是基于哪些技术实现的?并说出SessionBean和EntityBean的区别,StatefulBean和StatelessBean的区别。 71 317、EJB与JAVA BEAN的区别? 72 318、EJB包括(SessionBean,EntityBean)说出他们的生命周期,及如何管理事务的? 72 319、EJB规范规定EJB中禁止的****作有哪些? 72 320、remote接口和home接口主要作用 72 321、bean 实例的生命周期 72 322、EJB的激活机制 73 323、EJB的几种类型 73 324、客服端调用EJB对象的几个基本步骤 73 325、EJB需直接实现它的业务接口或Home接口吗,请简述理由。 73 327、说说在weblogic中开发消息Bean时的persistent与non-persisten的差别 73 328、你在项目中用到了xml技术的哪些方面?如何实现的? 73 329、JAVA SERVLET API中forward() 与redirect()的区别? 73 330、面向对象的特征? 73 331、Java中的异常处理机制? 74 333、Java中的事件处理机制? 74 334、垃圾回收器的基本原理是什么?垃圾回收器可以马上回收内存吗?有什么办法主动通知虚拟机进行垃圾回收? 75 335、GC是什么?为什么要有GC (基础) ? 75 336、请说出你所知道的线程同步的方法。 75 337、什么是Java序列化,如何实现Java 序列化? 75 338、介绍Java中的Collection Framework(包括如何写自己的数据结构)? 75 339、String是最基本的数据类型吗? 76 340、谈谈final, finally, finalize 的区别? 76 341、Static Nested Class 和Inner Class的不同? 76 342、HashMap和Hashtable的区别? 76 343、ArrayList和Vector的区别? 76 344、Collection 和Collections的区别? 77 345、Overload和Override的区别。Overloaded的方法是否可以改变返回的类型? 77 346、String与StringBuffer的区别? 77 347、静态变量和实例变量的区别? 77 348、List、Map、Set三个接口,存取元素时,各有什么特点? 77 349、说出ArrayList,Vector, LinkedList的存储性能和特性。 77 350、在Java中一个类被声明为final类型,表示了什么意思? 77 351、Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)? 77 352、String s = new String("xyz");创建了几个String Object? 77 353、Math.round(11.5)等於多少? Math.round(-11.5)等於多少? 77 354、short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错? 78 355、数组有没有length()这个方法? String 有没有length()这个方法? 78 356、Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别? 78 357、List, Set, Map是否继承自Collection接口? 78 358、abstract的method是否可同时是static,是否可同时是native,是否可同时是synchronized? 78 360、构造器Constructor是否可被override? 78 361、当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法? 78 362、try {}里有一个return 语句,那么紧跟在这个try后的finally {}里的code 会不会被执行,什么时候被执行,在return前还是后? 78 363、描述一下JVM加载class文件的原理机制? 78 364、多线程有几种实现方法,都是什么?同步有几种实现方法,都是什么? 78 365、Java中会存在内存泄漏吗,请简单描述。 78 366、是否可以从一个static方法内部发出对非static方法的调用? 79 367、写clone()方法时,通常都有一行代码,是什么? 79 368、在Java中,如何跳出当前的多重嵌套循环? 79 370、给我一个你最常见到的runtime exception。 79 371、写一个Singleton出来 79 372、Java 的通信编程,编程题(或问答),用JAVA SOCKET编程,读服务器几个字符,再写入本地显示? 80 373、用JAVA实现一种排序,JAVA类实现序列化的方法(二种)? 如在 COLLECTION框架中,实现比较要实现什么样的接口? 81 374、编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串。 82 380、ArrayList和Vector的区别, HashMap和Hashtable的区别 83 381、== 与 equals 的区别: 83 382、写一个 SQL Server 中的存储过程: 83 383、写一个 Oracle 中的存储过程: 84 384、HTTP 的请求过程: 84 385、多线程的优点 84 387、java是否存在内存泄露 85 388、Corba概述 85 389、toString方法的概述 85 390、Object类的概述 85 391、什么叫抽象类?抽象类跟接口有什么区别?为什么引进数据接口概念? 85 392、doGet与doPut的区别? 85 393、多线程实现有那几种方法,同步有哪几种方法? 85 394、JSP页面的跳转? 86 395、类变量的初始化 86 396、数组的定义 86 397、说明List和Set的区别 86
/****************************************** * Made by : ff * QQ : 394447974 * E_Mail : xysyclover@163.com * http://tech.cuit.edu.cn * 2007-12-01 21:45 * 简单计算器 Test V1.0 *******************************************/ import java.awt.*; import java.lang.*; import javax.swing.*; import javax.swing.event.*; import java.awt.event.*; import java.text.DecimalFormat; public class Calculator implements ActionListener { //导入动作监听接口 //设计面板中的单位 JFrame frame;//主窗口 JTextField textAnswer;//显示文本框 JPanel panel, panel1, panel2, panel3; JMenuBar mainMenu; JTextField textMemory; JLabel labelMemSpace; //labelMemSpace单纯摆设,控制面板的形状 JButton buttonBk, buttonCe, buttonC; JButton button[]; JButton buttonMC, buttonMR, buttonMS, buttonMAdd; JButton buttonDot, buttonAddAndSub, buttonAdd, buttonSub, buttonMul, buttonDiv, buttonMod; JButton buttonSqrt, buttonDao, buttonEqual; JMenu viewMenu, helpMenu; JMenuItem tItem, sItem, topHelp, aboutCal; DecimalFormat df; //设置数据输出精度 boolean clickable; //控制当前能否按键 double memoryd; //使用内存中存储的数字 int memoryi; double vard, answerd; //用来保存double型数据的中间(vard)和最后结果(answerd) short key = -1, prekey = -1; //key用来保存当前进行何种运算,prekey用来保存前次进行何种运算 String copy; //复制用 JTextArea help; //帮助 JScrollPane scrollHelp; //构造函数 public Calculator() { clickable = true; answerd = 0; frame = new JFrame("计算器 Test--V1.0 Made by:ff"); df = new DecimalFormat("0.00000000"); //设置数据输出精度(对于double型) textAnswer = new JTextField(15); textAnswer.setText(""); textAnswer.setHorizontalAlignment(JTextField.RIGHT); textAnswer.setBorder(BorderFactory.createLineBorder(Color.red)); textAnswer.setEditable(false); textAnswer.setBackground(new Color(255, 255, 255)); panel = new JPanel(); frame.getContentPane().add(panel); panel1 = new JPanel(); panel2 = new JPanel(); panel.setLayout(new BorderLayout()); //设计整个面板 mainMenu = new JMenuBar(); viewMenu = new JMenu("查看(V)"); helpMenu = new JMenu("帮助(H)"); tItem = new JMenuItem("●标准型(T)"); tItem.addActionListener(this); sItem = new JMenuItem("●科学型(S)"); sItem.addActionListener(this); viewMenu.add(tItem); viewMenu.add(sItem); topHelp = new JMenuItem(" 帮助主题(H)"); topHelp.addActionListener(this); help = new JTextArea(5, 20); scrollHelp = new JScrollPane(help); help.setEditable(false); help.append("执行简单计算\n"); help.append("1. 键入计算的第一个数字。\n"); help.append("2. 单击“+”执行加、“-”执行减、“*”执行乘或“/”执行除。\n"); help.append("3. 键入计算的下一个数字。\n"); help.append("4. 输入所有剩余的运算符和数字。\n"); help.append("5. 单击“=”。\n"); aboutCal = new JMenuItem(" 关于计算器(A)"); aboutCal.addActionListener(this); helpMenu.add(topHelp); helpMenu.add(aboutCal); mainMenu.add(viewMenu); mainMenu.add(helpMenu); panel.add(mainMenu, BorderLayout.NORTH); panel.add(textAnswer, BorderLayout.CENTER); panel.add(panel1, BorderLayout.SOUTH); panel1.setLayout(new BorderLayout()); textMemory = new JTextField(3); textMemory.setEditable(false); textMemory.setBackground(new Color(217, 217, 217)); labelMemSpace = new JLabel(" "); buttonBk = new JButton("Backspace"); buttonBk.setForeground(new Color(255, 0, 0)); buttonCe = new JButton("CE"); buttonCe.setForeground(new Color(255, 0, 0)); buttonC = new JButton("C"); buttonC.setForeground(new Color(255, 0, 0)); buttonBk.addActionListener(this); buttonCe.addActionListener(this); buttonC.addActionListener(this); panel1.add(panel2, BorderLayout.NORTH); panel2.setLayout(new FlowLayout(FlowLayout.RIGHT)); panel2.add(textMemory); panel2.add(labelMemSpace); panel2.add(buttonBk); panel2.add(buttonCe); panel2.add(buttonC); panel3 = new JPanel(); panel1.add(panel3, BorderLayout.CENTER); button = new JButton[10]; for (int i = 0; i < button.length; i++) { button[i] = new JButton(Integer.toString(i)); button[i].setForeground(new Color(0, 0, 255)); } buttonMC = new JButton("MC"); buttonMC.setForeground(new Color(255, 0, 0)); buttonMR = new JButton("MR"); buttonMR.setForeground(new Color(255, 0, 0)); buttonMS = new JButton("MS"); buttonMS.setForeground(new Color(255, 0, 0)); buttonMAdd = new JButton("M+"); buttonMAdd.setForeground(new Color(255, 0, 0)); buttonDot = new JButton("."); buttonDot.setForeground(new Color(0, 0, 255)); buttonAddAndSub = new JButton("+/-"); buttonAddAndSub.setForeground(new Color(0, 0, 255)); buttonAdd = new JButton("+"); buttonAdd.setForeground(new Color(255, 0, 0)); buttonSub = new JButton("-"); buttonSub.setForeground(new Color(255, 0, 0)); buttonMul = new JButton("*"); buttonMul.setForeground(new Color(255, 0, 0)); buttonDiv = new JButton("/"); buttonDiv.setForeground(new Color(255, 0, 0)); buttonMod = new JButton("%"); buttonMod.setForeground(new Color(0, 0, 255)); buttonSqrt = new JButton("sqrt"); buttonSqrt.setForeground(new Color(0, 0, 255)); buttonDao = new JButton("1/x"); buttonDao.setForeground(new Color(0, 0, 255)); buttonEqual = new JButton("="); buttonEqual.setForeground(new Color(255, 0, 0)); //将所有行为与监听绑定 panel3.setLayout(new GridLayout(4, 6)); panel3.add(buttonMC); buttonMC.addActionListener(this); panel3.add(button[7]); button[7].addActionListener(this); panel3.add(button[8]); button[8].addActionListener(this); panel3.add(button[9]); button[9].addActionListener(this); panel3.add(buttonDiv); buttonDiv.addActionListener(this); panel3.add(buttonSqrt); buttonSqrt.addActionListener(this); panel3.add(buttonMR); buttonMR.addActionListener(this); panel3.add(button[4]); button[4].addActionListener(this); panel3.add(button[5]); button[5].addActionListener(this); panel3.add(button[6]); button[6].addActionListener(this); panel3.add(buttonMul); buttonMul.addActionListener(this); panel3.add(buttonMod); buttonMod.addActionListener(this); panel3.add(buttonMS); buttonMS.addActionListener(this); panel3.add(button[1]); button[1].addActionListener(this); panel3.add(button[2]); button[2].addActionListener(this); panel3.add(button[3]); button[3].addActionListener(this); panel3.add(buttonSub); buttonSub.addActionListener(this); panel3.add(buttonDao); buttonDao.addActionListener(this); panel3.add(buttonMAdd); buttonMAdd.addActionListener(this); panel3.add(button[0]); button[0].addActionListener(this); panel3.add(buttonAddAndSub); buttonAddAndSub.addActionListener(this); panel3.add(buttonDot); buttonDot.addActionListener(this); panel3.add(buttonAdd); buttonAdd.addActionListener(this); panel3.add(buttonEqual); buttonEqual.addActionListener(this); frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE); frame.pack(); frame.show(); } //设置各个按钮行为 public void actionPerformed(ActionEvent event) { boolean sign = false; //判断是否是double型数参与运算,是为true,不是为false Object temp = event.getSource(); try { //如果按下数据按钮,将按下的按钮代表的数据插入的当前文本框字符串之后 for (int i = 0; i <= 9; i++) if (temp == button[i] && clickable == true) textAnswer.setText(textAnswer.getText() + Integer.toString(i)); //按下'.'按钮时,判断当前文本框内字符串中含不含'.',如果已含,则不允许再插入'.' if (temp == buttonDot && clickable == true) { boolean isDot = false; if (textAnswer.getText().length() == 0) isDot = true; for (int i = 0; i < textAnswer.getText().length(); i++) if ('.' == textAnswer.getText().charAt(i)) { isDot = true; break; } if (isDot == false) textAnswer.setText(textAnswer.getText() + "."); } if ( (temp == buttonAdd || temp == buttonSub || temp == buttonMul || temp == buttonDiv) && clickable == true) { //'+'操作 if (temp == buttonAdd) { switch (prekey) { case 0: answerd += Double.parseDouble(textAnswer.getText()); break; case 1: answerd -= Double.parseDouble(textAnswer.getText()); break; case 2: answerd *= Double.parseDouble(textAnswer.getText()); break; case 3: if (Double.parseDouble(textAnswer.getText()) == 0) { textAnswer.setText("除数不能为零"); clickable = false; } else answerd /= Double.parseDouble(textAnswer.getText()); break; default: answerd = Double.parseDouble(textAnswer.getText()); } textAnswer.setText(""); prekey = key = 0; } //'-'操作 if (temp == buttonSub) { switch (prekey) { case 0: answerd += Double.parseDouble(textAnswer.getText()); break; case 1: answerd -= Double.parseDouble(textAnswer.getText()); break; case 2: answerd *= Double.parseDouble(textAnswer.getText()); break; case 3: if (Double.parseDouble(textAnswer.getText()) == 0) { textAnswer.setText("除数不能为零"); clickable = false; } else answerd /= Double.parseDouble(textAnswer.getText()); break; default: answerd = Double.parseDouble(textAnswer.getText()); } textAnswer.setText(""); prekey = key = 1; } //'*'操作 if (temp == buttonMul) { switch (prekey) { case 0: answerd += Double.parseDouble(textAnswer.getText()); break; case 1: answerd -= Double.parseDouble(textAnswer.getText()); break; case 2: answerd *= Double.parseDouble(textAnswer.getText()); break; case 3: if (Double.parseDouble(textAnswer.getText()) == 0) { textAnswer.setText("除数不能为零"); clickable = false; } else answerd /= Double.parseDouble(textAnswer.getText()); break; default: answerd = Double.parseDouble(textAnswer.getText()); } textAnswer.setText(""); prekey = key = 2; } //'/'操作 if (temp == buttonDiv) { switch (prekey) { case 0: answerd += Double.parseDouble(textAnswer.getText()); break; case 1: answerd -= Double.parseDouble(textAnswer.getText()); break; case 2: answerd *= Double.parseDouble(textAnswer.getText()); break; case 3: if (Double.parseDouble(textAnswer.getText()) == 0) { textAnswer.setText("除数不能为零"); clickable = false; } else answerd /= Double.parseDouble(textAnswer.getText()); break; default: answerd = Double.parseDouble(textAnswer.getText()); } textAnswer.setText(""); prekey = key = 3; } } //'='操作 if (temp == buttonEqual && clickable == true) { //如果连续按'=',则进行连续运算 if (prekey == 5) { if (key == 0) { answerd += vard; textAnswer.setText(df.format(answerd)); } if (key == 1) { answerd -= vard; textAnswer.setText(df.format(answerd)); } if (key == 2) { answerd *= vard; textAnswer.setText(df.format(answerd)); } if (key == 3) { if (Double.parseDouble(textAnswer.getText()) == 0) { textAnswer.setText("除数不能为零"); clickable = false; } else { answerd /= vard; textAnswer.setText(df.format(answerd)); } } } else { vard = Double.parseDouble(textAnswer.getText()); if (key == 0) { prekey = -1; answerd += Double.parseDouble(textAnswer.getText()); textAnswer.setText(df.format(answerd)); } if (key == 1) { prekey = -1; answerd -= Double.parseDouble(textAnswer.getText()); textAnswer.setText(df.format(answerd)); } if (key == 2) { prekey = -1; answerd *= Double.parseDouble(textAnswer.getText()); textAnswer.setText(df.format(answerd)); } if (key == 3) { prekey = -1; if (Double.parseDouble(textAnswer.getText()) == 0) { textAnswer.setText("除数不能为零"); clickable = false; } else { answerd /= Double.parseDouble(textAnswer.getText()); textAnswer.setText(df.format(answerd)); } } } prekey = 5; } //'%'操作,对第二个操作数除以100 if (temp == buttonMod && clickable == true) { if (answerd == 0) { String s = textAnswer.getText(); textAnswer.setText(s); } else { boolean isDot = false; for (int i = 0; i < textAnswer.getText().length(); i++) if ('.' == textAnswer.getText().charAt(i)) { isDot = true; break; } //如果是double数,除100 if (isDot == true) { double dtemp = Double.parseDouble(textAnswer.getText()); dtemp = dtemp / 100.0; textAnswer.setText(Double.toString(dtemp)); } else { //如果是int数但能被100整除,则去掉末尾两个零 if (Integer.parseInt(textAnswer.getText()) % 100 == 0) { int itemp = Integer.parseInt(textAnswer.getText()); itemp /= 100; textAnswer.setText(Integer.toString(itemp)); } //如果是int数,但不能被100整除,则按double数处理 else { double dtemp = Double.parseDouble(textAnswer.getText()); dtemp = dtemp / 100.0; textAnswer.setText(Double.toString(dtemp)); } } } } //开根号运算 if (temp == buttonSqrt && clickable == true) { String s = textAnswer.getText(); if (s.charAt(0) == '-') { textAnswer.setText("负数不能开根号"); clickable = false; } else textAnswer.setText(Double.toString(java.lang.Math.sqrt(Double. parseDouble(textAnswer.getText())))); } //倒数运算 if (temp == buttonDao && clickable == true) { if (textAnswer.getText().charAt(0) == '0' && textAnswer.getText().length() == 1) { textAnswer.setText("零不能求倒数"); clickable = false; } else { boolean isDec = true; int i, j, k; String s = Double.toString(1 / Double.parseDouble(textAnswer.getText())); for (i = 0; i < s.length(); i++) if (s.charAt(i) == '.') break; for (j = i + 1; j < s.length(); j++) if (s.charAt(j) != '0') { isDec = false; break; } if (isDec == true) { String stemp = ""; for (k = 0; k < i; k++) stemp += s.charAt(k); textAnswer.setText(stemp); } else textAnswer.setText(s); } } //按下'+/-'按钮时处理 if (temp == buttonAddAndSub && clickable == true) { boolean isNumber = true; String s = textAnswer.getText(); for (int i = 0; i < s.length(); i++) if (! (s.charAt(i) >= '0' && s.charAt(i) <= '9' || s.charAt(i) == '.' || s.charAt(i) == '-')) { isNumber = false; break; } if (isNumber == true) { //如果当前字符串首字母有'-'号,代表现在是个负数,再按下时,则将首符号去掉 if (s.charAt(0) == '-') { textAnswer.setText(""); for (int i = 1; i < s.length(); i++) { char a = s.charAt(i); textAnswer.setText(textAnswer.getText() + a); } } //如果当前字符串第一个字符不是符号,则添加一个符号在首字母处 else textAnswer.setText('-' + s); } } //计算器有关内存操作 //'MC'的操作,将内存清0 if (temp == buttonMC && clickable == true) { memoryd = memoryi = 0; textMemory.setText(""); } //'MS'的操作,将当前文本框内容保存入内存,显示'M' if (temp == buttonMS && clickable == true) { boolean isDot = false; textMemory.setText(" M"); for (int i = 0; i < textAnswer.getText().length(); i++) if ('.' == textAnswer.getText().charAt(i)) { isDot = true; break; } //如果是double,则存入memoryd(double存储器) if (isDot == true) { memoryd = Double.parseDouble(textAnswer.getText()); memoryi = 0; //保证存储器中存放最新的 } //如果是int,则存入memoryi(int存储器) else { memoryi = Integer.parseInt(textAnswer.getText()); memoryd = 0; //保证存储器中存放最新的 } } //'MR'的操作,将存储器中的信息输出 if (temp == buttonMR && clickable == true) { if (memoryd != 0) textAnswer.setText(Double.toString(memoryd)); if (memoryi != 0) textAnswer.setText(Integer.toString(memoryi)); } //'M+'的功能,将当前文本框里的数据和存储器中数据相加后,再存入存储器 if (temp == buttonMAdd && clickable == true) { boolean isDot = false; for (int i = 0; i < textAnswer.getText().length(); i++) if ('.' == textAnswer.getText().charAt(i)) { isDot = true; break; } if (memoryi != 0) { //存储中是一个int型数 if (isDot == false) //被加数是一个int型数 memoryi += Integer.parseInt(textAnswer.getText()); else { //被加数是一个double型数,则将int存储器中数传入double存储器与当前数相加,int存储器清零 memoryd = memoryi + Double.parseDouble(textAnswer.getText()); memoryi = 0; } } else memoryd += Double.parseDouble(textAnswer.getText()); } //按下'Backspace'键,利用循环将当前字符串中的最后一个字母删除 if (temp == buttonBk && clickable == true) { String s = textAnswer.getText(); textAnswer.setText(""); for (int i = 0; i < s.length() - 1; i++) { char a = s.charAt(i); textAnswer.setText(textAnswer.getText() + a); } } //按下'CE'按钮,将当前文本框内数据清除 if (temp == buttonCe) { textAnswer.setText(""); clickable = true; } //按下'C'按钮,文本框内数据清除,同时var,answer清0 if (temp == buttonC) { vard = answerd = 0; textAnswer.setText(""); clickable = true; } if (temp == sItem) { JOptionPane.showMessageDialog(panel, "当前是标准型计算器,\n科学型计算器有待更新。"); } //按下'帮助主题'菜单栏 if (temp == topHelp) { JOptionPane.showMessageDialog(panel, scrollHelp); } //按下'关于'菜单栏 if (temp == aboutCal) { JOptionPane.showMessageDialog(panel, "开发者:ff \n QQ :394447974 \n E_mail:xysyclover@163.com"); } } //输入中如果有操作非法,比如按下两次'+',捕获异常 catch (Exception e) { textAnswer.setText("操作非法"); clickable = false; } } //主函数 public static void main(String args[]) { new Calculator(); } }
Set:元素不可以重复,是无序。p508 Set接口中的方法和Collection一致。 |--HashSet: 内部数据结构是哈希表 ,是不同步的。 如何保证该集合元素唯一性呢? 是通过对象的hashCode和equals方法来完成对象唯一性的。 如果对象的hashCode不同,那么不用判断equals方法,就直接存储到哈希表中。 如果对象的hashCode相同,那么要再次判断对象的equals方法是否为true。 如果为true,视为相同元素,不存。如果为false,那么视为不同元素,就进行存储。 记住:如果元素要存储到HashSet集合中,必须覆盖hashCode方法和equals方法。 一般情况下,如果自定义的类会产生很多对象,比如人,学生,书,通常都需要覆盖equals,hashCode方法。 建立对象判断是否相同的依据。 import java.util.HashSet; import java.util.Iterator; import java.util.LinkedHashSet; public class HashSetTest { public static void main(String[] args) { HashSet hs = new LinkedHashSet(); hs.add("hahah"); hs.add("hehe"); hs.add("heihei"); hs.add("xixii"); hs.add("hehe"); Iterator it = hs.iterator(); while(it.hasNext()){ System.out.println(it.next()); } } } 例子2-1: import java.util.HashSet; import java.util.Iterator; //package cn.itcast.p.bean; class Person /*extends Object*/// implements Comparable { private String name; private int age; public Person() { super(); } public Person(String name, int age) { super(); this.name = name; this.age = age; } @Override//覆盖hasCode() public int hashCode() { // System.out.println(this+".......hashCode"); return name.hashCode()+age*27; // return 100; } @Override//覆盖equals方法 public boolean equals(Object obj) { if(this == obj) return true; if(!(obj instanceof Person)) throw new ClassCastException("类型错误"); // System.out.println(this+"....equals....."+obj); Person p = (Person)obj; return this.name.equals(p.name) && this.age == p.age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } } //import cn.itcast.p.bean.Person; /* * 往hashSet集合中存储Person对象。如果姓名和年龄相同,视为同一个人。视为相同元素。 */ public class HashSetTest { /** * @param args */ public static void main(String[] args) { HashSet hs = new HashSet(); /* * HashSet集合数据结构是哈希表,所以存储元素的时候, * 使用的元素的hashCode方法来确定位置,如果位置相同,在通过元素的equals来确定是否相同。 * */ hs.add(new Person("lisi4",24)); hs.add(new Person("lisi7",27)); hs.add(new Person("lisi1",21)); hs.add(new Person("lisi9",29)); hs.add(new Person("lisi7",27)); Iterator it = hs.iterator(); while(it.hasNext()){ Person p = (Person)it.next(); //it.next()是Object对象,必须要强转,如果不强转的话,则会输出对象的哈希码 System.out.println(p); System.out.println(p.getName()+"...."+p.getAge()); } } } /* 结果如下: f:\tang>javac HashSetTest.java 注: HashSetTest.java使用了未经检查或不安全的操作。 注: 有关详细信息, 请使用 -Xlint:unchecked 重新编译。 f:\tang>java HashSetTest Person@6236515 lisi9....29 Person@6236435 lisi1....21 Person@62364dd lisi7....27 Person@6236489 lisi4....24 */ 例子2-2 package test; import java.util.HashSet; import java.util.Iterator; //package cn.itcast.p.bean; class Person /*extends Object*/// implements Comparable { private String name; private int age; public Person() { super(); } public Person(String name, int age) { super(); this.name = name; this.age = age; } @Override//覆盖hasCode() public int hashCode() { // System.out.println(this+".......hashCode"); return name.hashCode()+age*27; // return 100; } @Override//覆盖equals方法 public boolean equals(Object obj) { if(this == obj) return true; if(!(obj instanceof Person)) throw new ClassCastException("类型错误"); // System.out.println(this+"....equals....."+obj); Person p = (Person)obj; return this.name.equals(p.name) && this.age == p.age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { // TODO Auto-generated method stub return "姓名: "+this.name+"; 年龄"+this.age; } } //import cn.itcast.p.bean.Person; /* * 往hashSet集合中存储Person对象。如果姓名和年龄相同,视为同一个人。视为相同元素。 */ public class HashSetDemo { public static void main(String[] args) { HashSet hs = new HashSet(); /* * HashSet集合数据结构是哈希表,所以存储元素的时候, * 使用的元素的hashCode方法来确定位置,如果位置相同,在通过元素的equals来确定是否相同。 * */ hs.add(new Person("lisi4",24)); hs.add(new Person("lisi7",27)); hs.add(new Person("lisi1",21)); hs.add(new Person("lisi9",29)); hs.add(new Person("lisi7",27)); System.out.println(hs); Iterator it = hs.iterator(); while(it.hasNext()){ Person p = (Person)it.next(); //it.next()是Object对象,必须要强转,如果不强转的话,则会输出对象的哈希码 //System.out.println(p); //System.out.println(p.getName()+"...."+p.getAge()); } } } 输出结果如下:(和例子2有所不同,下面的结果是覆盖了父类Object的toString方法,所运行出来的结果。如果不覆盖,则输出每个对象的哈希码) [姓名: lisi9; 年龄29, 姓名: lisi1; 年龄21, 姓名: lisi7; 年龄27, 姓名: lisi4; 年龄24] 例子2-3: package test; import java.util.HashSet; import java.util.Iterator; //package cn.itcast.p.bean; class Person /*extends Object*/// implements Comparable { private String name; private int age; public Person() { super(); } public Person(String name, int age) { super(); this.name = name; this.age = age; } @Override//覆盖hasCode() public int hashCode() { // System.out.println(this+".......hashCode"); return name.hashCode()+age*27; // return 100; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { // TODO Auto-generated method stub return "姓名: "+this.name+"; 年龄"+this.age; } } //import cn.itcast.p.bean.Person; /* * 往hashSet集合中存储Person对象。如果姓名和年龄相同,视为同一个人。视为相同元素。 */ public class HashSetDemo { /** * @param args */ public static void main(String[] args) { HashSet hs = new HashSet(); /* * HashSet集合数据结构是哈希表,所以存储元素的时候, * 使用的元素的hashCode方法来确定位置,如果位置相同,在通过元素的equals来确定是否相同。 * */ //hs.add(new Demo("abc")); hs.add(new Person("lisi4",24)); hs.add(new Person("lisi7",27)); hs.add(new Person("lisi1",21)); hs.add(new Person("lisi9",29)); hs.add(new Person("lisi7",27)); //System.out.println(hs); Iterator it = hs.iterator(); while(it.hasNext()){ Person p = (Person)it.next(); //it.next()是Object对象,必须要强转,如果不强转的话,则会输出对象的哈希码 //System.out.println(p); System.out.println(p.getName()+"...."+p.getAge()); } } } 结果如下:(由于没有覆盖equals方法的原因) lisi9....29 lisi1....21 lisi7....27 lisi7....27 lisi4....24 例子3: import java.util.HashSet; import java.util.Iterator; public class HashSetTest { public static void main(String[] args) { HashSet hs = new HashSet(); hs.add("hehe"); hs.add("heihei"); hs.add("hahah"); hs.add("xixii"); hs.add("hehe"); Iterator it = hs.iterator(); while(it.hasNext()){ System.out.println(it.next()); } } } f:\tang>javac HashSetTest.java 注: HashSetTest.java使用了未经检查或不安全的操作。 注: 有关详细信息, 请使用 -Xlint:unchecked 重新编译。 f:\tang>java HashSetTest heihei hehe hahah xixii //重复元素只会输出一次,而且无序 f:\tang> 例子4: package test; import java.util.HashSet; import java.util.Iterator; import java.util.LinkedHashSet; public class HashSetDemo { public static void main(String[] args) { HashSet hs = new HashSet(); hs.add("hahah"); hs.add("hehe"); hs.add("heihei"); hs.add("xixii"); hs.add("hehe"); hs.add(1.2);//浮点型 hs.add(1234);//整型 Iterator it = hs.iterator(); while (it.hasNext()) { System.out.println(it.next()); } } } 以上程序不会报错,运行结果如下: (是由于没有使用泛型造成的) heihei hehe 1234 hahah 1.2 xixii
Java 2集合框架图  集合接口:6个接口(短虚线表示),表示不同集合类型,是集合框架的基础。  抽象类:5个抽象类(长虚线表示),对集合接口的部分实现。可扩展为自定义集合类。  实现类:8个实现类(实线表示),对接口的具体实现。  在很大程度上,一旦您理解了接口,您就理解了框架。虽然您总要创建接口特定的实现,但访问实际集合方法应该限制在接口方法的使用上;因此,允许您更改基本的数据结构而不必改变其它代码。  · Collection 接口是一组允许重复的对象。  · Set 接口继承 Collection,但不允许重复,使用自己内部的一个排列机制。  · List 接口继承 Collection,允许重复,以元素安插的次序来放置元素,不会重新排列。  · Map接口是一组成对的键-对象,即所持有的是key-value pairs。Map中不能有重复的key。拥有自己的内部排列机制。  · 容器中的元素类型都为Object。从容器取得元素时,必须把它转换成原来的类型。  Java 2简化集合框架图  集合接口  1.Collection 接口  用于表示任何对象或元素组。想要尽可能以常规方式处理一组元素时,就使用这一接口。  (1) 单元素添加、删除操作:   boolean add(Object o):将对象添加给集合   boolean remove(Object o): 如果集合中有与o相匹配的对象,则删除对象o  (2) 查询操作:   int size() :返回当前集合元素的数量   boolean isEmpty() :判断集合是否有任何元素   boolean contains(Object o) :查找集合是否含有对象o

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值