泛型
对java的泛型特性的了解仅限于表面的浅浅一层,直到在学习设计模式时发现有不了解的用法,才想起详细的记录一下。
本文参考java 泛型详解、Java中的泛型方法、 java泛型详解
1. 概述泛型在java中有很重要的地位,在面向对象编程及各种设计模式中有非常广泛的应用。
什么是泛型?为什么要使用泛型?
泛型,即“参数化类型”。一提到参数,最熟悉的就是定义方法时有形参,然后调用此方法时传递实参。那么参数化类型怎么理解呢?顾名思义,就是将类型由原来的具体的类型参数化,类似于方法中的变量参数,此时类型也定义成参数形式(可以称之为类型形参),然后在使用/调用时传入具体的类型(类型实参)。
泛型的本质是为了参数化类型(在不创建新的类型的情况下,通过泛型指定的不同类型来控制形参具体限制的类型)。也就是说在泛型使用过程中,操作的数据类型被指定为一个参数,这种参数类型可以用在类、接口和方法中,分别被称为泛型类、泛型接口、泛型方法。
2. 一个栗子一个被举了无数次的例子:
12345678List arrayList = new ArrayList();arrayList.add(& ...
Stream流
Stream流
笔记出自自学视频:05.Lambda练习一_哔哩哔哩_bilibili
Java8的Stream使用的是函数式编程模式,他可以用来对集合或数组进行链状流式的操作。
常用操作创建流
单列集合:集合对象.stream()
12List<Integer> list = new ArrayList<>();list.stream();
数组:Arraysstream(数组)或者用Stream.of来创建
123Integer[] arr = {1,2,3,4,5};Stream<Integer> stream = Arrays.stream(arr);Stream<Integer> stream2 = Stream.of(arr);
双列集合:转换成单列集合后再创建
12Map<String,Integer> map = new HashMap<>();Stream<Map.Entry<String,Integer>> stream = map.en ...
JVM
Java虚拟机jvm 体系1234定义:jvm是一台运行java字节码文件的虚拟计算机,拥有独立的运行机制,其字节码也未必由java编译而来jvm虚拟机特点:jvm 只认编译好的字节码文件,并不只是与java 绑定,因此其他语言编译结果 只要满足并包含jvm的内部的指令集、符号集、以及其他辅助信息,就可以被jvm识别并装载运行
好处: 一次编写,到处运行。 自动内存管理,垃圾回收功能。 数组下标越界检查。 多态
我们需要格外注意的是 .class->机器码 这一步。在这一步 JVM 类加载器首先加载字节码文件,然后通过解释器逐行解释执行,这种方式的执行速度会相对比较慢。而且,有些方法和代码块是经常需要被调用的(也就是所谓的热点代码),所以后面引进了 JIT 编译器,而 JIT 属于运行时编译。当 JIT 编译器完成第一次编译后,其会将字节码对应的机器码保存下来,下次可以直接使用。而我们知道,机器码的运行效率肯定是高于 Java 解释器的。这也解释了我们为什么经常会说 Java 是编译与解释共存的语言。
(48条消息) 为什么说Java是编译与解释共存的语言_java 是编译 ...
JUC
JUC进程概述进程:程序是静止的,进程实体的运行过程就是进程,是系统进行资源分配的基本单位
进程的特征:并发性、异步性、动态性、独立性、结构性
线程:线程是属于进程的,是一个基本的 CPU 执行单元,是程序执行流的最小单元。线程是进程中的一个实体,是系统独立调度的基本单位,线程本身不拥有系统资源,只拥有一点在运行中必不可少的资源,与同属一个进程的其他线程共享进程所拥有的全部资源
关系:一个进程可以包含多个线程,这就是多线程,比如看视频是进程,图画、声音、广告等就是多个线程
线程的作用:使多道程序更好的并发执行,提高资源利用率和系统吞吐量,增强操作系统的并发性能
并发并行:
并行:在同一时刻,有多个指令在多个 CPU 上同时执行
并发:在同一时刻,有多个指令在单个 CPU 上交替执行
同步异步:
需要等待结果返回,才能继续运行就是同步
不需要等待结果返回,就能继续运行就是异步
参考视频:https://www.bilibili.com/video/BV16J411h7Rd
单核CPU下,为微观串行,宏观并行。
笔记的整体结构依据视频编写,并随着学习的深入补充了很多知识
对比线程 ...
Java基础知识
关于final
非final的成员变量在堆中,final类型的变量存放在方法区的常量池中。
参考链接:http://t.csdn.cn/9Jo1D
常量池:通常 指的是运行时常量池,它是方法区的一部分,一个jvm实例只有一个运行常量池,==各个线程之间共享运行常量池。==
hashCode()与equals()
http://t.csdn.cn/njLfn
http://t.csdn.cn/6Pqvx
如果两个对象equals()方法相等则它们的hashCode返回值一定要相同,如果两个对象的hashCode返回值相同,但它们的equals()方法不一定相等。
两个对象的hashCode()返回值相等不能判断这两个对象是相等的,但两个对象的hashcode()返回值不相等则可以判定两个对象一定不相等。
值传递==Java语言的方法调用只支持值传递。==当一个对象被当做参数传递到一个方法之后,此方法可以改变这个对象的属性,并返回变化后的结果。那么这里使用的是值传递还是引用传递。
这里采用的是值传递。
...
Java Comparator
Java Comparator
原文:(130条消息) 【Java 8 新特性】Java Comparator | 比较器_猫巳的博客-CSDN博客_javacomparator
比较器的功能方法:Compare(T o1,T o2)compare是比较器接口的功能方法。
1int compare(T o1,T o2)
使用Lambda表达式定义compare123Comparator<Student> ageComp = (s1, s2) -> s1.getAge() - s2.getAge();Comparator<Student> nameComp = (s1, s2) -> s1.getName().compareTo(s2.getName());
实例:
123Comparator<Student> ageComp = (s1, s2) -> s1.getAge() - s2.getAge(); list.sort(ageComp); list.forEach(s -> System.out.println( ...
组件
活动:AppcompaActivity相对于Activity的主要的两点变化;1:主界面带有toolbar的标题栏;
2,theme主题只能用androidtheme=”@stylelAppTheme (appTheme主题或者其子类),而不能用android:style。否则会提示错误:Caused by. java.lang.llegalStateException:You need to use a Theme.AppCompat theme (or descendant) with thisactivity.
创建的活动类必须在AndroidMainfest中进行注册。
隐藏标题栏的方法:
继承AppCompatActivity if(getSupportActionBar() != null) { getSupportActionBar().hide(); }
继承Activity requestWindowFeature(Window.FEATURE_NO_TITLE);
ToastToast是Android系统提供的一种非常好的提醒方式, ...
Android 持久化技术
数据持久化Android持久化方式主要有三种:文件存储、SharePreference存储以及数据库存储。
文件储存比较适合存储一些简单的文本数据以及二进制数据。
12345678910111213141516171819202122232425 @Override protected void onDestroy() { super.onDestroy(); String data = editText.getText().toString(); FileOutputStream out = null; BufferedWriter writer = null; try { //MODE_APPEND是往文件里附加数据,MODE_PRIVATE是覆盖之前的数据 out = openFileOutput("mydata", Context.MODE_APPEND); writer = new Buff ...
Android UI
按钮按钮的监听事件:
可以使用匿名类的方式实现。
可以直接实现OnClickListener接口,之后实现onClick方法实现。
12345678910111213141516171819public class MainActivity extends BaseActivity implements View.OnClickListener { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button button = findViewById(R.id.button_1); button.setOnClickListener(this); } @Override public void onClick(View v) { ...