当前位置:   article > 正文

JAVA小白学习日记Day6

JAVA小白学习日记Day6

1.List

集合:把具有相同属性的东西放在一起,也可以是容器,把有关的东西都放进去。

List:List是位于java.util下的一个接口,有序集合(也称为序列)。此界面的用户可以精确控制每个元素在列表中的插入位置。用户可以通过整数索引(列表中的位置)访问元素,并在列表中搜索元素。

之前学过的容器  数组,弊端:之能存储指定数据类型,数组的长度不可改变。

List的继承、实现关系:其继承了Collection接口并由AbstractList来实现,Collection又继承了Iterable接口。

List的种类:
ArrayList:底层由数组结构实现Object[],可以存储任何Object类型的对象,是非线程安全的。
LinkedList:List和Deque接口的双向链表实现。实现所有可选列表操作,并允许所有元素(包括null )。所有操作都按照双向链表的预期执行。索引到列表中的操作将从开头或结尾遍历列表,以更接近指定索引的为准。
Vector

ArrayList  扩容方式:
初始容量  10
扩容  1.5倍(右移一位,向下取整)


LinkedList  链表:
ArrayList和LinkedList性能比较
ArrayList是通过数组存储数据的,查找数据非常快
LinkedList查找速度慢,通过双向检索,优化检索速度
ArrayList插入和删除慢
LinkedList插入删除快

 List中方法的代码:

  1. package com.easy719;
  2. import java.util.ArrayList;
  3. import java.util.Iterator;
  4. import java.util.List;
  5. public class EasyList {
  6. //容器 集合
  7. //之前学过的容器 数组
  8. //弊端:只能存储指定数据类型 数组的长度不可改变
  9. //List Set Map
  10. //List 接口
  11. //实现类:ArrayList LinkedList Vector
  12. public static void main(String[] args) {
  13. List list=new ArrayList();
  14. //List 中常用的方法
  15. //添加元素
  16. //各种类型都可,万物皆对象
  17. list.add("A");
  18. list.add(12);
  19. list.add(null);
  20. list.add(33.33);
  21. //获取元素
  22. Object obj=list.get(2);
  23. System.out.println(obj);//null
  24. System.out.println(list);//[A, 12, null, 33.33]
  25. //在指定位置插入元素 其他元素向后移
  26. list.add(1,44);
  27. list.add(5,"B");//可以是5但不能是6,否则越界
  28. System.out.println(list);//[A, 44, 12, null, 33.33, B]
  29. //设置元素
  30. list.set(2,22);
  31. System.out.println(list);//[A, 44, 22, null, 33.33, B]
  32. //是否包含某一个对象
  33. boolean bool=list.contains(22);
  34. System.out.println(bool);//true
  35. bool=list.indexOf(22)!=-1;
  36. System.out.println(bool);//true
  37. //判断是否包含另一个集合的所有元素
  38. List listA=new ArrayList();
  39. listA.add(33.33);
  40. listA.add(null);
  41. bool=list.containsAll(listA);
  42. System.out.println(bool);//true
  43. list.addAll(listA);
  44. System.out.println(list);//[A, 44, 22, null, 33.33, B, 33.33, null]
  45. list.add(listA);
  46. System.out.println(list);//[A, 44, 22, null, 33.33, B, 33.33, null, [33.33, null]]
  47. //删除元素
  48. //删除掉找到的第一个元素
  49. //参数传对象 删除这个对象 返回 Boolean
  50. //参数传下标 删除下标位置对象 返回被删除的对象
  51. list.add("A");
  52. System.out.println(list);//[A, 44, 22, null, 33.33, B, 33.33, null, [33.33, null], A]
  53. list.remove("A");
  54. System.out.println(list);//[44, 22, null, 33.33, B, 33.33, null, [33.33, null], A]
  55. //按下标删
  56. list.remove(2);
  57. System.out.println(list);//[44, 22, 33.33, B, 33.33, null, [33.33, null], A]
  58. //remove传入数字就是默认删除下标 加(Integer)
  59. list.remove((Integer)22);
  60. System.out.println(list);//[44, 33.33, B, 33.33, null, [33.33, null], A]
  61. bool=list.remove((Integer)22);
  62. System.out.println(bool);//true
  63. bool=list.remove((Integer)222);
  64. System.out.println(bool);//false
  65. // obj=list.remove("A");
  66. for (int i = 0; i <list.size() ; i++) {
  67. System.out.println(list.get(i));
  68. }
  69. for (Object item:list){
  70. System.out.println(item);
  71. }
  72. Iterator it=list.iterator();//获取了一个迭代器 知道下一个元素是谁,并且有没有下一个元素
  73. while(it.hasNext()){
  74. System.out.println(it.next());
  75. }
  76. //ArrayList 扩容方式
  77. //初始容量 10
  78. //扩容 1.5倍(右移一位,向下取整)
  79. for (Object item:list){
  80. if (item instanceof Double){
  81. if ((Double)item==33.33){
  82. item=44.44;
  83. System.out.println(item);
  84. }
  85. }
  86. }
  87. /* Object item;
  88. if (item instanceof List){
  89. List objs=(List) item;
  90. objs.set(1,"ABC");
  91. }
  92. */
  93. //LinkedList 链表
  94. //ArrayList和LinkedList性能比较
  95. //ArrayList是通过数组存储数据的,查找数据非常快
  96. //LinkedList查找速度慢,通过双向检索,优化检索速度
  97. //ArrayList插入和删除慢
  98. //LinkedList插入删除快
  99. }
  100. }

2.内部类

可以将一个类的定义放在另一个类的内部,这就是内部类。我们一般将内部类分为四种:成员内部类、静态内部类、局部(方法内部类)、匿名内部类。

成员内部类总结:

内部类可以是任何的访问修饰符。
由于成员内部类看起来像是外部类的一个成员,所以可以像类的成员一样拥有多种权限修饰符。
内部类的内部不能有静态信息。
内部类也是类,该继承的继承、该重写的重写、该重载的重载,this和super随便用。
外部类访问内部类的信息,必须先实例化内部类,然后 . 访问。
内部类可以直接使用外部类的任何信息,如果属性或者方法发生冲突(重名),使用Outer.this.成员
其他类访问内部类:
成员内部类是依附外部类而存在的,也就是说,如果要创建成员内部类的对象,前提是必须存在外部类的对象。

静态内部类总结:

静态内部类可以包含任意的信息,可以被任意访问权限修饰符修饰。
静态内部类的方法只能访问外部类的static关联的成员。
静态内部类可以独立存在,不依赖于其他外围类。
其他类访问内部类的静态信息,直接 Outer.Inner.static成员信息 就可以了。
其他类实例化内部类 Outer.Inner instance = new Outer.Inner();,然后 instance. 成员信息(属性、方法)即可。

局部内部类,定义在方法中,只能在方法中调用
不能用public,protected,private修饰,static也不行 

 内部类代码:

  1. package com.easy719;
  2. public class EasyInnerClass {
  3. public static void main(String[] args) {
  4. test();
  5. }
  6. //静态内部类
  7. public static class InnerA{
  8. }
  9. //成员(对象)内部类
  10. class InnerB{
  11. }
  12. //局部内部类,定义在方法中,只能在方法中调用
  13. //不能用public,protected,private修饰,static也不行
  14. public void inner(){
  15. class InnerC{
  16. }
  17. new InnerC();
  18. }
  19. public static void test(){
  20. InnerA a=new InnerA();
  21. new EasyInnerClass().new InnerB();
  22. //匿名内部类对象
  23. AbstractClass ac =new AbstractClass(){
  24. public void method(){}
  25. };
  26. AbstractClass aca =new AbstractClass(){
  27. public void method(){}
  28. };
  29. System.out.println(ac.getClass());
  30. System.out.println(ac.getClass()==aca.getClass());//false,两个对象不是同一个内部类,对象也不是同一个
  31. EasyInter ei=new EasyInter() {
  32. @Override
  33. public void method() {
  34. }
  35. };
  36. //lambda表达式
  37. EasyInter eia=()->{int aa=12;
  38. System.out.println("----------");};
  39. EasyInterA ea=()->12;
  40. //使用EasyInnerClass类中的fun方法代替EasyInter中未实现的方法
  41. EasyInter ee=EasyInnerClass::fun;
  42. ee.method();//function
  43. }
  44. public static void fun(){
  45. System.out.println("function");
  46. }
  47. }
  48. @FunctionalInterface
  49. interface EasyInter{
  50. void method();
  51. }
  52. @FunctionalInterface
  53. interface EasyInterA{
  54. int method();
  55. }
  56. abstract class AbstractClass{
  57. public abstract void method();
  58. }
  59. class Test{
  60. public static void method(){
  61. EasyInnerClass.InnerA a=new EasyInnerClass.InnerA();
  62. }
  63. }

3.块

代码块:又称为初始化块,属于类中的成员【即是类的一部分】,类似于方法,将逻辑语句封装在方法体中,用 {} 包围起来。

(1)相当于另外一种形式的构造器(是对构造器的补充机制),可以做初始化操作;
(2)使用场景,如果多个构造器中都有重复的语句,可以抽取到代码块中,提高代码的复用性,相当于对构造器的重载;
(3)代码块调用的顺序优先于构造器。

1. 类什么时候被加载

(1)创建类的对象实例时(new),类会被加载。
(2)存在继承关系,当创建子类对象实例时,其所有上级父类也会被加载;并且父类先被加载,越上级的父类,越先被加载。
(3)当使用类的静态成员时(静态属性,静态方法),类会被加载。
(4)注意,类的加载是在内存的方法区中。

2. 什么是代码块

(1)static 关键字修饰的代码块也叫静态代码块,它的作用就是对类进行初始化;它伴随着类的加载而执行,并且只会执行一次。
(2)没有关键字修饰的代码块也叫普通代码块,它相当于是构造器的补充机制;每当我们创建一个类的对象时,普通代码块就会被调用一次;如果只是直接使用类的静态成员,没有创建对象,它不会被调用;注意,普通代码块的调用与类的加载没有关系。

代码:

  1. package com.easy719;
  2. public class EasyBlock {
  3. static {
  4. //静态代码块 一个类的静态代码块在程序运行期间只会执行一次
  5. //加载类对象时执行
  6. System.out.println("父类---静态代码块");
  7. }
  8. {
  9. //成员代码块 每一次new对象的时候执行
  10. //成员代码块在构造方法之前运行
  11. System.out.println("父类---成员代码块");
  12. }
  13. EasyBlock(){
  14. System.out.println("父类---构造方法");
  15. }
  16. EasyBlock(int num){
  17. System.out.println("父类---带参数的构造方法");
  18. }
  19. public static void main(String[] args) {
  20. new EasySon();
  21. /*父类---静态代码块
  22. 子类---静态代码块
  23. 父类---成员代码块
  24. 父类---构造方法
  25. 子类---成员代码块
  26. 子类---构造方法*/
  27. }
  28. }
  29. class EasySon extends EasyBlock {
  30. static {
  31. //静态代码块 一个类的静态代码块在程序运行期间只会执行一次
  32. //加载类对象时执行
  33. System.out.println("子类---静态代码块");
  34. }
  35. {
  36. //成员代码块 每一次new对象的时候执行
  37. //成员代码块在构造方法之前运行
  38. System.out.println("子类---成员代码块");
  39. }
  40. EasySon(){
  41. System.out.println("子类---构造方法");
  42. }
  43. EasySon(int num){
  44. System.out.println("子类---带参数的构造方法");
  45. }
  46. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/天景科技苑/article/detail/907316
推荐阅读
相关标签
  

闽ICP备14008679号