这篇文章主要介绍Android Gradle依赖管理、去除重复依赖、忽略的方式有哪些,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Android是什么Android是一种基于Linux内核的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑,由美国Google公司和开放手机联盟领导及开发。常用依赖 //1.直接依赖第三方开源库,一般是托管在 jitpack 或者 jcenter implementation 'com.google.code.gson:gson:2.2.4' implementation 'com.android.support:cardview-v7:25.0.0' implementation 'com.android.support:design:25.0.0' //2.直接依赖本地的aar文件,一般是在libs目录下 implementation(name: 'LiteAVSDK_Professional_5.1.5293', ext: 'aar') //3.直接依赖本地的jar文件 implementation files('libs/bdasr_V3_20170801_60da871.jar') //4.依赖本地的model implementation project(':wavelibrary') implementation project(':android-ffmpeg')库工程依赖传递问题1、依赖常用的基本类型有:provided和compile,provided 只在编译生效不会打包到 apk 或 aar 中;compile 是会打包到 apk或 aar 中的(如果是库工程的话有特殊情况,参考下面3).2、app 工程的当前(compile+) 的依赖都会打包到 app 中3、库工程中:1) jar 包:远程依赖不会打包到 aar 中;本地依赖会;2) aar:远程和本地都不不会打包到 aar中.3) 如果你要提供你的库工程的 aar 给他人,你需要同时告诉他这个库工程依赖的其他aar 和远程 jar包(因为他们没有打包到 aar 中)4) 如果通过工程依赖(即compile project(':lib')的方式), 依赖是可以传递的,所以不需要在声明一次依赖.去掉重复依赖1.第三方库中同样使用了implementation或者compile依赖相同的库 implementation('com.allenliu.versionchecklib:library:2.0.5') { exclude group: 'com.android.support', module: 'appcompat-v7' exclude group: 'com.android.support.constraint', module: 'constraint-layout' exclude group: 'org.greenrobot', module: 'eventbus' exclude group: 'com.squareup.okhttp3', module: 'okhttp' }2.在不同的库中出现相同的so文件pickFirst只会打包第一个遇到的冲突的so,merge(碰到冲突会合并)和exclude(直接排除匹配到的文件,不建议使用) packagingOptions { pickFirst 'lib/arm64-v8a/libgnustl_shared.so' pickFirst 'lib/armeabi-v7a/libgnustl_shared.so' }遇到这种错误可以通过上面方法尝试解决Error:Execution failed for task ‘:app:transformNativeLibsWithMergeJniLibsForDebug'. > More than one补充知识:Gradle依赖的统一管理,解决依赖冲突看见别人在用implementation rootProject.ext.dependencies["xxxx"]不知道是什么意思,上网查了一下,原来是为了解决或者说预防gradle依赖冲突的问题。在项目开发中我们会经常引入多个Module,然而每个Module中又包含了V4、V7,为了升级新版本依赖包只用更改一次,我们决定采用Gradle依赖的统一管理,避免重复繁琐的劳动。记录get到的新知识,用法如下:1.在Project目录下新建config.gradle文件,文件名可自定义具体内容如下:ext { android = [ compileSdkVersion : 27, buildToolsVersion : "27.0.0", minSdkVersion : 21, targetSdkVersion : 27, versionCode : 6, versionName : "1.2.2", renderscriptTargetApi : 21 ] version = [ supportLibraryVersion : "26.1.1", okhttpVersion : "3.9.0", retrofitVersion : "2.3.0", glideVersion : "4.0.0", butterknifeVersion : "8.8.1", fragmentationVersion : "1.1.9", ] dependencies = [ //base "appcompat-v7" : "com.android.support:appcompat-v7:${version["supportLibraryVersion"]}", "cardview-v7" : "com.android.support:cardview-v7:${version["supportLibraryVersion"]}", "design" : "com.android.support:design:${version["supportLibraryVersion"]}", "constraint-layout" : "com.android.support.constraint:constraint-layout:1.0.2", //net "gson" : "com.google.code.gson:gson:2.8.2", "okhttp" : "com.squareup.okhttp3:okhttp:${version["okhttpVersion"]}", "logging-interceptor" : "com.squareup.okhttp3:logging-interceptor:${version["okhttpVersion"]}", "retrofit" : "com.squareup.retrofit2:retrofit:${version["retrofitVersion"]}", "converter-gson" : "com.squareup.retrofit2:converter-gson:${version["retrofitVersion"]}", "adapter-rxjava2" : "com.squareup.retrofit2:adapter-rxjava2:${version["retrofitVersion"]}", //dao "greendao" : "org.greenrobot:greendao:3.2.2", //rx "rxjava" : "io.reactivex.rxjava2:rxjava:2.1.5", "rxandroid" : "io.reactivex.rxjava2:rxandroid:2.0.1", "rxbinding" : "com.jakewharton.rxbinding2:rxbinding:2.1.0", "rxpermissions" : "com.tbruyelle.rxpermissions2:rxpermissions:0.9.5@aar", //di "javax_annotation" : "org.glassfish:javax.annotation:10.0-b28", "butterknife" : "com.jakewharton:butterknife:${version["butterknifeVersion"]}", "butterknife-compiler" : "com.jakewharton:butterknife-compiler:${version["butterknifeVersion"]}", //multidex "multidex" : "com.android.support:multidex:1.0.3", //kotlin "kotlin-stdlib" : "org.jetbrains.kotlin:kotlin-stdlib:1.2.10", //ui test "espresso-core" : "com.android.support.test.espresso:espresso-core:3.0.2", "espresso-idling-resource" : "com.android.support.test.espresso:espresso-idling-resource:3.0.2", //unit test , 为了整合mockito和PowerMockito,mockito暂时最高只支持2.8.9 "junit" : "junit:junit:4.12", "mockito" : "org.mockito:mockito-core:2.8.9", "powermock-module-junit4" : "org.powermock:powermock-module-junit4:1.7.4" ] }2.在Project的build.gradle中添加apply from: "config.gradle"3.在modle的build.gradle中添加引用apply plugin: 'com.android.application'android { compileSdkVersion rootProject.ext.android["compileSdkVersion"] buildToolsVersion rootProject.ext.android["buildToolsVersion"] defaultConfig { applicationId "json.chao.com.wanandroid" minSdkVersion rootProject.ext.android["minSdkVersion"] targetSdkVersion rootProject.ext.android["targetSdkVersion"] versionCode rootProject.ext.android["versionCode"] versionName rootProject.ext.android["versionName"] //AndroidJunitRunner必须要显示指定在defaultConfig中,使用Gradle依赖管理无法使其生效 testInstrumentationRunner 'android.support.test.runner.AndroidJUnitRunner' renderscriptTargetApi rootProject.ext.android["renderscriptTargetApi"] renderscriptSupportModeEnabled true // Enable RS support multiDexEnabled true vectorDrawables.useSupportLibrary = true } } dependencies { implementation fileTree(include: ['*.jar'], dir: 'libs') //base implementation rootProject.ext.dependencies["appcompat-v7"] implementation rootProject.ext.dependencies["cardview-v7"] implementation rootProject.ext.dependencies["design"] implementation rootProject.ext.dependencies["constraint-layout"] //net implementation rootProject.ext.dependencies["gson"] implementation rootProject.ext.dependencies["okhttp"] implementation rootProject.ext.dependencies["retrofit"] implementation rootProject.ext.dependencies["converter-gson"] implementation rootProject.ext.dependencies["adapter-rxjava2"] //dao implementation rootProject.ext.dependencies["greendao"] //rx implementation rootProject.ext.dependencies["rxjava"] implementation rootProject.ext.dependencies["rxandroid"] implementation rootProject.ext.dependencies["rxbinding"] implementation rootProject.ext.dependencies["rxpermissions"] //UI测试 androidTestImplementation (rootProject.ext.dependencies["espresso-core"]) { exclude group: 'com.android.support', module: 'support-annotations' } implementation (rootProject.ext.dependencies["espresso-idling-resource"]) { exclude module: 'support-annotations' } }以上是“Android Gradle依赖管理、去除重复依赖、忽略的方式有哪些”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注辰讯云资讯频道!...
小编给大家分享一下Linux如何使用ss命令查看系统的socket状态,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!什么是Linux系统Linux是一种免费使用和自由传播的类UNIX操作系统,是一个基于POSIX的多用户、多任务、支持多线程和多CPU的操作系统,使用Linux能运行主要的Unix工具软件、应用程序和网络协议。 Linux系统中,ss命令可用于查看系统的socket的状态,而socket作为系统的进程通信机制,了解其状态是很有必要的,下面小编就给大家介绍下Linux如何使用ss命令查看socket的状态。 ss是Socket Statistics的缩写。顾名思义,ss命令可以用来获取socket统计信息,它可以显示和netstat类似的内容。但ss的优势在于它能够显示更多更详细的有关TCP和连接状态的信息,而且比netstat更快速更高效。当服务器的socket连接数量变得非常大时,无论是使用netstat命令还是直接cat /proc/net/tcp,执行速度都会很慢。可能你不会有切身的感受,但请相信我,当服务器维持的连接达到上万个的时候,使用netstat等于浪费 生命,而用ss才是节省时间。天下武功唯快不破。ss快的秘诀在于,它利用到了TCP协议栈中tcp_diag。tcp_diag是一个用于分析统计的模块,可以获得Linux 内核中第一手的信息,这就确保了ss的快捷高效。当然,如果你的系统中没有tcp_diag,ss也可以正常运行,只是效率会变得稍慢。(但仍然比 netstat要快。) 1.命令格式: ss [参数] ss [参数] [过滤] 2.命令功能: ss(Socket Statistics的缩写)命令可以用来获取 socket统计信息,此命令输出的结果类似于 netstat输出的内容,但它能显示更多更详细的 TCP连接状态的信息,且比 netstat 更快速高效。它使用了 TCP协议栈中 tcp_diag(是一个用于分析统计的模块),能直接从获得第一手内核信息,这就使得 ss命令快捷高效。在没有 tcp_diag,ss也可以正常运行。 3.命令参数: -h, --help 帮助信息 -V, --version 程序版本信息 -n, --numeric 不解析服务名称 -r, --resolve 解析主机名 -a, --all 显示所有套接字(sockets) -l, --listening 显示监听状态的套接字(sockets) -o, --options 显示计时器信息 -e, --extended 显示详细的套接字(sockets)信息 -m, --memory 显示套接字(socket)的内存使用情况 -p, --processes 显示使用套接字(socket)的进程 -i, --info 显示 TCP内部信息 -s, --summary 显示套接字(socket)使用概况 -4, --ipv4 仅显示IPv4的套接字(sockets) -6, --ipv6 仅显示IPv6的套接字(sockets) -0, --packet 显示 PACKET 套接字(socket) -t, --tcp 仅显示 TCP套接字(sockets) -u, --udp 仅显示 UCP套接字(sockets) -d, --dccp 仅显示 DCCP套接字(sockets) -w, --raw 仅显示 RAW套接字(sockets) -x, --unix 仅显示 Unix套接字(sockets) -f, --family=FAMILY 显示 FAMILY类型的套接字(sockets),FAMILY可选,支持 unix, inet, inet6, link, netlink -A, --query=QUERY, --socket=QUERY QUERY := {all|inet|tcp|udp|raw|unix|packet|netlink}[,QUERY] -D, --diag=FILE 将原始TCP套接字(sockets)信息转储到文件 -F, --filter=FILE 从文件中都去过滤器信息 FILTER := [ state TCP-STATE ] [ EXPRESSION ] 4.使用实例: 实例1:显示TCP连接 命令:ss -t -a 输出: 代码如下: [root@localhost ~]# ss -t -a State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 0 127.0.0.1:smux *:* LISTEN 0 0 *:3690 *:* LISTEN 0 0 *:ssh *:* ESTAB 0 0 192.168.120.204:ssh 10.2.0.68:49368 [root@localhost ~]# 实例2:显示 Sockets 摘要 命令:ss -s 输出: 代码如下: [root@localhost ~]# ss -s Total: 34 (kernel 48) TCP: 4 (estab 1, closed 0, orphaned 0, synrecv 0, timewait 0/0), ports 3《/p》 《p》Transport Total IP IPv6 * 48 - - RAW 0 0 0 UDP 5 5 0 TCP 4 4 0 INET 9 9 0 FRAG 0 0 0 [root@localhost ~]# 说明:列出当前的established, closed, orphaned and waiting TCP sockets 实例3:列出所有打开的网络连接端口 命令:ss -l 输出: 代码如下: [root@localhost ~]# ss -l Recv-Q Send-Q Local Address:Port Peer Address:Port 0 0 127.0.0.1:smux *:* 0 0 *:3690 *:* 0 0 *:ssh *:* [root@localhost ~]# 实例4:查看进程使用的socket 命令:ss -pl 输出: 代码如下: [root@localhost ~]# ss -pl Recv-Q Send-Q Local Address:Port Peer Address:Port 0 0 127.0.0.1:smux *:* users:((“snmpd”,2716,8)) 0 0 *:3690 *:* users:((“svnserve”,3590,3)) 0 0 *:ssh *:* users:((“sshd”,2735,3)) [root@localhost ~]# 实例5:找出打开套接字/端口应用程序 命令:ss -lp | grep 3306 输出: 代码如下: [root@localhost ~]# ss -lp|grep 1935 0 0 *:1935 *:* users:((“fmsedge”,2913,18)) 0 0 127.0.0.1:19350 *:* users:((“fmsedge”,2913,17)) [root@localhost ~]# ss -lp|grep 3306 0 0 *:3306 *:* users:((“mysqld”,2871,10)) [root@localhost ~]# 实例6:显示所有UDP Sockets 命令:ss -u -a 输出: 代码如下: [root@localhost ~]# ss -u -a State Recv-Q Send-Q Local Address:Port Peer Address:Port UNCONN 0 0 127.0.0.1:syslog *:* UNCONN 0 0 *:snmp *:* ESTAB 0 0 192.168.120.203:39641 10.58.119.119:domain [root@localhost ~]# 实例7:显示所有状态为established的SMTP连接 命令:ss -o state established ‘( dport = :smtp or sport = :smtp )’ 输出: 代码如下: [root@localhost ~]# ss -o state established ‘( dport = :smtp or sport = :smtp )’ Recv-Q Send-Q Local Address:Port Peer Address:Port [root@localhost ~]# 实例8:显示所有状态为Established的HTTP连接 命令:ss -o state established ‘( dport = :http or sport = :http )’ 输出: 代码如下: [root@localhost ~]# ss -o state established ‘( dport = :http or sport = :http )’ Recv-Q Send-Q Local Address:Port Peer Address:Port 0 0 75.126.153.214:2164 192.168.10.42:http [root@localhost ~]# 实例9:列举出处于 FIN-WAIT-1状态的源端口为 80或者 443,目标网络为 193.233.7/24所有 tcp套接字 命令:ss -o state fin-wait-1 ‘( sport = :http or sport = :https )’ dst 193.233.7/24 实例10:用TCP 状态过滤Sockets: 命令: 代码如下: ss -4 state FILTER-NAME-HERE ss -6 state FILTER-NAME-HERE 输出: 代码如下: [root@localhost ~]#ss -4 state closing Recv-Q Send-Q Local Address:Port Peer Address:Port 1 11094 75.126.153.214:http 192.168.10.42:4669 说明: FILTER-NAME-HERE 可以代表以下任何一个: 代码如下: established syn-sent syn-recv fin-wait-1 fin-wait-2 time-wait closed close-wait last-ack listen closing all : 所有以上状态 connected : 除了listen and closed的所有状态 synchronized :所有已连接的状态除了syn-sent bucket : 显示状态为maintained as minisockets,如:time-wait和syn-recv. big : 和bucket相反。 实例11:匹配远程地址和端口号 命令: 代码如下: ss dst ADDRESS_PATTERN ss dst 192.168.1.5 ss dst 192.168.119.113:http ss dst 192.168.119.113:smtp ss dst 192.168.119.113:443 输出: 代码如下: [root@localhost ~]# ss dst 192.168.119.113 State Recv-Q Send-Q Local Address:Port Peer Address:Port ESTAB 0 0 192.168.119.103:16014 192.168.119.113:20229 ESTAB 0 0 192.168.119.103:16014 192.168.119.113:61056 ESTAB 0 0 192.168.119.103:16014 192.168.119.113:61623 ESTAB 0 0 192.168.119.103:16014 192.168.119.113:60924 ESTAB 0 0 192.168.119.103:16050 192.168.119.113:43701 ESTAB 0 0 192.168.119.103:16073 192.168.119.113:32930 ESTAB 0 0 192.168.119.103:16073 192.168.119.113:49318 ESTAB 0 0 192.168.119.103:16014 192.168.119.113:3844 [root@localhost ~]# ss dst 192.168.119.113:http State Recv-Q Send-Q Local Address:Port Peer Address:Port [root@localhost ~]# ss dst 192.168.119.113:3844 State Recv-Q Send-Q Local Address:Port Peer Address:Port ESTAB 0 0 192.168.119.103:16014 192.168.119.113:3844 [root@localhost ~]# 实例12:匹配本地地址和端口号 命令: 代码如下: ss src ADDRESS_PATTERN ss src 192.168.119.103 ss src 192.168.119.103:http ss src 192.168.119.103:80 ss src 192.168.119.103:smtp ss src 192.168.119.103:25 输出: 代码如下: [root@localhost ~]# ss src 192.168.119.103:16021 State Recv-Q Send-Q Local Address:Port Peer Address:Port ESTAB 0 0 192.168.119.103:16021 192.168.119.201:63054 ESTAB 0 0 192.168.119.103:16021 192.168.119.201:62894 ESTAB 0 0 192.168.119.103:16021 192.168.119.201:63055 ESTAB 0 0 192.168.119.103:16021 192.168.119.201:2274 ESTAB 0 0 192.168.119.103:16021 192.168.119.201:44784 ESTAB 0 0 192.168.119.103:16021 192.168.119.201:7233 ESTAB 0 0 192.168.119.103:16021 192.168.119.103:58660 ESTAB 0 0 192.168.119.103:16021 192.168.119.201:44822 ESTAB 0 0 192.168.119.103:16021 10.2.1.206:56737 ESTAB 0 0 192.168.119.103:16021 10.2.1.206:57487 ESTAB 0 0 192.168.119.103:16021 10.2.1.206:56736 ESTAB 0 0 192.168.119.103:16021 10.2.1.206:64652 ESTAB 0 0 192.168.119.103:16021 10.2.1.206:56586 ESTAB 0 0 192.168.119.103:16021 10.2.1.206:64653 ESTAB 0 0 192.168.119.103:16021 10.2.1.206:56587 [root@localhost ~]# 实例13:将本地或者远程端口和一个数比较 命令: 代码如下: ss dport OP PORT ss sport OP PORT 输出: 代码如下: [root@localhost ~]# ss sport = :http [root@localhost ~]# ss dport = :http [root@localhost ~]# ss dport \》 :1024 [root@localhost ~]# ss sport \》 :1024 [root@localhost ~]# ss sport \《 :32000 [root@localhost ~]# ss sport eq :22 [root@localhost ~]# ss dport != :22 [root@localhost ~]# ss state connected sport = :http [root@localhost ~]# ss \( sport = :http or sport = :https \) [root@localhost ~]# ss -o state fin-wait-1 \( sport = :http or sport = :https \) dst 192.168.1/24 说明: ss dport OP PORT 远程端口和一个数比较;ss sport OP PORT 本地端口和一个数比较。 OP 可以代表以下任意一个: 《= or le : 小于或等于端口号 》= or ge : 大于或等于端口号 == or eq : 等于端口号 != or ne : 不等于端口号 《 or gt : 小于端口号 》 or lt : 大于端口号 实例14:ss 和 netstat 效率对比 命令: 代码如下: time netstat -at time ss 输出: 代码如下: [root@localhost ~]# time ss real 0m0.739s user 0m0.019s sys 0m0.013s [root@localhost ~]# [root@localhost ~]# time netstat -at real 2m45.907s user 0m0.063s sys 0m0.067s [root@localhost ~]# 说明: 用time 命令分别获取通过netstat和ss命令获取程序和概要占用资源所使用的时间。在服务器连接数比较多的时候,netstat的效率完全没法和ss比。以上是“Linux如何使用ss命令查看系统的socket状态”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注辰讯云资讯频道!...
这篇文章给大家分享的是有关linux如何使用cat命令查看文件的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。什么是Linux系统Linux是一种免费使用和自由传播的类UNIX操作系统,是一个基于POSIX的多用户、多任务、支持多线程和多CPU的操作系统,使用Linux能运行主要的Unix工具软件、应用程序和网络协议。Linux系统中查看文件内容时,可以使用cat命令来查看,但是cat命令一般只适合查看文件内容较少的文件。1、cat命令的语法格式为:cat [参数] [文件]对于一般的查看,可以直接使用cat 文件名的方式,比如说查看yum.conf文件。命令为:cat yum.conf2、如果需要显示文件内容的行数,可以使用参数-n命令为:cat -n yum.conf3、-n参数会对文件的每行内容都编制一个编号,及时是空行。如果需要多个空行算为一个编号,可以使用-s参数命令为:cat -s yum.conf4、如果显示文件内容要求不对空行编号,可以使用命令-b命令为:cat -b yum.conf5、有的时候为了区分每行的结束部分,可以使用命令-E,在每行结束出显示$符号命令为:cat -E yum.conf6、在特殊情况下,需要将TAB字符显示为 ^I符号,可以使用参数-T命令为:cat -T yum.conf7、如果需要查看cat的具体用法,可以使用命令–help显示帮助信息命令为:cat --help或者cat --h8、可以使用参数-version查看版本信息命令为:cat version感谢各位的阅读!关于“linux如何使用cat命令查看文件”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!...
本篇文章给大家分享的是有关利用java怎么编写一个超市管理系统,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。实现功能使用选择结构,循环结构,数组的知识实现一个超市管理系统运行结果:货物清单:添加商品功能:删除商品功能:修改商品:商品货物实体类import java.util.Arrays;public class Goods { private int id; private double price; private String name; public Goods(int id, double price, String name) { this.id = id; this.price = price; this.name = name; } public int getId() { return id; } public void setId(int id) { this.id = id; } public double getPrice() { return price; } public void setPrice(double price) { this.price = price; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Goods() { } //增加商品 public Goods[] add(Goods[]goods,Goods newGood){ goods= Arrays.copyOf(goods,goods.length+1); goods[goods.length-1]=newGood; return goods; } //删除商品 public static Goods[] del(Goods[]goods,int id){ int i=0; while(true){ if(goods[i].getId()==id){ goods[i]=null; return goods; } i++; if(i>=goods.length){ return goods; } } } //添加商品 public static Goods[] change(Goods[]goods,int id,int newId,double newPrice,String newName){ int i=0; while (true){ if(goods[i].getId()==id){ goods[i].setId(newId); goods[i].setPrice(newPrice); goods[i].setName(newName); return goods; } i++; if(i>=goods.length){ return goods; } } } }超市管理系统类import java.util.Scanner;public class marketManager { public static void main(String[] args) { Scanner sc = new Scanner(System.in); Goods g1=new Goods(1000,10,"笔记本"); Goods g2=new Goods(1001,2,"西红柿"); Goods g3=new Goods(1002,5,"辣条"); Goods []goods={g1,g2,g3}; while (true) { System.out.println("========超市管理系统======="); System.out.println("1.货物清单 2.增加商品 3.删除商品 4.修改商品 5.退出"); System.out.println("请输入你要操作的编号:"); int i = sc.nextInt(); switch (i){ case 1: System.out.println("=======商品清单======="); System.out.println("商品编号"+"\t\t"+"商品单价"+"\t\t"+"商品名称"); for (Goods a:goods) { if(a==null){ continue; } System.out.println(a.getId()+"\t\t"+a.getPrice()+"\t\t"+a.getName()); } continue; case 2: System.out.println("你选择的是增加商品的功能"); System.out.println("请输入你要添加的编号:"); int Id = sc.nextInt(); System.out.println("请输入你要添加的商品价格:"); double price = sc.nextDouble(); System.out.println("请输入你要添加的商品名称"); String name = sc.next(); Goods good=new Goods(Id,price,name); goods = good.add(goods, good); System.out.println("添加成功!"); continue; case 3: System.err.println("你选择的是删除商品功能"); System.out.println("请输入你要操作的编号:"); Id = sc.nextInt(); goods=Goods.del(goods,Id); System.out.println("删除成功!"); continue; case 4: System.out.println("你选择的是修改商品功能"); System.out.println("请输入你要操作的编号:"); Id=sc.nextInt(); System.out.println("请输入修改后的编号:"); int newId = sc.nextInt(); System.out.println("请输入修改后的价格:"); double newPrice = sc.nextDouble(); System.out.println("请输入修改后的商品名称:"); String newName=sc.next(); goods=Goods.change(goods,Id,newId,newPrice,newName); continue; case 5: return; } } } }以上就是利用java怎么编写一个超市管理系统,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注辰讯云资讯频道。...
小编给大家分享一下Java基础中注释方法有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!本教程操作环境:windows7系统、java10版,DELL G3电脑。1.单行注释对程序的某一行代码进行解释例://这是一个简单的注释2.多行注释注释的内容可以为多行以/*开头,以*/结尾,表示这区间的代码是注释.例1:/* * 这还是一个 * 多行注释 */3.文档注释:/**注释内容*/对一段代码的解释说明,可以通过javadoc命令将文档注释提取出来生成帮助文档/**这是我们第一次学习javadoc * @author ChenJiaYi * @version jdk11.0 */ /* 单行注释和多行注释的作用: ①对缩写的程序进行解释说明,增强可读性 ②调试所写的代码 */public class DocNote { /* 如下的main方法是程序的入口, main的格式是固定的 */ /**如下的方式是main(),作用:程序的入口 * @param args 输出HelloWorld */ public static void main(String[] args) { //单行注释:如下语句表示输入到控制台 System.out.println("HelloWorld"); } }我们在java中使用注释,是为了方便在大家在能够更容易理解代码,和python中的注释有相同之处。java中的注释有单行注释、多行注释、文档注释三种类型。以上是“Java基础中注释方法有哪些”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注辰讯云资讯频道!...
小编给大家分享一下java如何从键盘输入一个数,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!常用的java框架有哪些1.SpringMVC,Spring Web MVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架。2.Shiro,Apache Shiro是Java的一个安全框架。3.Mybatis,MyBatis 是支持普通 SQL查询,存储过程和高级映射的优秀持久层框架。4.Dubbo,Dubbo是一个分布式服务框架。5.Maven,Maven是个项目管理和构建自动化工具。6.RabbitMQ,RabbitMQ是用Erlang实现的一个高并发高可靠AMQP消息队列服务器。7.Ehcache,EhCache 是一个纯Java的进程内缓存框架。键盘输入可以让用户在程序运行过程中向程序输入数据,达到人机交互的效果,提高用户体验。1、键盘输入过程(1)导包(importjava.util.Scanner)告诉程序这个工具在哪里。(2)创建对象(Scannersc=newScanner(http://System.in)。(3)获取数据(intnum=sc.nextInt();)使用工具。2、实例import java.util.Scanner; public class Test{ public static void main(String[] args){ Scanner sc = new Scanner(http://System.in); System.out.println("请输入您的年龄:"); int age = sc.nextInt(); if(age<18){ System.out.println("毛头小子"); }else{ System.out.println("成年人了"); } } }以上是“java如何从键盘输入一个数”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注辰讯云资讯频道!...
这篇文章给大家分享的是有关JavaScript中jquery框架的写法的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。JavaScript是什么JavaScript是一种直译式的脚本语言,其解释器被称为JavaScript引擎,是浏览器的一部分,JavaScript是被广泛用于客户端的脚本语言,最早是在HTML网页上使用,用来给HTML网页增加动态功能。什么是jQuery?jQuery是一个快速、简洁的JavaScript框架,是继Prototype之后又一个优秀的JavaScript代码库(或JavaScript框架)。利用CSS选择器,来操作DOM对象进行一系列操作,并且具有强大的插件机制。下载http://jquery.com/ 下载jQuery框架特点轻量级框架:占用资源少,运行速度快;免费开源,提供了强大的功能函数;解决浏览器兼容性问题,实现丰富的 UI 和插件;纠正错误的脚本知识。jQuery 添加到网页中<head><script src="Scripts/jquery-1.4.1.js" type="text/javascript"></script></head>感谢各位的阅读!关于“JavaScript中jquery框架的写法”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!...
这篇文章主要介绍deepin系统安装成功后网速很慢怎么办?,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!deepin是基于Linux系统开发的,在网络这方面还是会存在不兼容而导致网速过慢,具体方法如下:1、首选点击启动器,然后打开deepin的终端,终端的位置和mac os系统有些类似,与windows稍微有一些不同。2、打开终端之后,在终端中输入下面的代码:sudo deepin-editor /etc/modprobe.d/iwlwifi.conf3、点击enter运行上述代码,这时候系统会需要我们输入用户密码,输入密码之后点击enter。tips:基于linux的系统在输入密码时是不显示内容的这是个正常现象。4、将“options iwlwifi 11n_disable=1 bt_coex_active=0 power_save=0 swcrypto=1”中的“11n_disable=1”修改为“11n_disable=0”5、然后保存修改后的代码关闭编辑器,重启一下电脑,然后重新体验一下,看一下网速是否得到了提升。6、如果网速没有变化的话也可以将:“options iwlwifi 11n_disable=1 bt_coex_active=0 power_save=0 swcrypto=1”中的“11n_disable=1”修改为“11n_disable=8”以上是“deepin系统安装成功后网速很慢怎么办?”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注辰讯云资讯频道!...
小编给大家分享一下使用vue开发移动端管理后台的注意事项有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Vue的优点Vue具体轻量级框架、简单易学、双向数据绑定、组件化、数据和结构的分离、虚拟DOM、运行速度快等优势,Vue中页面使用的是局部刷新,不用每次跳转页面都要请求所有数据和dom,可以大大提升访问速度和用户体验。1.对于项目的一些心得与体会首先的一点,就是,对于图形界面框架的选型,这个很重要,对于一项目来说,开始动手前就要对项目的设计图有个完整的了解,以便于自己选择插件或者框架;然后就是,对于交互性操作,比如:上传图片,预览图片啥的,应该选择是否是用图形界面框架来实现还是另选专门的插件来实现在完成项目中,我又新学到了上传图片插件vue-core-image-upload,移动端富文本编辑器vue-quill-editor还有个地址的三级联动mt-picker,(是基于mint-ui图形界面框架的)2.rem与px的转换从同事传授中获到的经验,对于rem与px的转换,就是在index.html模板文件中加入下面的脚本,然后就是1rem=100px(这个可能不准确,有更好的方法,各位大佬请在评论中留下,感激不尽)<script type="text/javascript"> document.getElementsByTagName("html")[0].style.fontSize = 100 / 750 * window.screen.width + "px";</script>3.对于上传图片插件vue-core-image-upload中遇到的坑对于跨域问题,有好多方法可以解决,这里讲的挺多的前端跨域解决方法还有就是后台设置响应头access-control-allow-origin可以指定特定的域名,我这里的后台设置的就是access-control-allow-origin:*,就是因为这样,用这个上传图片的插件就会报错Access to XMLHttpRequest at 'https://....' from origin 'http://localhost:8080' has been blocked by CORS policy: The value of the 'Access-Control-Allow-Origin' header in the response must not be the wildcard '*' when the request's credentials mode is 'include'. The credentials mode of requests initiated by the XMLHttpRequest is controlled by the withCredentials attribute.这个问题我蒙圈了好久,和后台也讲了,就是处于蒙圈状态,已经允许跨域了,怎么还报错呢?很烦然后,终于找了个方法解决(有用过其他的上传插件,感觉不好用,代码或者思路好乱)其实这个插件中的文档也有提示,只是刚用,还不是很会就是在使用这个插件的代码中加上这个字段就可以了<vue-core-image-upload class="btn btn-primary" :crop="false" input-of-file="file" @imageuploaded="loadMainImg" :max-file-size="5242880" :url="serverUrl" :credentials="false" //允许携带cookie></vue-core-image-upload>对于附带身份凭证的请求,服务器不得设置 Access-Control-Allow-Origin 的值为“”。这是因为请求的首部中携带了 Cookie 信息,如果 Access-Control-Allow-Origin 的值为“”,请求将会失败。也就是说Access-Control-Allow-Credentials设置为true的情况下Access-Control-Allow-Origin不能设置为*4.基于mint-ui的三级地址选择效果图template文件<div class="modal" @click="handleCloseAddress"> <div class="cateContainer" @click.stop> <div class="operateBtn"> <div class="cancelBtn" @click="handleCloseAddress">取消</div> <div class="confirmBtn" @click="handleCloseAddress">确定</div> </div> <mt-picker class="addressPicker" :slots="myAddressSlots" @change="onAddressChange"></mt-picker> </div></div>js文件json文件地址地址文件// 定义一个包含中国省市区信息的json文件import addressJson from '@/assets/common/address'export default { data() { return { myAddressSlots: [ { flex: 1, values: Object.keys(addressJson), className: 'slot1', textAlign: 'center' }, { divider: true, content: '-', className: 'slot2' }, { flex: 1, values: ['市辖区'], className: 'slot3', textAlign: 'center' }, { divider: true, content: '-', className: 'slot4' }, { flex: 1, values: ['东城区'], className: 'slot5', textAlign: 'center' } ], province:'省', city:'市', county:'区/县', } }, methods: { onAddressChange(picker, values) { if(addressJson[values[0]]) { picker.setSlotValues(1, Object.keys(addressJson[values[0]])); picker.setSlotValues(2, addressJson[values[0]][values[1]]); this.province = values[0]; this.city = values[1]; this.county = values[2]; } }, } }5.关于对是否登录的处理开始也有做过登录的管理后台,不过,在进行登录时,总会一闪过登录的界面,这种感觉很不好,在这里记录下相比之前更好点的方法在main.js文件中添加对router的钩子函数router.beforeEach((to, from, next) => { let token = localStorage.getItem('token'); if (!token && to.path !== '/login') { next('/login'); } else { next(); } });通过判断缓存里是否有token来进行路由的跳转相对于之前的那种方法,这里对路由的跳转进行的拦截,在路由进行跳转前,进行判断6.上拉加载mescroll.js插件这里对于分页加载第二页使用的上拉加载的插件还是用了原来的插件,还是感觉挺好用的这里有讲述上拉加载,下拉刷新,滚动无限加载7.移动端富文本插件Vue-Quill-Editor效果图这里有相关案例代码vue-quill-editor<template> <quill-editor v-model="richTextContent" ref="myQuillEditor" :options="editorOption" @change="onEditorChange($event)"> </quill-editor></template><script> import { quillEditor } from "vue-quill-editor"; import 'quill/dist/quill.core.css'; import 'quill/dist/quill.snow.css'; import 'quill/dist/quill.bubble.css'; export default{ data() { return {} }, methods: { onEditorChange(e) {} } }</script>响应事件onEditorChange(e){ console.log(e) this.richTextContent = e.html; },8.移动端图片预览插件vue-picture-preview<img :src="url" v-preview="url" preview-nav-enable="false" />需要在app.vue中加入如下代码<lg-preview></lg-preview>效果图以上是“使用vue开发移动端管理后台的注意事项有哪些”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注辰讯云资讯频道!...
这篇文章将为大家详细讲解有关java中Count怎么计算流中的元素,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Java可以用来干什么Java主要应用于:1. web开发;2. Android开发;3. 客户端开发;4. 网页开发;5. 企业级应用开发;6. Java大数据开发;7.游戏开发等。1、说明count是终端操作,可以统计stream流中的元素总数,返回值为long类型。count()返回流中元素的计数。这是归纳的特殊情况(归纳运算采用一系列输入元素,通过重复应用组合运算将其组合成一个总结结果)。这是终端操作,可能会产生结果和副作用。执行终端操作后,管道被视为消耗,无法再利用。2、实例// 验证 list 中 string 是否有以 a 开头的, 匹配到第一个,即返回 trueboolean anyStartsWithA = stringCollection .stream() .anyMatch((s) -> s.startsWith("a")); System.out.println(anyStartsWithA); // true // 验证 list 中 string 是否都是以 a 开头的boolean allStartsWithA = stringCollection .stream() .allMatch((s) -> s.startsWith("a")); System.out.println(allStartsWithA); // false // 验证 list 中 string 是否都不是以 z 开头的,boolean noneStartsWithZ = stringCollection .stream() .noneMatch((s) -> s.startsWith("z")); System.out.println(noneStartsWithZ); // true关于“java中Count怎么计算流中的元素”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。...