第四周总结

周总结

1.常用类之Object (重点)

int hashcode():哈希码值(理解为"地址值",并非实际地址值) 了解
String toString():重点
	String toString():返回对象的字符串表示形式,结果应该是一个更容易让人读懂的信息表达式(建议
	所有的子类都覆盖这个方法   几乎Java所有类都会重写toString()方法
boolean equals(Object obj):比较两个数据(引用类型) 是否相等
	Object的equals方法,默认比较的是两个引用类型的地址值是否相等,建议子类需要
	重写这个equals(),重写之后比较的是两个对象的成员信息是否相同!(Java中所有类
	都会重写!) ,重写equals方法,必须同时重写hashCode()方法;重写equals:比较每一个
	对象的成员信息是否相同 如果一样,还要比较每一个成员信息 hashCode()哈希码值
	是否一样,如果都相同,系统认为这个两个人是一样的!
clone():克隆
	protected Object clone() throws CloneNotSupportedException  创建对象并返回它
	的"副本"方法里面本身就会带有CloneNotSupportedException:克隆不支持的异常(当要对
    某个Object的类进行克隆如果这个类不能实现cloneable接口,那么就会出现这个异常)

2.Scanner类提供一个判断功能

构造方法:
 *      public Scanner(InputStream source) 创建键盘录入对象
 *
 *      创建一个文本扫描器
 *              Scanner 对象名 = new Scanner(System.in) ;
 *              --->System类---变量名
 *              public static final InputStream in
 * 成员方法:
 *
 * nextXXX():获取功能
 *   public int nextInt() :录入int类型
 *   public String nextLine() ;录入String类型
 *
 * 判断功能:
 *      public boolean hasNextInt():判断录入的下一个数据是否为int类型,是,返回true,否则false
 *      public boolean hasNextLine():判断录入的下一个数据为一行内容
 *
 *
 *      键盘录入的时候
 *                  先录入int,在录入String ----nextLine() ,这块会出现被漏掉("回车符号")
 *                  解决方案:
 *                          1)在第一个录入int之后,重新创建一个新的键盘录入对象Scanner ,然后在使用nextLine()
 *                          2)在录入String---- String next()

3.String以及StringBuffer(字符串缓冲区) (重点)

* String类: 这个类final修饰不能被继承
 * 字符串是不变; 它们的值在创建后不能被更改(字符串是一个常量,存储在常量池中)
 *
 * 构造方法:
 *      public String():空字符串    类似于 String s = "" ;
 *      public String(String original):构造一个字符串对象,里面指定一个字符串常量值
 *      public String(byte[] bytes) :使用平台默认字符集(idea默认utf-8)解析解码--->字节数组--->字符串
 *      String(byte[] bytes, int offset, int length) :将一部分字节数组构造成字符串
 *      public String(char[] value):将字符数组---构造成String
 *      public String(char[] value,int offseet,int len):将一部分字符串数组构造成字符串
 *
 *
 *
 *面试题:
 *      数组中没有length(),字符串有没有length(),集合中没有有length()?
 *              数组 没有length(),length属性  数组对象.length
 *              字符串有length(),
 *              集合没有,获取集合中 元素数 size()
 * 面试题:
 *	 String s = new String("hello") ;
 * 		和String s = "hello" ; 有什么区别?分别创建了几个对象?
 *
 * 	   区别
 * 	        前者:在堆内存中开辟空间,然后字符串值常量---指向常量池, 两个对象
 * 	        后者:推荐的方式,直接常量赋值,直接在常量池中找,有就返回地址,没有,开辟常量空间!	
* String类相关的获取功能
 *      1)public char charAt(int index) :获取指定索引处的字符
 *      2)int length():获取字符串的长度
 *      3)public String concat(String str)拼接功能-- 将一个字符串拼接到指定字符串的后面(末尾追加)
 *      4)public String substring(int beginIndex):截取--->从指定位置开始截取,默认截取到末尾结束!
 *      public String substring(int beginIndex, int endIndex) 截取--->从指定位置开始截取到指定位置结束
 *                              包前不包后(包含第一个位置,不包含最后一个位置,只能取到endIndex-1处)
 *      5)public String[] split(String regex):拆分(分割) ,按照指定的分割符将字符串拆分成字符串数组
 *      6)public int indexOf(int ch) :返回此字符第一次在字符串中出现的索引值
 *       public int lastIndexOf(int ch):返回此字符最后一次在字符串中出现的索引值
 * String类的转换功能
 *      1)char[] toCharArray() 将字符串转换成字符数组
 *      2)byte[] getBytes() 平台默认字符集编码(String--->byte[])和
 *       byte[] getBytes(String charset):指定的字符集进行编码
 *      String(byte[] bytes) :(bytes[]--->String  ) 平台默认字符集解码
 *      String(byte[] bytes,String charset) :(bytes[]--->String  ) 指定字符集解码
 *
 *      3)public String toLowerCase():将字符串转换成小写
 *         public String toUpperCase():将字符串转换成大写
 *
 *      4)万能方法:  可以将任何数据类型---->String
 *      public static String valueOf(int i/float....Object)
 *
 *      编码和解码必须一致,否则乱码!
String的判断/替换/去除两端空格 (了解)相关功能
 *      判断功能:
 *              boolean contains(String str):判断大串中是否包含指定子字符串
 *              boolean endsWith(String suffix):判断是否以指定结尾的字符串
 *              public boolean startsWith(String prefix):判断是否指定的字符串开头
 *              boolean equals(Object anObject)。:比较两个字符串内容是否相同
 *              boolean equalsIgnoreCase(String anotherString) :不区分大小写比较两个字符串是否相同
 *              public boolean isEmpty():判断字符串是否空 ,长度为0,true

## StringBuffer和StringBuilder的区别?

 * StringBuffer:线程安全的类,支持可变字符序列!
 * 线程-->依赖于进程,线程执行的最小单元!  (这周多线程讲)
 * 线程安全----->意味着 "同步"---->执行效率低
 *举例: 银行类的网站/医院平台
 * 线程不安全----> "不同步"---->执行效率高
 * 举例:
 *      论坛网站
 *
 * 构造方法:
 *      public StringBuffer()  --->空参构造,初始容量16个字符
 *      public StringBuffer(int capacity)--->指定容量大小的字符串字符串缓冲区(很少用)
 *      public StringBuffer(String str)--->将指定的字符串内容构造到字符串缓冲区中,容量=当前str的长度+16
 *
 *     int length()获取字符串缓冲区长度
 *     int capacity()  :获取容量大小
 * * StringBuffer的追加和插入
 *       public StringBuffer append(任意Java类型):将指定的类型追加字符串缓冲区的序列中,返回自己本身
 *       public StringBuffer insert(int index,String str/可以任意Java类型) 在指定位置处插入指定的数据,返回字符串缓冲区本身
 *
 *

## * StringBuufer的获取功能

 *          public char charAt(int index):获取字符串缓冲区中指定位置的字符,返回指定的字符
 * StringBuffer的删除
 *          StringBuffer delete(int start, int end)  :删除从指定位置开始到指定位置结束(end-1)的字符,返回字符串缓冲区本身
 *          StringBuffer deleteCharAt(int index):删除指定位置处的字符,返回值字符串缓冲区本身
 *StringBuffer的替换功能:
 *          public StringBuffer replace(int start,int end,String str)
 *                      将字符串缓冲区中的从指定位置开始到指定位置结束(end-1)的字符序列使用指定的字符串进行替换
 *
 *StringBuffer的截取功能:
 *            public String substring(int beginIndex)
 *            public String substring(int beginIndex,int endIndex)
 * *  String---->StringBuffer
 *  StringBuffer---->String
 */
public class StringBufferDemo4 {
    public static void main(String[] args) {

        //String---->StringBuffer
        String s = "hello" ;
       /* String s = "hello" ;
        StringBuffer sb = s ;*/ //两个类型不匹配
        //方式1 :使用StringBuffer(String str)有参构造
        StringBuffer sb = new StringBuffer(s) ;
        System.out.println("sb:"+sb) ;

        System.out.println("-----------------------------------") ;
        //方式2:使用StringBuffer()空参构造,结合append(String str)追加
        StringBuffer sb2 = new StringBuffer() ;
        sb2.append(s) ;
        System.out.println("sb2:"+sb2);


        System.out.println("----------------------------------------------------");

        //StringBuffer---->String
        StringBuffer buffer = new StringBuffer("helloJavaEE") ;
        //方式1:StringBuffer--->public String toString()
        String str = buffer.toString();
        System.out.println(str) ;
        System.out.println("----------------------------------------------------") ;
        //方式2:String类----->构造方法public String(StringBuffer buffer)
        String str2 = new String(buffer) ;
        System.out.println(str2);


    }
}

## String和StringBuffer/StringBuilder的区别?

 *      String:是一个常量,一旦被赋值,其值不能被更改 ,不可变的字符序列!
 *           作为形式参数,形式参数的改变不影响实际参数(和基本类型作为形式参数传递的效果一致 ,特殊的引用类型)
 *      StringBuffer:支持可变的字符串徐磊,线程安全的类--->同步的--->执行效率低
 *                   StringBuffer的大部分功能--->synchronzied:同步锁(悲观锁)(多线程去讲)
 *           作为形式参数,形式参数的改变直接影响实际参数
 *      StringBuilder:和StringBuffer具备相互兼容的API,线程不安全的类---不同步的---->执行效率高
 *              单线程程序(只考虑效率)中,使用StringBuilder去替代StringBuffer
 *              多线程环境下(要考虑安全),使用StringBuffer

4.java.util.Date:精确到毫秒的日期 (重点)

String日期文本<--->java.util.Date进行相互转换
 *  Date日期个--->String格式化
 *      public final String format(Date date)
 *  构造方法
 *  SimpleDateFormat(String pattern)        pattern模式  :  y:代表年              yyyy 代表整个年份 :2022
 *                                                         M:代表月份                MM       11  07  06
 *                                                         d:月份中的日               dd      03 11 01
 *                                                         H:0-23(一天的小数数)       HH
 *                                                         m:小时的分钟数             mm
 *
 *
 * String日期文本---->Date 解析
 * public Date parse(String source)  throws ParseException :
 *      如果String日期文本 和转换器SimpleDateFormat(String pattern) 里面的模式不匹配就会造成解析异常!
 *          String s = "2008-5-12"
 *        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd ") ;//解析出问题了!
 *
ublic class DateDemo2 {
    public static void main(String[] args) throws ParseException {
        //将Date---->String 格式化
        //创建一个Date对象,当前系统日期对象
        Date date = new Date() ;
        //SimpleDateFormat(String pattern)   :转换器
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss") ;
        //public final String format(Date date)
        String dateStr = sdf.format(date);
        System.out.println(dateStr);
        System.out.println("---------------------------------------------------") ;
        //给定一个日期文本 String---->Date (重点)
        String str = "2020-12-31" ;
        //中间桥梁
//        SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy年MM月dd日") ;//模式不匹配
        SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd") ;
        //public Date parse(String source)  throws ParseException :
        Date date2 = sdf2.parse(str);
        System.out.println(date2);

    }
}

5.Integer/Character

基本类型四类八种---->八种引用类型 

Integer i = new Integer(100) ;
i += 100 ;

i?



jdk5以后的新特性:自动拆装箱  --->装箱:基本类型---自动提示引用类型
							 拆箱:引用类型----降为 基本类型
byte ----  Byte
short ---- Short
int ----   Integer
long ---- Long
float ---- Float
double ----Double
char   ----Character
boolean ----Boolean

   
   String---Integer-->int        Integer.parseInt(数字字符串) 
   String --Long-- long          Long.parseLong(String数据)
   
   String   Float ---->float     Float.parseFloat("小数字符串")
 * Integer的构造方法:
 * public Integer(int value) :将int类型数据包装为Integer类型
 * public Integer(String s)throws NumberFormatException :将字符串类型包装Integer类型,如果字符串非数字字符串,
 * 就会出现NumberFormatExceptio数字格式化异常
 *
 * jdk5以后的新特性:自动拆装箱      /静态导入(导入到方法的级别,前提方法必须为静态)/增强for循环/可变参数...
 *      基本类型会自动装箱为 引用类型:    int-->Integer
 *      引用类型会拆箱为 基本类型  :     Integer-->int
 */
public class IntegerDemo2 {
    public static void main(String[] args) {
        //创建一个Integer类对象
        //public Integer(int value) :将int类型数据包装为Integer类型
        Integer i = new Integer(100) ;  //将int----Integer类型
        i += 200 ;                            //将Integer--->int--->在和200相加---->int--->Integer
        System.out.println(i) ;

        /*
        * 利用反编译工具类:将上面的字节码文件---反编译
        * 	Integer i = new Integer(100);//100 装箱 Integer
        *                                               //public int intValue():Integer--->int 拆箱
		    i = Integer.valueOf(i.intValue() + 200);  // --->(i.intValue()+200)--->300赋值给i
		    *                                       //将一个整数赋值给Integer--->底层执行的Integer.valueOf(300)
		    System.out.println(i);               //输出结果
        * */

        System.out.println("------------------------------------------------") ;
        //public Integer(String s)throws NumberFormatException :
        //String s = "hello" ; //字符串必须为数字字符串
        String s = "10" ;
        Integer ii = new Integer(s) ;
        System.out.println(ii);


        //Integer i = 100 ;
       // Integer i = new Integer(100) ;


    }
}

 * 类型转换
 *
 *      int---->String 静态方法public static String toString(int i)
 *      String--->int  (使用居多)  public static int parseInt(String s)
 *                  前后端交互:前端提交的数据几乎String类型
 */
public class IntegerDemo3 {
    public static void main(String[] args) {


        //int--->String
        int i = 100 ;
        String result = "" ;
        //方式1:字符串拼接符号+
        result += i;
        System.out.println(result) ;
        System.out.println("---------------------------------");
        //方式2:int--->Integer---->String
        //Integer(int i) ---->publict String toString()
        Integer ig = new Integer(i) ;
        String result2 = ig.toString();
        System.out.println(result2); //"100"
        System.out.println("---------------------------------");
        //方式3:Integer的静态方法public static String toString(int i)
        String result3 = Integer.toString(i);
        System.out.println(result3);

        System.out.println("--------------------------------------") ;
       // String---->int
        String s = "20" ; //数字字符串
       //方式1:String--->Integer --->public int intValue()
        Integer ig2 = new Integer(s) ;
        int value = ig2.intValue();
        System.out.println(value); //20
        System.out.println("-----------------------------------------") ;
        //方式2:直接转换public static int parseInt(String s) throws NumberFormatException
        int value2 = Integer.parseInt(s);
        System.out.println(value2); //20


        //parseXXX方法在任意的基本类型对应的类型都存在(万能方法)
        //String--Long-->long---->Long.parseLong(字符串)
        //String--Float-->float--->Float.parseFloat(小数字符串)

    }
}


6.System/Random/Math/BigDecimal小数精确计算

**System类: 不能实例化**
 *      三个成员变量 ---静态常量
 *          static PrintStream err“标准”错误输出流。
 *          static InputStream in“标准”输入流。   (InputStream:字节输入流 --读数据)
 *          static PrintStream out  “标准”输出流。(PrintStream字节打印流--->
 *          OutputStream字节输出流---写/打印)
 *
 *成员方法
 *  public static long currentTimeMillis():获取系统时间毫秒值(应用场景:计算程序的执行效率)
 *  public static void exit(int status):参数为0,正常终止jvm
 *  public static void gc():手动开启垃圾回收器
 *           开启垃圾回收器,会调用Object类的finalize()垃圾回收方法
 *  public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)  :复制数组
 *              参数1:原数组
 *              参数2:原数组中的某个位置
 *              参数3:目标数组
 *              参数4:目标数组中的某个位置
 *              参数5:从原数组的那个位置srcPos指定长度复制到目标数组中
**Random:伪随机数生成器**
 *      public Random() 构造方法:创建新的随机数生成器
 *      public Random(long seed) 构造方法:创建新的随机数生成器(以指定的long 的类型计算随机数):每一		次均分布局一样的 (不推荐)
 *      成员方法
 *          public int nextInt():获取的int类型的取值范围
 *          public int nextInt(int n):[0,n)随机数
 */
public class RandomDemo {
    public static void main(String[] args) {
        //使用Random类产生随机数
        Random random = new Random() ;
        //10个随机数
        for(int x = 0 ; x < 10 ; x++){
           // int n = random.nextInt();
            int n = random.nextInt(100);
            System.out.println(n);
        }
    }
}

 *  BigDecimal:作用针对小数进行精确计算
 构造方法
 *   BigDecimal(String value):参数 "小数字符串值"
 *   BigDecimal(int value):整数
 *   BigDecimal(double value):浮动类型
 *
 *
 *成员方法:
 *   public BigDecimal add(BigDecimal augend):加
 *   public BigDecimal subtract(BigDecimal subtrahend)减
 *   public BigDecimal multiply(BigDecimal multiplicand)乘
 *   public BigDecimal divide(BigDecimal divisor):除
 *   public BigDecimal divide(BigDecimal divisor,int scale,int roundingMode)
 *              参数1:除数值
 *              参数2:scale保留小数位数
 *              参数3:roundingMode舍入的模式  BigDecimal提供静态常量
 *
 */
public class BigDecimalDemo {
    public static void main(String[] args) {

        //创建BigDecimal(String value):参数 "小数字符串值"
        BigDecimal bigDecimal = new BigDecimal("1.05") ;
        BigDecimal bigDecimal2 = new BigDecimal("0.5") ;
        /**
         * public BigDecimal add(BigDecimal augend):加
         *  public BigDecimal subtract(BigDecimal subtrahend)减
         *   public BigDecimal multiply(BigDecimal multiplicand)乘
         *  public BigDecimal divide(BigDecimal divisor):除
         */
        System.out.println(bigDecimal.add(bigDecimal2));
        System.out.println(bigDecimal.subtract(bigDecimal2));
        System.out.println(bigDecimal.multiply(bigDecimal2));
        System.out.println(bigDecimal.divide(bigDecimal2));
        /**
         * public BigDecimal divide(BigDecimal divisor,int scale,int roundingMode)
         *              参数1:除数值
         *               参数2:scale保留小数位数
         *                参数3:roundingMode舍入的模式  BigDecimal提供静态常量
         */
        System.out.println(bigDecimal.divide(bigDecimal2,2,BigDecimal.ROUND_HALF_UP)); //支持四舍五入
    }
}

7. 支持可变的长度----“集合”(开发中,使用最频繁的)


只能存储引用类型 Collection<泛型>				---> Map<K,V> 支持散列表

集合的结构体系
集合的通用功能

8.Collection的遍历方式

 * Colleciton:没有jdk提供直接实现,通过具体的子接口List/Set的子实现类实现
 *
 * 创建集合的时候<E> :里面存储的引用类型的元素
 *      模拟数组,创建集合的时候就明确了集合中存储的数据类型,否则导致程序不安全!
 *
 * 常用基本功能:
 *      添加
 *          boolean add(E e):添加元素 E--->Object任意Java元素
 *      删除
 *           删除集合中的元素boolean remove(Object o)
 *           暴力删除(将集合全部清空)void clear()
 *
 *      判断
 *              boolean isEmpty():判断集合是否为空
 *              boolean contains(Object o):判断集合是否包含指定的元素
 *
 */
public class CollectionDemo {
    public static void main(String[] args) {
        //创建一个Collection,没有带泛型
       // Collection  c = new ArrayList() ;
        //创建的集合,带上<泛型>
        Collection<String> c = new ArrayList<>() ; //new 集合<默认和前面的泛型类型一致,可以不写> () ;  jdk7新特性 泛型推断
        System.out.println(c);
        // boolean add(E e):添加元素 E--->Object任意Java元素
       // boolean flag1 = c.add("hello") ;

       // boolean flag2 = c.add(100) ;
       // boolean flag3 = c.add('A') ;
        /**
         *   public boolean add(E e) {
         *        ///...中间的逻辑在数据扩容
         *         return true;
         *     }
         */
       // System.out.println(flag1+"---"+flag2+"---"+flag3);
        c.add("hello") ;
        c.add("world") ;
        c.add("javaee") ;
        //c.add(100) ;

        System.out.println("--------------------------------") ;
//        删除集合中的元素boolean remove(Object o)
//            暴力删除(将集合全部清空)void clear()
        //System.out.println(c.remove("javaee"));
//        c.clear();
        //boolean isEmpty():判断集合是否为空
        // boolean contains(Object o):判断集合是否包含指定的元素
       // System.out.println(c.isEmpty()) ;
        System.out.println(c.contains("高圆圆"));
        System.out.println(c.contains("world"));
        System.out.println(c);

    }
}

 * 遍历
 *      1)将集合转换对象数组
 *              Object[] toArray()  不推荐,还是变成数组!
 *
 *
 */
//jdk提供@SuppressWarnings("all")  解决警告问题 (实际开发中,项目打包--安装-->部署--->上线)
//@SuppressWarnings("all") //压制警告
public class CollectionDemo2 {
    public static void main(String[] args) {
        //创建一个集合--->存储String
        Collection<String>  c  = new ArrayList<>() ;
        //添加字符串数据
        c.add("hello") ;
        c.add("world") ;
        c.add("javaEE") ;
        c.add("Mysql") ;
        System.out.println(c);

        //转换成数组Object[] toArray()
        Object[] objects = c.toArray();
        for(int x = 0 ; x < objects.length ;x++){
            //objects[x]数组中---    相当于每一个元素 Object 对象名 = new String();//多态 向上转型
           // System.out.println(objects[x]);
            //遍历这些字符串并且同时它的长度
           // System.out.println(objects[x]+"---"+objects[x].length()); //Object类型没有length()
            //向下转型
            String s = (String) objects[x];
            System.out.println(s+"---"+s.length());


        }

    }
}

 * Collection的专有遍历方式:迭代器
 * Iterator<E> iterator()
 *          Iterator接口提供了功能:Object next() :获取下一个可以遍历的元素
 *          boolean hasNext():判断如果迭代器里面有元素,则返回true,然后在获取!
 *
 *          需求:使用Collection存储String类型,并去使用迭代器将元素一一遍历,打印控制台
 *
 *  1)使用Collection集合存储5个学生,使用迭代器的这种方式进行遍历!
 *  2)使用Collection集合存储String类型,如果这个字符串是"world",那么添加一个新的字符串数据"javaEE",
 *  然后遍历集合中的数据
 */
public class CollectionDemo {
    public static void main(String[] args)  {
        //创建一个集合对象
        Collection<String> c = new ArrayList<>() ;

        //存储String类型的元素
        c.add("hello") ;
        c.add("world") ;
        c.add("java") ;
        c.add("javaee") ;

        //Iterator<E> iterator() 获取迭代器
        Iterator<String> it = c.iterator();

        // Iterator接口提供了功能:E next() :获取下一个可以遍历的元素
        //先判断,在获取
        //boolean hasNext():判断如果迭代器里面有元素,则返回true,然后在获取!

        /*
        if(it.hasNext()){
            //第一次获取
            String next = it.next();
            System.out.println(next);
        }

        //第二次获取
        if(it.hasNext()){
            System.out.println(it.next());
        }

        //第三次获取
        if(it.hasNext()){
            System.out.println(it.next());
        }
        //第四次获取
        if(it.hasNext()){
            System.out.println(it.next());
        }
//        System.out.println(it.next());
        //java.util.NoSuchElementException 没有元素的异常
        //第五次获取
        if(it.hasNext()){
            System.out.println(it.next());
        }

         */
        //迭代器标准代码
        while(it.hasNext()){
            //有下一个元素
            //再获取
            String  s = it.next() ;
            System.out.println(s+"---"+s.length());
        }

    }
}

9.List和Set的区别

 * List集合的特点
 *      允许集合元素重复(实际应用,List集合如何去重?),而且有序集合(存储和取出一致)
 *
 *  List集合的特有功能:
 *              void add(int index, E element):在指定位置插入新的元素
 *              E get(int index):获取指定位置处的元素
 *              E set(int index,E element):在指定位置处替换(修改)指定的元素
 *             ListIterator<E> listIterator():List集合的专有遍历-->列表迭代器
 *
 */
public class ListDemo {
    public static void main(String[] args) {
        //创建List集合对象--存储String
        List<String> list = new ArrayList<>() ;

        list.add("hello") ;
        list.add("world") ;
        list.add("hello") ;
        list.add("hello") ;
        list.add("javaee") ;
        list.add("javaee") ;
        System.out.println(list) ;
        // void add(int index, E element):在指定位置前面插入新的元素
        list.add(2,"高圆圆") ;
        System.out.println(list);
        System.out.println("-------------------------------------------------") ;
        // E get(int index):获取指定位置处的元素
        System.out.println(list.get(4));
        System.out.println("-----------------------------------------------------");
        // E set(int index,E element):在指定位置处替换(修改)指定的元素
        System.out.println(list.set(1,"mysql"));
        System.out.println(list);

        System.out.println("---------------------------------------------------");
        // ListIterator<E> listIterator():List集合的专有遍历-->列表迭代器
        //ListIterator--->正向列表遍历 :boolean  hasNext()  + E next():获取下一个元素
        //                  反向遍历列表 booean hasPrevious()+E pervious:获取上一个元素 (必须有正向遍历列表)

        ListIterator<String> lit = list.listIterator();
        while(lit.hasNext()){
            //获取
            String s = lit.next() ;
            System.out.println(s+"---"+s.length());
        }
        System.out.println("------------------------------------------");
    /*    while(lit.hasPrevious()){
            //获取
            String s = lit.previous() ;
            System.out.println(s+"---"+s.length());
        }*/


        //将上面List集合中所有元素遍历
        //方式1:List集合继承Collection---->Object[] toArray()
        Object[] objects = list.toArray();
        for(int x = 0 ; x < objects.length; x++){
            String s = (String) objects[x];
            System.out.println(s+"---"+s.length());
        }
        System.out.println("---------------------方式2---------------------");
        // 方式2:Collection的迭代器Iterator iterator()
        Iterator<String> it = list.iterator();
        while(it.hasNext()){
            String s = it.next(); //it.next():使用一次 ,不能使用多次
            System.out.println(s+"---"+s.length());
        }
        System.out.println("---------------------方式3 /方式4---------------------");
        //列表迭代器ListIterator
        //方式4:List集合的get(int index) +size() 的普通for循环
        for(int x = 0 ; x < list.size(); x++){
            //通过角标获取元素
            String s = list.get(x);
            System.out.println(s+"---"+s.length());
        }

        System.out.println("---------------------方式5--------------------");
        /**
         * jdk5新特性 增强for循环---->目的 为了替代迭代器(集合,存储引用类型),简化代码书写程度
         * for(泛型里面存储的数据类型 变量名 : 集合或者数组名称){
         *     使用变量名
         * }
         *
         * 增强for的特点: 前台条件:集合或者数组对象不能为null,否则NullPointerException
         */
        for (String s : list) {
         /*   if("mysql".equals(s)){
                list.add("go") ; // 使用增强for遍历元素,集合添加元素,会出现并发修改异常ConcurrentModificationException
            }*/
            System.out.println(s+"---"+s.length());
        }

    }
}

9. Jdk5里面其他新特性:

  •  1)静态导入---->导入到方法的级别
    
  •     import static 包名.类名.方法名;
    
  •  前提使用静态导入,这个类的方法必须为静态
    
  •  在使用静态导入的时候,导入jdk提供的一些工具类里面静态方法的时候,我们定义的方法不能和它方法名冲突
    
  •  如果冲突了,静态导入是不识别,这个时候必须导入全限定名称 :包名.类名.方法名(xxx)
    
  • 2)可变参数,当一个方法形式参数不知道多少个,这个时候可以使用可变参数(类似一个数组)
    
  •      public  返回值类型 方法名(数据类型... 参数名)
    

*/
import static java.lang.Math.abs;
import static java.lang.Math.max; //最大值
import static java.lang.Math.min; //最小值
import static java.lang.Math.pow; //pow(a,b) a的b次幂
public class JDK5StaticDemo {
public static void main(String[] args) {

    //java.lang.Math:针对数学运算的类
    //public static double/int abs(double/int a,double/int b):求绝对值
    //...都是静态成员方法
    System.out.println(Math.abs(-10));
    System.out.println(Math.abs(100));

    System.out.println(java.lang.Math.abs(-100));//使用到了静态导入,方法名和自定义的方法名冲突了
    System.out.println(max(10,15));
    System.out.println(min(5,3));
    System.out.println(pow(2,3));
    System.out.println("---------------------------------");
    int sum = add(10, 20, 30, 40, 50);
    System.out.println(sum) ;
}

//自定义的abs方法
public static void abs(int a){
    System.out.println(a);
}

//求多个数据和
public  static int add(int...a){//类似一个数组
    int sum = 0 ;
    //遍历
    for(int x = 0 ; x < a.length  ;x++){
        sum += a[x] ;
    }
    return sum ;

}

10.Vector集合的特有功能

package com.qf.vector_02;

import java.util.Enumeration;
import java.util.Vector;

/**
 * @author 高圆圆
 * @date 2022/11/17 11:08
 * Vector集合:线程安全的类(底层结构:数组,查询快,增删慢)
 * 特有功能:
 *      public void addElement(E obj)将指定的元素添加Vector集合中(默认追加)
 *      public Enumeration<E> elements():获取枚举组件接口----->类似于Collection集合的Iterator iterator()
 *              Enumeration接口
 *
 *                          boolean hasMoreElements() 判断是否有更多的元素 ----->类似于Iterator里面的boolean hasNext()
 *                          E  nextElement() :获取下一个元素              ----->类似于Iterator里面的E next()
 *
 *      public E elementAt(int index):通过索引值获取元素   ---->类似List集合的E get(int index)
 *      int size():获取集合元素数
 */
public class VectorDemo {
    public static void main(String[] args) {

        //创建Vector集合
        Vector<String> v = new Vector<>() ;
        System.out.println(v) ;

        // public void addElement(E obj)将指定的元素添加Vector集合中(默认追加)
        v.addElement("hello") ;
        v.addElement("hello") ;
        v.addElement("world") ;
        v.addElement("javaEE") ;
        System.out.println(v);
        System.out.println("------------------------------------------------------") ;
        // public E elementAt(int index):通过索引值获取元素   ---->类似List集合的E get(int index)
        //int size():获取集合元素数
        //特有遍历方式1
        for(int x = 0 ; x < v.size() ;x++){
            String s = v.elementAt(x);
            System.out.println(s);
        }
        System.out.println("------------------------------------------------------") ;
        //特有遍历方式2:
        /*
        public Enumeration<E> elements():获取枚举组件接口----->类似于Collection集合的Iterator iterator()
 *              Enumeration接口
 *
 *                          boolean hasMoreElements() 判断是否有更多的元素 ----->类似于Iterator里面的boolean hasNext()
 *                          E  nextElement() :获取下一个元素              ----->类似于Iterator里面的E next()
         */
        Enumeration<String> en = v.elements();
        while(en.hasMoreElements()){
            String s = en.nextElement();
            System.out.println(s);
        }
    }
}

11.LinkedList集合的特有功能

package com.qf.linkdlist_03;

import com.sun.xml.internal.ws.addressing.WsaActionUtil;

import java.util.LinkedList;

/**
 * @author 高圆圆
 * @date 2022/11/17 11:36
 * LinkedList:
 *      线程不安全,不同步,执行效率高
 *     底层数据结构: 线程结构之链表,查询慢,增删快!
 *
 *     特有功能:
 *          添加元素
 *              public void addFirst(E e) 将指定的元素添加到链表的开头
 *              public void addLast(E e) 将指定的元素添加到链表的末尾
 *              public E getFirst():获取第一个元素
 *              public E getLast():获取最后一个元素
 *              public E removeFirst():删除第一个并返回第一个元素
 *              public E removeLast():删除最后一个元素并返回
 *
 *
 */
public class LinkedListDemo {
    public static void main(String[] args) {
        //创建一个链表
        LinkedList<String> lk = new LinkedList<>() ;
        //添加字符串
        lk.add("hello") ;
        lk.add("world") ;
        lk.add("java") ;
        System.out.println(lk) ;
        /*
         public void addFirst(E e) 将指定的元素添加到链表的开头
 *              public void addLast(E e) 将指定的元素添加到链表的末尾
 *              public E getFirst():获取第一个元素
 *              public E getLast():获取最后一个元素
 *              public E removeFirst():删除第一个并返回第一个元素
 *              public E removeLast():删除最后一个元素并返回
         */
        lk.addFirst("JavaEE"); ;
        lk.addLast("Android");
        System.out.println(lk);
        System.out.println(lk.getFirst());
        System.out.println(lk.getLast());
        System.out.println(lk.removeFirst());
        System.out.println(lk);
    }
}

12.使用LinkedList集合模拟栈结构特点:先进后出

package com.qf.linkdlist_03;

import java.util.LinkedList;

/**
 * @author 高圆圆
 * @date 2022/11/17 11:50
 * 自定义一个类MyStack,模拟栈--->里面使用LinkedList集合的功能
 *
 * interface 接口名<T>{}
 *
 *class 类名<T>{}
 * public <T> T 方法名(形式参数列表)  泛型定义在方法上
 */
public class MyStack<T> {//MyStack<String>
    //提供一个成员变量
    private LinkedList<T> lk ;
    //无参构造方法
    public MyStack(){
        //创建一个LinkedList集合对象
        lk = new LinkedList<>() ;

    }
    //定义一个功能,添加元素
    public void addElement(T t){
        //使用LinkedList集合的功能
        lk.addFirst(t) ;
        //System.out.println(lk);
    }
    //获取元素
    public T getElement(){
        return lk.removeFirst() ;//删除第一个并返回 --->相当于LinkedList的pop()弹栈
    }

    //提供一个判断
    public boolean myStackIsEmpty(){
        return lk.isEmpty() ;
    }

}

package com.qf.linkdlist_03;

/**
 * @author 高圆圆
 * @date 2022/11/17 11:49
 * 使用LinkedList来模拟栈结构特点:先进后出
 */

public class LinkedListTest {
    public static void main(String[] args) {
        //测试
        MyStack<String> my = new MyStack<>() ;//本质创建了LinkedList集合对象
        my.addElement("hello") ;
        my.addElement("world") ;
        my.addElement("javaee") ;
        my.addElement("android") ;

        //第一次获取
      /*  System.out.println(my.getElement());
        //第二次获取
        System.out.println(my.getElement());
        //第三次
        System.out.println(my.getElement());
        //第四次
        System.out.println(my.getElement());
        System.out.println(my.getElement());*/
        while (!my.myStackIsEmpty()){
            //如果不为,才获取元素
            System.out.println(my.getElement());
        }
    }
}

13.TreeSet集合的自然排序---->存储类型需要实现Comparable接口

package com.qf.treeset_05;

/**
 * @author 高圆圆
 * @date 2022/11/17 15:55
 */
//实现自然排序
public class Student  implements Comparable<Student>{
    private String name ;
    private int age ;

    public Student() {
    }

    public Student(String name, int age) {
        this.name = name;
        this.age = 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() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    //重写方法
    @Override
    public int compareTo(Student s) {
        //存储s1-s8  s1就是作为根节点
        //主要条件:
        // 按照学生的年龄从小到大排序
      /*  int num = this.age -s.age ;
        //次要条件(自己分析):如果年龄相同,还要比较姓名是否一样的
        int num2 = (num==0)?(this.name.compareTo(s.name)):num;
        return num2;*/


        //主要条件:按照学生的姓名长度比较: 从小到大比较
        int num = this.name.length() - s.name.length() ;
        //次要条件:如果num==0,姓名长度一样,比较姓名内容是否一样
        int num2 = (num==0)?(this.name.compareTo(s.name)):num;
        //次要条件2:如果姓名长度一样,姓名内容也一样,还要比较年龄是否一样
        int num3 = (num2==0)?(this.age-s.age):num2;
        return num3 ;


    }
}

package com.qf.treeset_05;

import java.util.TreeSet;

/**
 * @author 高圆圆
 * @date 2022/11/17 15:54
 * TreeSet<Stdudent>,使用TreeSet存储自定义类型
 * 存储的Student类型实现Comparable,完成自然排序!
 *                  排序条件(主要条件)
 *                          按照学生的年龄从小到大排序
 *
 *                         自己的分析次要条件:
 *
 *
 *  使用TreeSet<Student>,按照自然排序排序
 *              主要条件:
 *                      按需学生的姓名的长度从小到大比较
 *
 *               次要条件:长度相同,比较姓名内容是否相同
 *
 *
 * 键盘录入5个学生姓名,数学成绩,英语成绩,语文成绩 ,按照学生的总分从高到到低排序!
 *
 *
 */
public class TreeSetDemo {
    public static void main(String[] args) {
        //创建TreeSet集合
        TreeSet<Student> ts = new TreeSet<Student>() ;//无参构造方法,自然排序

        //创建一堆学生
        Student s1 = new Student("gaoyuanyuan",32) ;
        Student s2 = new Student("gaoyuayuan",32) ;
        Student s3 = new Student("liushishi",36) ;
        Student s4 = new Student("wangbaoqi",36) ;
        Student s5 = new Student("wenzhang",28) ;
        Student s6 = new Student("wenzhang",28) ;
        Student s7 = new Student("mabaoguo",65) ;
        Student s8 = new Student("mabaoguo",56) ;
        Student s9 = new Student("gaoyuanyuan",35) ;
        Student s10 = new Student("zhangwen",35) ;

        //添加
        //Student类没有实现自然排序接口
        //java.lang.ClassCastException: com.qf.treeset_05.Student cannot be cast to java.lang.Comparable
        ts.add(s1) ;
        ts.add(s2) ;
        ts.add(s3) ;
        ts.add(s4) ;
        ts.add(s5) ;
        ts.add(s6) ;
        ts.add(s7) ;
        ts.add(s8) ;
        ts.add(s9);
        ts.add(s10);

        //遍历
        for(Student s:ts){
            System.out.println(s.getName()+"---"+s.getAge());
        }
    }
}

14.TreeSet集合的比较强排序–>Comparator接口

方式1

package com.qf.treeset_06;


import java.util.Comparator;

/**
 * @author 高圆圆
 * @date 2022/11/17 17:12
 */
//自定义类实现Comparator,完成比较器排序
public class MyComparator  implements Comparator<Student> {

    @Override
    public int compare(Student s1, Student s2) {
        //按照学生的年龄从小到大排序(主要条件)
        //s1---->this
        //s2---->s
        int num = s1.getAge() - s2.getAge() ;
        //次要条件:年龄相同,比较姓名是否一致
        int num2 = (num==0)?(s1.getName().compareTo(s2.getName())):num ;
        return num2;
    }
}

package com.qf.treeset_06;

import java.util.Comparator;
import java.util.TreeSet;

/**
 * @author 高圆圆
 * @date 2022/11/17 17:07
 *  存储的Student类型实现Comparable,完成比较器排序
 *                   排序条件(主要条件)
 *                           按照学生的年龄从小到大排序
 *   比较强排序:
 *          TreeSet有参构造方法
 *          public TreeSet(Comparator<? super E> comparator) 按照比较强排序
 */
public class TreeSetDemo {
    public static void main(String[] args) {

        //创建一个TreeSet集合
        //public TreeSet(Comparator<? super E> comparator) 按照比较强排序
        //比较器排序方式1:自定义一个类实现Comparator接口
        
        Comparator<Student> my = new MyComparator() ;  //接口多态
        TreeSet<Student> ts = new TreeSet<>(my) ;

    
        //创建学生对象
        Student s1 = new Student("wenzhang",25) ;
        Student s2 = new Student("wenzhang",25) ;
        Student s3 = new Student("gaoyuanyuan",25) ;
        Student s4 = new Student("luozhixiang",32) ;
        Student s5 = new Student("gaoyuanyuan",22) ;
        Student s6 = new Student("mayili",22) ;
        //添加
        ts.add(s1) ;
        ts.add(s2) ;
        ts.add(s3) ;
        ts.add(s4) ;
        ts.add(s5) ;
        ts.add(s6) ;
        for(Student s:ts){
            System.out.println(s.getName()+"---"+s.getAge());
        }
    }
}

方式2:Comparator接口匿名内部类

package com.qf.treeset_06;

import java.util.Comparator;
import java.util.TreeSet;

/**
 * @author 高圆圆
 * @date 2022/11/17 17:07
 *  存储的Student类型实现Comparable,完成比较器排序
 *                   排序条件(主要条件)
 *                           按照学生的年龄从小到大排序
 *   比较强排序:
 *          TreeSet有参构造方法
 *          public TreeSet(Comparator<? super E> comparator) 按照比较强排序
 */
public class TreeSetDemo {
    public static void main(String[] args) {

        //创建一个TreeSet集合
     

     //方式2:public TreeSet(Comparator<? super E> comparator) 按照比较强排序,使用接口匿名内部类

        TreeSet<Student> ts = new TreeSet<>(new Comparator<Student>() {
            @Override
            public int compare(Student s1, Student s2) {
                //按照学生的年龄从小到大排序(主要条件)
                //s1---->this
                //s2---->s
                int num = s1.getAge() - s2.getAge() ;
                //次要条件:年龄相同,比较姓名是否一致
                int num2 = (num==0)?(s1.getName().compareTo(s2.getName())):num ;
                return num2;
            }
        }) ;
        //创建学生对象
        Student s1 = new Student("wenzhang",25) ;
        Student s2 = new Student("wenzhang",25) ;
        Student s3 = new Student("gaoyuanyuan",25) ;
        Student s4 = new Student("luozhixiang",32) ;
        Student s5 = new Student("gaoyuanyuan",22) ;
        Student s6 = new Student("mayili",22) ;
        //添加
        ts.add(s1) ;
        ts.add(s2) ;
        ts.add(s3) ;
        ts.add(s4) ;
        ts.add(s5) ;
        ts.add(s6) ;
        for(Student s:ts){
            System.out.println(s.getName()+"---"+s.getAge());
        }
    }
}

15. 引入多线程 (什么是线程,什么是进程)

线程依赖于进程存在!

进程:能够调用系统资源的独立单位!(打开计算机任务管理器,查看进程状态)
多进程:计算机都是支持多进程,提高CPU的使用率!
   开启多个进程的时候,玩游戏的同时可以听音乐,他们并不是同时进行的,而是一点时间片在两个进程之间进行高效切换!

线程:
       能够执行的最小单元!(一个线程可以看成进程的某个任务)

       360软件---->开启---->开启进程
            同时清理内存---同时查杀病毒
多线程的意义:
        多个线程在互相抢占CPU执行权!  线程的执行具有随机性!
        1v3打篮球,3个人抢占篮球几率大,不一定(线程执行的是一个随机的)

 JVM是多线程的吗?
    是一个多线程的,至少有两条线程
    main线程----用户线程
    gc----->垃圾回收器 开启垃圾回收线程(回收没有更多的对象!)

计算机---多进程(意义?)
JVM是多进程的吗?
 *      Java能够直接创建多线程吗?
 *
 *创建线程---->需要创建进程---->需要使用系统资源创建进程
 * Java是不能够直接操作系统资源的,底层语言C是可以操作系统的
 * Jdk提供了Thread类,里面有个start()---->执行线程---底层非Java语言实现的
 *
 *
 * 提供Thread类第一种创建线程的方式
 *      1)自定义一个类 继承的自Thread类
 *      2)重写Thread类的run方法---->完成一些的耗时的操作
 *      3)在main用户线程中,创建当前这个类对象
 *      4)开启线程---->不是run方法,run方法它只是一个普通方法(仅仅执行线程里面的内容:读文件/完成io的操作....)
 *      启动线程start()--->jvm是调用run线程的方法,结果是两个同时执行(具有随机性)
 *
 * 启动线程,想知道哪一个线程执行数据---Thread类提供一些基本功能:
 *      public final void setName(String name):设置线程的名称
 *      public final String getName():获取线程名称

 * 线程的优先级:
 * public static final int MAX_PRIORITY 10  最大优先级
 * public static final int MIN_PRIORITY 1   最大优先级
 * public static final int NORM_PRIORITY 5  默认优先级
 * 优先级越大,线程抢占CPU执行权的几率越大!
 *
 * 给线程设置优先级
 *      public final void setPriority(int newPriority)
 * 获取线程的优先级
 *      public final int getPriority()


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值